淺談資料庫連線
必須澄清,雖然文章是我總結整理的,但是很多知識的確不是我能研究分析得出來,通過聽培訓、看書、實踐所總結得出,一方面為了給自己備用,以便以後出現問題能解決,另一方面也希望遇到相同問題的朋友能從中得到一些啟示。所以文章裡面的知識可能會在很多地方都出現。
我們經常會遇到很多連線問題,同時程式設計師往往也認為連線資料庫只需要簡單地連線→openconnection→操作→close,但是一個簡單的連線動作,背後往往帶有很多東西,充分理解,會對開發及管理有很大的幫助,畢竟連不上伺服器其他一切都是白搭:
首先,從開發層面,要保證資料庫連線的穩定性:
原因一:資料庫連線是很“重”的操作,消耗資源很多
在常見的C/S模式中,簡單的連線操作背後潛藏如下操作:
1、客戶端與遠端伺服器的監聽程式(listenerprogram)建立聯絡。
2、監聽程式要麼建立一個程式或執行緒來執行資料庫核心程式,要麼直接或間接地把客戶請求傳遞給已存在的伺服器程式,取決於伺服器是否共享伺服器。
3、為每個session建立新環境,跟蹤它們的行為。建立前還要做賬號密碼匹配。有可能DBMS還要執行登入觸發器,初始化儲存過程和程式包(如果它們是第一次被呼叫的話)。
4、客戶端程式和伺服器程式之間要完成的握手協議。
正因為如此,連線池技術才尤為重要。
原因二:程式(包括儲存過程)和資料庫之間的互動也要開銷:
即使連線建立但未中斷,程式和DBMS之間的上下文切換也有代價。對此,如果DBMS支援資料通過陣列傳遞,應該毫不猶豫使用它。
一些初級程式設計師(沒有鄙視的意思),會很簡單地在每個插入中連線、斷開資料庫,如果有大量資料(過萬已經會出現問題),就容易耗盡伺服器資源。曾經聽過一名微軟工程師說他們去服務客戶的一個例子,一個手機流水線,但是開到第五條線的時候就卡得不行,實在開不了第六條線。後來發現,是程式設計的時候把迴圈放在連線的外層,每迴圈一次,就要連線、斷開一次。造成嚴重的負載。後來把迴圈放到連線裡面,可以開到上百條生產線。可見連線的重要性。
然後,從資料庫管理層面:
資料庫客戶端應用使用資料庫服務時:
第一步、在SQL Server上建立一個連線。如果雙方都在一臺機器上,就是本地連線。如果不在一臺機器上,就需要通過網路層。
第二步、客戶端需要告知SQL Server自己的身份。然後SQLServer需要認證(Authentication)是否合法,從而賦予預設的授權(Authorization)
以上的工作有客戶端資料驅動程式(ODBC、OLE DB、NativeClient、JDBC等)和SQL Server互動完成,成功以後客戶端使用者才能開始訪問資料。
在連線過程中,如果遇到問題,客戶端驅動程式一定會丟擲錯誤資訊。讓我們找到錯誤的原因:
1、 客戶端驅動沒能找到使用者指定的SQL Server:如
SQL Server doesn’t exist or access denied
雖然說是不存在或者訪問被拒絕,但是其實意味著:指定的SQL Server沒找到
2、 SQL Server已經找到,甚至連線已經建立,但是因為某種未知原因,連線異常中斷:
[DBMSSOCN] General network error. Chack your networkdocumentation.
或者
A transport level error occurred when sending a request(provider:TCP provider error: 0 an existing connection was forcibly closed bythe remote host)
這種錯誤可能發生在連線過程中的任何時候,包括建立初期和客戶端指令執行時,原因有很多,比較難簡單處理。
3、 使用者認證失敗,SQLServer認為連線使用了一個非法使用者而拒絕:
Login failed for user “Null”
“訊息 18456,級別 14,狀態 1,伺服器 <computer_name>,第1行”
“使用者‘<user_name>’ 登入失敗”
4、 認證過程中遇到錯誤,認證動作異常終止
Failed to generate SSPI context
這種錯誤發生在一些原有權力訪問的SQLServer使用者身上。使用者明明有訪問權力。但是在某些機器上,某些時段無法連線。
有時候錯誤會間歇發生甚至會自動消失。
下面來詳細說明一下:
一、協議的選擇與別名:
連線資料庫首先要啟用網路協議,無論是本地連線還是網路連線。
SQL Server可以同時偵聽多種協議處理請求。客戶端(這裡的客戶端是多種的,不是特指前端應用程式)會選擇一個協議連線SQLServer。如果不知道SQLServer正在偵聽哪個協議,可以配置客戶端按順序嘗試連線:
SQLServer目前常用的有3個:Shared Memory、TCP/IP和Named Pipe
Shared Memory:最簡單的協議,沒有特殊配置
由於該協議僅能連到同一臺計算機上執行的SQLServer。索引對應大多數連線是沒有辦法使用的。但可以在除錯其他協議的時候進行故障界定工作,以確保連線問題是和網路層有關,還是和SQLServer自己有關係。同時,它也是最快的協議。
TCP/IP:在Internet上廣泛使用的通用協議
包括路由網路流量的標準,並提供高階安全功能,是商業中最常用的協議。也是SQLServer最常用的網路協議。
Named Pipe:是為區域網開發的協議
記憶體的一部分被某個程式用來向另一個程式傳遞資訊,因此一個程式的輸出就是另一個程式的輸入。第二個程式可以是本地的(與第一程式處於同一臺計算機上),也可以是遠端的(位於聯網的計算機上)。如果你使用過命名管道進行程式設計,會發現它是利用標準的Win32檔案系統API函式(如ReadFile和WriteFile)來進行資料的收發。與系統基層網路傳送協議無關。基本過程如下:
(1)、SQLServer伺服器使用CreateNamedPipe函式建立命名管道並對其進行監聽。
(2)、客戶端使用CreateFile和WriteFile函式試圖連線到伺服器的命名管道。
所以:
1、 命名管道不是一個基層網路協議。即使使用命名管道,也要配置TCP或其他基層網路協議保證客戶端和SQLServer伺服器之間的網路連通性。
2、 命名管道是一個要通過系統認證的協議。
因為它首先訪問伺服器的IPC$共享。這一步必須通過Windows認證。才能連到SQLServer監聽的管道上。這是使用命名管道的最大好處,直接利用Windows內建的安全機制。
應該根據不同要求選擇協議,如果沒有特殊原因,建議先考慮TCP/IP協議。
連線決定使用哪種協議?
首先、由伺服器的網路協議配置控制。如果沒啟用,那麼就沒辦法使用。
其次、客戶端也能設定協議順序。
最後、客戶端可以設定某個SQLServer服務的別名,指定其連線方式,同時客戶端也可對上次成功連線的快取中使用連線方式。
1.1、 伺服器網路配置:
網路配置在SQL Server配置管理器(Configuration Manager)的Network Configuration
配置的結果其實是存放在登錄檔:
HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\MicrosoftSQL Server\MSSQL.X\MSSQLServer\SuperSocketNetLib下的各個專案裡。可以從這裡直接修改(但不建議)。修改需要重啟服務。
重啟後,檢查SQLServer的errorlog進行確認。
Shared Memory 正常啟動後資訊類似如下:
Xxxx-xx-xx xx:xx:xx.xx Server Server local connectionprovider is ready to accept connection on [\\.\pipe\SQLLocal\MSSQLSERVER].
Named Pipe正常啟動後可以看到:
Xxxx-xx-xx xx:xx:xx.xx Server Server named pipe provider isready to accept connection on [\\.\pipe\sql\query].
TCP/IP正常啟動可以看到:
xxxx-xx-xx xx:xx:xx.xx Server Server is listening on [‘any’<ipv4> 1433].—偵聽伺服器上所有IP地址上的1433埠
1.2、 SQL Server Browser的作用:
如果客戶端使用TCP/IP協議連到SQLServer,就必須指定SQLServer正在偵聽的埠。如果使用NamedPipe,就必須指定管道名字。在2000之前,一臺計算機只能裝一個例項。所以SQLServer總之偵聽1433埠,當2000引入多例項是,只有預設例項可以使用這個埠。對於命名例項,每次重啟繫結的埠可能不一樣,而使用者只知道資料庫伺服器名字和例項名,為此,SQLServer產品組開發了一套SQL Server解析協議(SSRP),用於偵聽UDP1434埠。該偵聽器服務由一個SQLServer例項兼任。任何一個客戶端要訪問這臺伺服器上的SQL Server例項時,都會先詢問UDP1434埠,然後由SSRP協議告訴客戶端本臺伺服器上所安裝的SQLServer例項的埠號和管道名字。
但在2003年出現的Slammer病毒導致了這個元件發出大量的網路包,是SQLServer相關的迄今為止危害最大的病毒。所以從SQLServer2005引入了SQL Server Browser服務替代原有機制。
SQL Server Browser使用SSRP偵聽UDP埠,並接受未經身份驗證的請求。為了減少惡意攻擊,SQLServer瀏覽器將設定在低階特權使用者的安全上下文中執行。讓被攻擊的機率降到最低。可以將新建使用者加入SQLServerXXXSQLBrowser$這個本地組。許可權如下:
l 拒絕通過網路訪問該計算機
l 拒絕本地登入
l 拒絕以批處理作業登入
l 拒絕通過“終端服務”登入
l 作為服務登入
l 讀寫與網路通訊(埠和管道)相關的SQL Server登錄檔項。
SQL ServerBrowser啟動後,它會啟動並使用UDP 1434埠。此時會讀取登錄檔,識別計算機上所有SQLServer例項,並註明使用的埠和命名管道。當有多個網路卡時,會啟用第一個遇到的埠。
如果SQL Server Browser服務不執行,而你提供了正確的埠號或命名管道,仍然可以連線SQLServer如果預設例項在1433埠上執行,可以使用TCP/IP連線到預設例項。但是以下連線無效:
l 未完全指定所有引數(例如埠和管道名稱)的情況下,元件嘗試連線到命名例項。
l 生成或傳遞其他元件隨後要用來進行重新連線的伺服器/例項資訊的元件。
l 未提供埠號或管道就連線到命名例項。
l 在未使用TCP 1433埠的情況下,將DAC連線到命名例項或預設例項。
l 列舉SSMS、企業管理器或查詢分析器中的伺服器。
如果應用程式通過網路訪問SQLServer,要停止或禁用SQL Server Browser,必須為每個例項分配一個騰定埠號,然後在應用程式程式碼中指定該埠號。但還有以下問題:
l 必須更新和維護客戶端應用程式程式碼。
l 如果伺服器上的其他服務或應用程式佔用了埠,會導致例項不可用。
如果報告:SQL Server doesn’texist or access denied,可以嘗試指定埠,或管道名字,看能否連上,如果連上,是因為UDP 1434在網路中禁用了。需要防火牆或閘道器開啟埠。要注意SQL Server Browser啟動賬號要有讀寫與網路通訊相關的SQL Server登錄檔項的許可權。如果許可權不夠,不會報錯,也不會返回錯誤資訊。
1.3、 客戶端網路配置:
應用程式都是通過載入SQL Server的資料驅動控制元件做SQL Server連線。目前有三種:
a. MDAC(Microsoft資料訪問元件):
包括ODBC和OLE DB藉口。主要是非.NET的應用服務。預設自帶,但有可能需要更新版本。在命令列中執行:cliconfg.exe就可以配置MDAC訪問元件的網路協議。
可以配置協議及先後順序,還可以餓配置是否使用SSL(網路傳輸加密),是否嘗試使用Shared Memory等。同樣可以通過修改登錄檔得到效果。
b. SQL Server Native Client:
是2005以後引入的用於OLE DB和ODBC的獨立資料訪問API。05自帶9.0版本,08自帶10版本。它將SQL Server OLE DB訪問介面和SQL Server ODBC驅動程式組合成一個本機的DLL。除原有功能外,還提供新功能。用於建立新應用程式或增強現有應用程式,使其能在SQLServer2005中引入新功能。如MARS、UDT、查詢通知、快照隔離和XML資料型別支援。
如果使用C#等語言,且要使用05、08中新功能那麼應當使用SQL Server的.NET Framework資料訪問介面,是VS2005的.NET Framework一部分。為2005、2008提供最強大的資料訪問元件。對於新功能,應該選擇使用SQL Server Native Client。它和MDAC都支援使用行版本控制的已提交讀事務隔離,但使用它支援快照事務隔離。
這個元件預設是不安裝的。可以在安裝時一起安裝,也可以在安裝檔案的sqlncli.msi中單獨安裝。如果安裝了,可以在SQL Server Configuration Manager中看到和配置。
c. Microsoft JDBC Provider:是JAVA專用的。有專門的網路配置介面。
1.4、 客戶端網路連線選擇機制:
(1) SQL Server自己有網路協議配置選項,決定SQL Server偵聽哪些協議。如果沒開啟,則連線請求不會有反應。
(2) 如果有多個例項,每個埠和管道名稱都不一樣。SQLServer Browser通過讀取登錄檔資訊,能夠知道本伺服器上所有例項的網路配置資訊。當客戶端連線時,會先通過UDP1434向SQL Server Browser通訊。這種機制是網路配置可以向客戶端透明。
(3) 客戶端的資料庫連線元件上可以配置候選的網路協議,及候選優先順序。
當有多個協議時,使用順序如下:
1. 在連線字串(Connection String)中指定
a. Server關鍵字:Server=[protocol:]Server[,port]
如指定命名管道:np:Myserver\MyInstance
b. Network關鍵字:Network=dbmssocn
兩種方法只能選其一。
2. 客戶端別名:
如果指定了別名,就會去TPC/IP找別名這臺伺服器,不成功就直接報錯,不會嘗試其他網路協議。
3. 尋找相應資料驅動程式的”LastConnect”登錄檔記錄:
在登錄檔中會維護一組LastConnect記錄,記錄上次連線的網路配置。如果1、2步不成功,將會使用這裡的配置。如果本次不成功,資料驅動程式會改試方法4
4. 按照資料庫驅動程式的網路配置優先順序選擇網路協議,詢問SQL Server Browser動態得知埠號或管道名字。當所有配置都不成功時,連線才報告失敗。
二、連線失敗檢測步驟——命名管道
Windows中,程式間通訊機制有郵槽、管道和套接字等。就管道而言,有命名管道和匿名管道。命名管道通過程式間通訊(IPC)機制實現通訊。進行單向或雙向資料通訊。
SQL Server命名管道工作原理:
首先在伺服器上建立一個命名管道並監聽,然後客戶端連線這個管道進行對話。
1. 命名管道的名稱:
才有UNC格式標識命名管道:\\server\Pipe\path_name
\\server部分:指定命名管道所在的伺服器,多用.來代表正在執行的本地伺服器。
\pipe: 是一個固定的“硬編碼”字串,表明管道協議。
\path_name:管道名稱,可以是多級目錄。一般監聽的有:\sql\query。
例子:
預設例項:\\.\pipe\sql\query
命名例項:\\.\pipe\MSSQL$instancename\sql\query
2. 配置或檢視SQL Server監聽的命名管道:
使用SQL Server Configuration Manager為每個例項配置格子的網路協議:
3. 驗證SQL Server是否監聽了命名管道:
需要檢查errorlog:
客戶端的命名管道配置:
一般不會特殊配置,預設開啟,但建議檢查
1. 客戶端網路實用工具——MDAC資料庫介面:
Cliconfg.exe,如圖,必須保證SQLServer監聽的命名管道名稱和客戶端連線的預設管道名稱是一致的。
2. SQL Server ConfigurationManager——SQL Server Native Client:使用下圖配置
3. 善用客戶端SQL Server別名:
別名是在客戶端配置,不能在伺服器設定一次就可以的。可以使用SQL Server Configuration Manager或者SQLServer客戶端網路實用工具來管理:
命名管道連線問題的解決步驟:
1、 使用【伺服器端網路實用工具】檢查命名管道配置並確認SQL Server已經監聽了命名管道協議。
2、 使用【客戶端網路實用工具】檢查客戶端的連線協議配置,確保啟用了命名管道。客戶端和伺服器的預設管道名稱需要和伺服器監聽的一致。
3、 檢查網路連通性。要能ping通伺服器的IP及伺服器名
4、 檢查客戶端是否能夠通過伺服器的Windows認證:
Net view \\servername
Net use \\servername\IPC$
如果兩條命令出錯,則表明有訪問SQL Server伺服器許可權上的問題。
5、 確保客戶端登入賬號有許可權訪問SQL Server。
一些常見的連線問題:
一、多數是客戶端沒找到命名管道伺服器即SQL Server
[Named Pipes]SQL Server does not exist or access denied.
[Named Pipes]ConnectionOpen(Connect()).
解決方法:
(1)、檢查網路連通性,如ping
(2)、檢查SQLServer伺服器端和客戶端的命名管道配置
二、訪問許可權:
Login failed for user ‘NULL’或Login failed foruser anonymous
表明連通沒問題,只是命名管道訪問伺服器許可權上的問題。不要忘記IPC$共享,沒有許可權訪問IPC$就無法使用命名管道。可以執行:
net use \\servername\IPC$ 來測試
三、訪問許可權2:
Login failed for user ‘User123’
表明該使用者沒用許可權訪問伺服器的資源或者SQLServer。不是連線問題,而是許可權問題
為了避免上面問題:
(1) 建立連線後,如何檢視使用的協議?可以在SSMS中執行:
Net_library說明了協議,如果為LPC,代表使用Shared Memory
(2) 除了使用SSMS之外,另一個就是ODBC資料來源。執行:ODBCAD32.exe。
使用該工具嘗試連線到SQL Server的系統DSN。如果報錯,證明連線有問題。報錯的時候會返回錯誤號,可以使用“net helpmsg 錯誤號”來查詢。
三、連線失敗檢查步驟——TCP/IP
TCP/IP協議有兩個基本東西:IP地址和埠號。
新增TCP/IP時,需要重啟伺服器。
對於埠號,可以在配置工具中點解TCP/IP,然後選擇屬性,可以看到其偵聽的埠號:
只要埠未被其他程式佔用,就可以改變這個埠號。一般高於5000的埠號都可以使用。從1024~5000的埠號經常會被系統和程式佔用,所以不建議取這個範圍。可以從這個連線檢視Windows系統使用的埠號:
http://support.microsoft.com/?id=832017
或者可以使用netstat命令檢視偵聽的埠:netstat –an可以看到系統所有使用中的埠號。
客戶端TCP/IP協議配置:
客戶端預設開啟TCP/IP。也可以使用cliconfg.exe來配置。如果預設例項不是1433,則需要在Default port做相應改變。也可以使用別名指定伺服器的埠。也可以使用動態埠,如圖:
TCP/IP連線問題的解決步驟:
步驟1:驗證SQLServer是否確實監聽了TCP/IP協議:
驗證協議也需要檢視errorlog。如果看到下面一樣,證明已經監聽了TCP/IP
如果發現沒有監聽,可以使用伺服器網路配置工具【svrnetcn.exe】配置。此工具需要下載。
步驟2:驗證伺服器監聽的TCP/IP埠和客戶端配置的預設值或別名中指定的值一致:
除了配置一樣之外,客戶端連線的預設埠需要和SQLServer伺服器監聽的一致。如果有別名,需要仔細檢視其指定的埠是否正確。
步驟3:檢查網路連通性:
要確保不僅ping同SQLServer伺服器的IP地址,也要能ping通sqlserver伺服器的名稱。如果名字ping不同,說明DNS或WINS伺服器配置有問題,可以在HOSTS檔案(system32\drivers\etc下)中手工加入IP地址和伺服器對,如:
169.254.173.244 MySQLServer
步驟4:使用telnet命令檢查SQLServer監聽的埠:
要驗證SQLServer監聽的埠,可以使用telnet命令,假設IP為192.168.1.1,埠為1234,可以使用:telnet192.168.1.1 1234。如果成功,那麼會顯示一個游標在閃的黑色螢幕。如果不成功會返回錯誤資訊。
步驟5:檢查登入使用者的SQLServer訪問許可權:
和命名管道一樣,必須確保客戶端登入賬號有許可權訪問SQL Server。
為了減少配置錯誤,可以使用以下措施:
1、 配置多個靜態埠:
只需使用伺服器網路配置工具在TCP/IP協議屬性中輸入多個逗號分隔的埠號就可以了。雖然監聽多個埠的意義不大,如果認為有網路效能問題,還不如增加網路卡,這樣比提升多埠要好得多。
2、 TCP/IP埠繫結失敗:
如果靜態埠被佔用,會出現以下錯誤資訊:
Server SuperSocket Info: Bind failed on TCP port 1433.
對此,可以指定其他埠,或停用一些服務再重啟SQLServer服務。如果想檢視什麼程式佔用埠,可以使用PortQry.exe(需下載)獲取。使用說明:
http://support.microsoft.com/default.aspx?kbid=310099
例子:protqry –n Myserver –p TCP –e 1433
3、 檢查連線使用的協議:
通過SSMS執行下面語句即可:
4、 如何訪問防火牆後面的SQLServer:
必須配置防火牆以允許從*ANY*(大於1024的埠)到1433的通訊量,及從1433到*ANY*的通訊量。
具體說明可以參考技術文件:
http://support.microsoft.com/?id=287932
5、 在ManagementStudio中指定連線的協議和埠:
可以強制使用TCP/IP連線伺服器指定埠。
6、 其他:
在以上步驟都不成功的時候,使用Network Monitor工具捕捉網路包來分析。它可以獲取一些其他手段找不到的原因。詳細參考:
http://support.microsoft.com/default.aspx?kbid=148942
四、一般性網路錯誤(GeneralNetwork Error)
1、 可能發生在連線生命週期的任何一步:
這個問題和“SQL Server doesn’t exists or access denied”有本質區別,後者是連不到SQLServer服務,但前者是已經找到SQLServer服務,但連線在建立、傳送客戶端查詢指令,或收到SQLServer返回的資料結果集的任何一步發生了異常中斷。此時要檢查錯誤的詳細資訊:
2、 一般只是偶爾發生,或者集中在某個時間段發生,而且很可能會自動消失:
如果時有時無,就需要抓一組Network Monitor的日誌,甚至是Windows的核心跟蹤,總能定位問題。
3、 問題產生的可能原因非常多:
常見原因:
1. 伺服器的負荷:
如果伺服器負荷高,有可能在網路中會發出很多RESET包,在超過重試次數後,客戶端會中斷連線,丟擲GNE。這類問題會影響所有連線,甚至在SQLServer伺服器上的本地連線。
2. 繁忙的應用伺服器沒有使用連線池:
在三層應用結構中,中間層應用伺服器會同時接受大量的資料庫登出登入請求,如果沒有使用連線池,SQLServer需要維護連線的負擔會非常重。可能會有少數連線照顧不過來,容易遇到GNE。如果開啟連線池,負載就能大大降低,問題也就可以解決了。
3. 網路傳輸層問題:
由於資料庫經常要傳輸大量的結果集,網路層比較繁忙。如果兩臺計算機之間的網路有頻繁重傳現象,或者特定型別的網路包被某個網路裝置(閘道器、路由、防火牆等)修改或丟棄,那麼GNE出現機率比較高。這類問題只發生在特定的一組SQLServer伺服器和客戶端之間。同一個SQLServer可能有寫客戶端沒有問題,有些有問題。跨網段或跨子網的客戶端問題比較多。
4. Windows作業系統層面問題:
SQLServer的連線由Windows建立和維護,所以Windows層面的許多行為會影響SQLServer的連線穩定性。當資料庫、網路很繁忙時,Windows為了維護自身安全,會有意拒絕一些網路請求。造成誤殺。
5. 不恰當的系統設定:
有時候會從安全性角度考慮,修改一些系統設定,但是過於嚴厲的話會導致SQLServer連線的不穩定。常見的是TCP設定,在
HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\Tcpip\Parameters下。
SQLServer層的設定也有兩個地方可能引起GNE錯誤,都在sp_configure中:
l Priority boost:SQLServer以高優先順序啟動。一般情況下不推薦設定。
l Lightweight pooling:會使SQLServer切換到纖程模式計劃。會影響SQLServer的執行模式,有時會帶來GNE副作用。由於大部分情況下不會帶來明顯的效能提高,所以不建議使用。
6. 防毒軟體和防火牆:
這些軟硬體有可能導致誤殺現象。
7. 網路裝置:
有些應用會長時間連線資料庫,幾乎從來不登出。如果沒有操作請求,連線會長時間處於空閒狀態。對於這樣的TCP連線,SQLServer會每隔30秒做一次KeepAlive握手。確保連線是否有效。如果客戶端對此沒有反饋,SQLServer會中斷這個連線。當客戶端下次使用時,就會收到GNE。有些網路裝置會在空閒30~40分鐘後直接斷開連線。也會直接導致GNE。
8. 錯誤的網路卡配置:
在叢集伺服器上,至少有兩塊網路卡。如果心跳線也能訪問公共網路,就容易出現GNE。
4、 GNE情況很多,但是還是可以做以下的操作,減緩或者解決:
1. 分析網路拓撲結構,確定網路的可靠性
2. 涉及SQLServer伺服器和客戶端伺服器做全面健康檢查,確認它的工作正常。
l Windows日誌中不可以有明顯的錯誤
l CPU不可以長時間100%
l Windows不可以有系統快取及記憶體方面的問題。
l SQL Server的errorlog裡不可以有明顯的錯誤,重點錯誤是:AV、記憶體、磁碟、17883/17884
l SQLServer不可以發生大範圍、涉及100個以上的連線阻塞問題。
l 檢查sysprocesses系統檢視,不可出現經常有大量連線處於runnable/running狀態。
3. 按照下面方式配置SQLServer伺服器和客戶端伺服器:
(1)、禁用RSS:
找到登錄檔:
HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\Tcpip\Parameters\EnableRSS,將其設為0.
(2)、禁用TaksOffload:
找到登錄檔:
HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\Tcpip\Parameters\DisableTaskOff,將其設為1
(3)、禁用TCP Chimney:
輸入:netsh in tip set chimney DISABLED
(4)、禁用TCPA:
找到登錄檔:
HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\Tcpip\Parameters\EnableTCPA,將其設為0.
(5)、重啟機器使設定生效。
(6)、將所有有關係的機器Windows升級到最新的更新版本。網路裝置firmware升級到最新。
(7)、檢查SQLServer sp_configure裡面priority boost和lightweight pooling是否被改動過。
4. 正確配置網路:
(1)、確認登錄檔:
HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\Tcpip\Parameters下都是預設配置
(2)、再次確認沒有配置網路卡的Teaming。
(3)、在叢集環境裡,確認兩塊網路卡配置正確。
(4)、確認網羅裝置自動關閉Idle連線的功能已經被禁用。
(5)、暫時關閉防毒軟體和防火牆。
(6)、如果可能,儘量將SQLServer伺服器和客戶端伺服器移到物理上比較近、中間網路裝置比較少的網段。修改連線配置,換一種網路協議。
相關文章
- 淺談JDBC和資料庫連線池JDBC資料庫
- 資料庫連線池原理及作用淺談資料庫
- 資料庫連線池淺析資料庫
- 淺談圖資料庫資料庫
- 圖資料庫淺談資料庫
- 雜談---資料庫連線中的藝術資料庫
- 淺談資料庫事務資料庫
- 用Navicat連線資料庫-資料庫連線(MySQL演示)資料庫MySql
- 連線資料庫資料庫
- 資料庫連線資料庫
- 淺談資料庫備份方案資料庫
- 淺談資料庫生命週期資料庫
- 淺談資料庫設計技巧資料庫
- JDBC連線資料庫JDBC資料庫
- java連線資料庫Java資料庫
- Mybatis連線資料庫MyBatis資料庫
- Mongodb資料庫連線MongoDB資料庫
- mysqli連線資料庫MySql資料庫
- 資料庫的連線資料庫
- 連線mysql資料庫MySql資料庫
- 資料庫連線池資料庫
- 資料庫連線==odbc資料庫
- 資料庫連線字串資料庫字串
- jmeter連線資料庫JMeter資料庫
- 連線資料庫-mysql資料庫MySql
- 《四 資料庫連線池原始碼》手寫資料庫連線池資料庫原始碼
- 資料庫連線池-Druid資料庫連線池原始碼解析資料庫UI原始碼
- (轉)PHP連線資料庫之PHP連線MYSQL資料庫程式碼PHP資料庫MySql
- 淺談資料庫的攻擊(轉)資料庫
- 資料來源連線資料庫資料庫
- 從一個資料庫連線數計算公式談起資料庫公式
- [資料庫連線字串] Access 連線字串(轉)資料庫字串
- [資料庫連線字串]Access連線字串(轉)資料庫字串
- 各種連線資料庫的連線字串資料庫字串
- django | 連線mysql資料庫DjangoMySql資料庫
- Rust 連線 PostgreSQL 資料庫RustSQL資料庫
- PHP 連線access資料庫PHP資料庫
- Mybatis配置資料庫連線MyBatis資料庫