SQL Server連接失敗錯誤故障的分析與排除
作者:竇昌陽
在使用 SQL Server 的過程中,用戶遇到最多的問題莫過于連接失敗了。一般而言,有兩種連接SQL Server 的方式,一是利用 SQL Server 自帶的客戶端工具,如企業管理器、查詢分析器、事務探查器等;二是利用用戶自己開發的客戶端程序,如ASP 腳本、VB程序等,客戶端程序中又是利用 ODBC 或者OLE DB等連接 SQL Server。下面,我們將就這兩種連接方式,具體談談如何來解決連接失敗的問題。 一、'SQL Server 不存在或訪問被拒絕'(圖1)'SQL Server 不存在或訪問被拒絕'錯誤,通常是最容易發生的,因為錯誤發生的原因比較多,所以需要檢查的方面也比較多。一般說來,有以下幾種可能性:1、網絡連接問題;2、SQL Server服務器問題;3、服務器端網絡配置問題;4、客戶端網絡配置問題。首先,我們檢查網絡連接:1、ping服務器IP地址。首先先關閉服務器和客戶端的防火墻,這是為了排除防火墻軟件可能會屏蔽對 ping,telnet 等的響應。然后開始ping服務器IP地址,如果 ping服務器IP地址不成功,說明物理連接有問題,這時候要檢查硬件設備,如網卡,HUB,路由器等。2、ping服務器名稱。如果失敗則說明名字解析有問題,這時候要檢查Netbuis協議是否安裝、;DNS 服務是否正常。其次,使用 telnet 命令檢查SQL Server服務器工作狀態。如果命令執行成功,可以看到屏幕一閃之后光標在左上角不停閃動,這說明 SQL Server 服務器工作正常,并且正在監聽1433端口的 TCP/IP 連接;如果命令返回'無法打開連接'的錯誤信息,則說明服務器沒有啟動 SQL Server 服務,也可能服務器端沒啟用 TCP/IP 協議,或者服務器沒有在 SQL Server 默認的端口1433上監聽。最后,我們要檢查服務器、客戶端網絡配置。服務器檢查是否啟用了命名管道;是否啟用了 TCP/IP 協議等等。我們可以利用 SQL Server 自帶的服務器網絡使用工具來進行檢查。單擊:程序-> Microsoft SQL Server 服務器網絡使用工具;打開該工具后,在'常規'中可以看到服務器啟用了哪些協議,默認我們啟用命名管道以及 TCP/IP 協議。點中 TCP/IP 協議,選擇'屬性',我們可以來檢查 SQK Server 服務默認端口的設置。一般而言,我們使用 SQL Server 默認的1433端口。如果選中'隱藏服務器',則意味著客戶端無法通過枚舉服務器來看到這臺服務器,起到了保護的作用,但不影響連接。(圖2)(圖3) 接下來我們要到客戶端檢查客戶端的網絡配置。我們同樣可以利用 SQL Server 自帶的客戶端網絡使用工具來進行檢查,所不同的是這次是在客戶端來運行這個工具。單擊:程序-> Microsoft SQL Server 客戶端網絡使用工具打開該工具后,在'常規'項中,可以看到客戶端啟用了哪些協議。同樣,我們需要啟用命名管道以及 TCP/IP 協議。點擊 TCP/IP 協議,選擇'屬性',可以檢查客戶端默認連接端口的設置,該端口必須與服務器一致。(圖4)通過以上幾個方面的檢查,基本上可以排除第一種錯誤。
二、'無法連接到服務器,用戶xxx登陸失敗' (圖5)該錯誤產生的原因是由于SQL Server使用了'僅 Windows'的身份驗證方式,因此用戶無法使用SQL Server的登錄帳戶(如 sa )進行連接。解決方法如下所示:1、在服務器端使用企業管理器,并且選擇'使用 Windows 身份驗證'連接上 SQL Server;2、展開'SQL Server組',鼠標右鍵點擊SQL Server服務器的名稱,選擇'屬性',再選擇'安全性'選項卡;3、在'身份驗證'下,選擇'SQL Server和 Windows ';4、重新啟動SQL Server服務。在以上解決方法中,如果在第1步中使用'使用 Windows 身份驗證'連接 SQL Server 失敗,那就通過修改注冊表來解決此問題:1、點擊'開始' '運行',輸入regedit,回車進入注冊表編輯器;2、依次展開注冊表項,瀏覽到以下注冊表:[HKEY_LOCAL_MACHINESOFTWAREMicrosoftMSSQLServerMSSQLServer];3、在屏幕右方找到名稱'LoginMode',雙擊編輯雙字節值;4、將原值從1改為2,點擊'確定';5、關閉注冊表編輯器;6、重新啟動SQL Server服務。此時,用戶可以成功地使用sa在企業管理器中新建SQL Server注冊,但是仍然無法使用Windows身份驗證模式來連接SQL Server。這是因為在 SQL Server 中有兩個缺省的登陸戶:BUILTINAdministrators<機器名>Administrator 被刪除。要恢復這兩個帳戶,可以使用以下的方法:1、打開企業管理器,展開服務器組,然后展開服務器;2、展開'安全性',右擊'登錄',然后單擊'新建登錄';3、在'名稱'框中,輸入 BUILTINAdministrators;4、在'服務器角色'選項卡中,選擇'System Administrators' ;5、點擊'確定'退出;6、使用同樣方法添加 <機器名>Administrator 登錄。說明:以下注冊表鍵:HKEY_LOCAL_MACHINESOFTWAREMicrosoftMSSQLServerMSSQLServerLoginMode的值決定了SQL Server將采取何種身份驗證模式。1、表示使用'Windows 身份驗證'模式;2、表示使用混合模式(Windows 身份驗證和 SQL Server 身份驗證)。三、提示連接超時(圖6)如果遇到第三個錯誤,一般而言表示客戶端已經找到了這臺服務器,并且可以進行連接,不過是由于連接的時間大于允許的時間而導致出錯。這種情況比較少見,一般發生在當用戶在Internet上運行企業管理器來注冊另外一臺同樣在Internet上的服務器,并且是慢速連接時,有可能會導致以上的超時錯誤。有些情況下,由于局域網的網絡問題,也會導致這樣的錯誤。要解決這樣的錯誤,可以修改客戶端的連接超時設置。默認情況下,通過企業管理器注冊另外一臺SQL Server的超時設置是 4 秒,而查詢分析器是 15 秒。具體步驟為:企業管理器中的設置:1、在企業管理器中,選擇菜單上的'工具',再選擇'選項';2、在彈出的'SQL Server企業管理器屬性'窗口中,點擊'高級'選項卡;3、在'連接設置'下的'登錄超時(秒)'右邊的框中輸入一個比較大的數字,如 30。查詢分析器中的設置:單擊“工具”->'選項'->'連接'; 將登錄超時設置為一個較大的數字,連接超時改為0。四、應用程序連接失敗以上的三種錯誤信息都是發生在 SQL Server 自帶的客戶端工具中,在應用程序中我們也會遇到類似的錯誤信息,例如: Microsoft OLE DB Provider for SQL Server (0x80004005)[DBNETLIB][ConnectionOpen (Connect()).]Specified SQL server not found.Microsoft OLE DB Provider for SQL Server (0x80004005)用戶 'sa' 登錄失敗。原因: 未與信任 SQL Server 連接相關聯。Microsoft OLE DB Provider for ODBC Drivers 錯誤 '80004005'.[Microsoft][ODBC SQL Server Driver]超時已過期.如果遇到連接超時的錯誤,我們可以在程序中修改 Connection 對象的超時設置,再打開該連接。例如: <%Set Conn = Server.CreateObject('ADODB.Connection')DSNtest='DRIVER={SQL Server};SERVER=ServerName;UID=USER;PWD=password;DATABASE=mydatabase'Conn. Properties('Connect Timeout') = 15 '以秒為單位Conn.open DSNtest%> 如果遇到查詢超時的錯誤,我們可以在程序中修改 Recordset 對象的超時設置,再打開結果集。例如:Dim cn As New ADODB.ConnectionDim rs As ADODB.Recordset. . . cmd1 = txtQuery.TextSet rs = New ADODB.Recordsetrs.Properties('Command Time Out') = 300'同樣以秒為單位,如果設置為 0 表示無限制rs.Open cmd1, cnrs.MoveFirst. . . 五、小結本文針對大部分用戶在使用 SQL Server 過程中常見的連接失敗的錯誤,重點討論了在使用 SQL Server 客戶端工具以及用戶開發的應用程序兩種情況下,如何診斷并解決連接失敗的錯誤。看過本文以后,相信每一個讀者都會對 SQL Server 的連接工作原理、身份驗證方式以及應用程序開發等有一個較為全面而深入的了解。