共用方式為


針對 SQL Server 連線問題進行疑難解答的建議必要條件和檢查清單

適用於:SQL Server
原始 KB 編號: 4009936

若要有效地針對連線問題進行疑難解答,請收集下列資訊:

  • 錯誤訊息的文字和錯誤碼。 檢查錯誤是否間歇性(只發生有時)或一致(一直發生)。

  • 來自 SQL Server 和客戶端系統的應用程式和系統事件記錄檔。 這些記錄有助於檢查您的 SQL Server 上是否有任何整個系統的問題。

  • 如果連線從應用程式失敗,請從應用程式收集 連接字串。 這些字串通常位於 ASP.NET 應用程式的 Web.config 檔案中

  • 收集並檢閱 SQL Server 錯誤記錄,以取得其他錯誤訊息和例外狀況。

  • 如果您有 SQL Server 電腦的系統管理員存取權,請使用下列程式來收集和檢閱目前的電腦設定和服務帳戶:

    1. 下載最新版的 SQLCHECK

    2. 將下載的檔案解壓縮到資料夾,例如 C:\Temp

    3. 以系統管理員身分執行命令提示字元,以收集數據並儲存至檔案。 例如: 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,您可以先檢查下列專案,再進行深入的疑難解答:

  1. 請確定 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."
    
  2. 確認透過IP位址的基本連線,並檢查是否有任何異常狀況: ping -a <SQL Server machine>, ping -a <SQL Server IP address>。 如果您發現任何問題,請與您的網路管理員合作。 或者,您可以在 PowerShell 中使用 Test-NetConnection

    $servername = "DestinationServer"
    Test-NetConnection -ComputerName $servername
    
  3. 檢閱錯誤記錄檔,檢查 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
    
  4. 檢查您是否能夠使用 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")
    
  5. 檢查您是否能夠從其他客戶端系統和不同的使用者登入連線到 SQL Server。 如果能夠,問題可能專屬於發生問題的用戶端或登入。 檢查有問題的用戶端上的 Windows 事件記錄檔,以取得更多指標。 此外,請檢查網路驅動程式是否為最新狀態。

  6. 如果您遇到登入失敗,請確定登入 (伺服器主體) 存在,且其具有 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 + "'")
    
  7. 如果您要針對 Kerberos 相關問題進行疑難解答,您可以使用如何判斷驗證類型是否為 Kerberos 的腳本

常見連線能力問題

當您完成必要條件和檢查清單之後,請參閱 常見的連線問題 ,並選取對應的錯誤訊息,以取得詳細的疑難解答步驟。