針對 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 瀏覽器服務已啟動,或嘗試重新啟動瀏覽器服務。 建立與 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,您可以先檢查下列專案,再進行深入的疑難解答:

  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 連線能力。 或者,您可以使用下列腳本來建立和啟動儲存在 %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")
    
  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 驗證連線到 SQL Server 中的腳本,來判斷您的 SQL Server 上是否已正確設定 Kerberos。

常見連線能力問題

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