針對 SQL Server 連線問題進行疑難解答的建議必要條件和檢查清單
適用於:SQL Server
原始 KB 編號: 4009936
建議的必要條件
若要有效地針對連線問題進行疑難解答,請收集下列資訊:
錯誤訊息的文字和錯誤碼。 檢查錯誤是否間歇性(只發生有時)或一致(一直發生)。
來自 SQL Server 和客戶端系統的應用程式和系統事件記錄檔。 這些記錄有助於檢查您的 SQL Server 上是否有任何整個系統的問題。
如果連線從應用程式失敗,請從應用程式收集 連接字串。 這些字串通常位於 ASP.NET 應用程式的 Web.config 檔案中。
收集並檢閱 SQL Server 錯誤記錄,以取得其他錯誤訊息和例外狀況。
如果您有 SQL Server 電腦的系統管理員存取權,請使用下列程式來收集和檢閱目前的電腦設定和服務帳戶:
下載最新版的 SQLCHECK。
將下載的檔案解壓縮到資料夾,例如 C:\Temp。
以系統管理員身分執行命令提示字元,以收集數據並儲存至檔案。 例如:
SQLCHECK > C:\Temp\server01.SQLCHECK.TXT
。
注意
如果您要針對遠端用戶端的連線問題進行疑難解答,或針對連結的伺服器查詢進行疑難解答,請在所有相關系統上執行 SQLCHECK 工具。
針對連線問題進行疑難解答的快速檢查清單
注意
下列各節可協助您快速檢查連線問題。 如需詳細的疑難解答步驟,請檢閱個別主題。
選項 1
如果您能夠存取 [建議的必要條件] 區段中提及的 SQLCHECK 工具輸出,並檢閱輸出檔 (計算機、用戶端安全性及 SQL Server) 各區段中的資訊,請使用資訊來解決造成問題的問題。 請參閱下列範例:
檔案中的區段 | 要搜尋的文字 | 潛在動作 | 可協助疑難解答(範例) |
---|---|---|---|
計算機資訊 | 警告:網路驅動程式可能已過期 | 在線檢查是否有新的驅動程式。 | 各種連線錯誤 |
用戶端安全性和驅動程序資訊 | 已啟用 Diffie-Hellman 加密套件。 如果客戶端和伺服器之間的演算法版本不同,則間歇性 TLS 失敗的可能風險 | 如果您遇到間歇性連線問題,請參閱 應用程式在連線到 Windows 中的 SQL Server 時,遇到強制關閉的 TLS 連線錯誤。 | 遠端主機已強制關閉一個現存的連線 |
用戶端安全性和驅動程序資訊 | SQL 別名 | 如果存在,請確定別名已正確設定,並指向正確的伺服器和IP位址。 | 建立與 SQL 伺服器的連線時,發生與網路相關的錯誤或是執行個體特有的錯誤 |
SQL Server 資訊 | 感興趣的服務 | 如果您的 SQL 服務未啟動,請加以啟動。 如果您在連線到具名實例時遇到問題,請確定 SQL Server Browser 服務已啟動,或嘗試重新啟動瀏覽器服務。 | 建立與 SQL 伺服器的連線時,發生與網路相關的錯誤或是執行個體特有的錯誤 |
SQL Server 資訊 | 網域服務帳戶屬性 | 如果您從 SQL Server 設定連結的伺服器,且 Del 的 Trust for Del 值設定為 false,則您可能會遇到連結伺服器查詢的驗證問題。 | 針對「使用者登入失敗」錯誤進行疑難解答 |
SQL Server 資訊 | SPN 不存在 | 請檢查此數據表,以查看是否已正確設定 SQL Server 的 SPN,並修正所識別的任何問題。 | 無法產生 SSPI 內容 |
SQL Server 資訊 | SQL Server 實例的詳細數據 | 檢查 [已啟用 TCP] 、[TCP 連接埠] 等的值。 檢閱是否在伺服器端啟用 TCP/IP,以及您的 SQL 預設實例是否在 1433 或不同的埠上接聽。 | 各種連線錯誤 |
選項 2
如果您無法在 SQL Server 計算機上執行 SQLCHECK,您可以先檢查下列專案,再進行深入的疑難解答:
請確定 SQL Server 已啟動,而且您會在 SQL Server 錯誤記錄檔中看到下列訊息:
SQL Server 已準備好與用戶端連接。 此為參考用訊息,使用者不必採取任何動作。
在 PowerShell 中使用下列命令來檢查系統上 SQL Server 服務的狀態:
Get-Service | Where {$_.status -eq 'running' -and $_.DisplayName -match "sql server*"}
使用下列命令來搜尋特定字串的錯誤記錄檔:「SQL Server 現在已準備好進行客戶端連線。 這是一則資訊訊息;不需要進行任何使用者動作。」:
Get-ChildItem -Path "c:\program files\microsoft sql server\mssql*" -Recurse -Include Errorlog |select-string "SQL Server is now ready for client connections."
確認透過IP位址的基本連線,並檢查是否有任何異常狀況:
ping -a <SQL Server machine>, ping -a <SQL Server IP address>
。 如果您發現任何問題,請與您的網路管理員合作。 或者,您可以在 PowerShell 中使用Test-NetConnection
:$servername = "DestinationServer" Test-NetConnection -ComputerName $servername
檢閱錯誤記錄檔,檢查 SQL Server 是否正在接聽適當的通訊協定:
Get-ChildItem -Path "c:\program files\microsoft sql server\mssql*" -Recurse -Include Errorlog |select-string "Server is listening on" , "ready to accept connection on" -AllMatches
檢查您是否能夠使用 UDL 檔案連線到 SQL Server。 如果運作正常,則 連接字串 可能有問題。 如需 UDL 測試程式的指示,請參閱 使用 UDL 檔案測試 SQL Server 的 OLE DB 連線能力。 或者,您可以使用下列腳本來建立並啟動 UDL-Test.udl 檔案(儲存在 %TEMP% 資料夾中):
clear $ServerName = "(local)" $UDL_String = "[oledb]`r`n; Everything after this line is an OLE DB initstring`r`nProvider=MSOLEDBSQL.1;Integrated Security=SSPI;Persist Security Info=False;User ID=`"`";Initial Catalog=`"`";Data Source=" + $ServerName + ";Initial File Name=`"`";Server SPN=`"`";Authentication=`"`";Access Token=`"`"" Set-Content -Path ($env:temp + "\UDL-Test.udl") -Value $UDL_String -Encoding Unicode #open the UDL Invoke-Expression ($env:temp + "\UDL-Test.udl")
檢查您是否能夠從其他客戶端系統和不同的使用者登入連線到 SQL Server。 如果能夠,問題可能專屬於發生問題的用戶端或登入。 檢查有問題的用戶端上的 Windows 事件記錄檔,以取得更多指標。 此外,請檢查網路驅動程式是否為最新狀態。
如果您遇到登入失敗,請確定登入 (伺服器主體) 存在,且其具有
CONNECT SQL
SQL Server 的許可權。 此外,請確定指派給登入的預設資料庫是正確的,而且對應的資料庫主體具有CONNECT
資料庫的許可權。 如需如何將許可權授CONNECT
與資料庫主體的詳細資訊,請參閱 GRANT 資料庫許可權。 如需如何將許可權授CONNECT SQL
與伺服器主體的詳細資訊,請參閱 GRANT 伺服器許可權。 使用下列腳本來協助您識別這些許可權:clear ## replace these variables with the login, user, database and server $server_principal = "CONTOSO\JaneK" $database_principal = "JaneK" $database_name = "mydb" $server_name = "myserver" Write-Host "`n******* Server Principal (login) permissions *******`n`n" sqlcmd -E -S $server_name -Q ("set nocount on; SELECT convert(varchar(32),pr.type_desc) as login_type, convert(varchar(32), pr.name) as login_name, is_disabled, convert(varchar(32), isnull (pe.state_desc, 'No permission statements')) AS state_desc, convert(varchar(32), isnull (pe.permission_name, 'No permission statements')) AS permission_name, convert(varchar(32), default_database_name) as default_db_name FROM sys.server_principals AS pr LEFT OUTER JOIN sys.server_permissions AS pe ON pr.principal_id = pe.grantee_principal_id WHERE is_fixed_role = 0 -- Remove for SQL Server 2008 and name = '" + $server_principal + "'") Write-Host "`n******* Database Principal (user) permissions *******`n`n" sqlcmd -E -S $server_name -d $database_name -Q ("set nocount on; SELECT convert(varchar(32),pr.type_desc) as user_type, convert(varchar(32),pr.name) as user_name, convert(varchar(32), isnull (pe.state_desc, 'No permission statements')) AS state_desc, convert(varchar(32), isnull (pe.permission_name, 'No permission statements')) AS permission_name FROM sys.database_principals AS pr LEFT OUTER JOIN sys.database_permissions AS pe ON pr.principal_id = pe.grantee_principal_id WHERE pr.is_fixed_role = 0 and name = '" + $database_principal + "'") Write-Host "`n******* Server to Database Principal mapping ********`n" sqlcmd -E -S $server_name -d $database_name -Q ("exec sp_helplogins '" + $server_principal + "'")
如果您要針對 Kerberos 相關問題進行疑難解答,您可以使用如何判斷驗證類型是否為 Kerberos 的腳本。
常見連線能力問題
當您完成必要條件和檢查清單之後,請參閱 常見的連線問題 ,並選取對應的錯誤訊息,以取得詳細的疑難解答步驟。