針對 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] 值設定為 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 連線能力。 或者,您可以使用下列腳本來建立和啟動儲存在 %TEMP% 資料夾中的 UDL-Test.udl 檔案 () :
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 中的腳本。
常見連線能力問題
當您完成必要條件和檢查清單時,請參閱 常見的連線問題 ,並選取對應的錯誤訊息以取得詳細的疑難解答步驟。