連線到 SQL Server 時的逾時過期訊息

適用于:SQL Server

注意事項

開始進行疑難排解之前,請先檢查必要條件並逐一瀏覽檢查清單。

逾時錯誤表示特定作業所花費的時間超出所需的時間。 用戶端應用程式會停止作業 (而不是無限期地等待),這可能會封鎖其他作業並暫停應用程式。 本文提供當您連線到 SQL Server 時所收到的「命令逾時」和「連接逾時」錯誤解決方案。

確認逾時過期錯誤

當您遇到「逾時過期」問題時,便會收到下列其中一項錯誤訊息:

  • 逾時已過期。 在作業完成之前超過逾時等待的時間,或是伺服器未回應。

  • System.Data.SqlClient.SqlException (0x80131904): 已超過連接逾時的設定。 嘗試取用預先登入交握通知時所經過的逾時期間。 這可能是因為登入前交握失敗,或伺服器無法及時回應。 嘗試連線到此伺服器時所花費的持續時間為 [預先登入] initialization=23;handshake=14979;
    System.ComponentModel.Win32Exception (0x80004005) :等候作業逾時。

  • System.Data.SqlClient.SqlException (0x80131904): 已超過連接逾時的設定。 在作業完成之前超過逾時等待的時間,或是伺服器未回應。 System.ComponentModel.Win32Exception (0x80004005) :等候作業逾時。

  • 連線逾時已過期。 嘗試取用預先登入交握通知時所經過的逾時期間。 這可能是因為登入前交握失敗,或伺服器無法及時回應。
    嘗試連接到這部伺服器所花費的時間為 [登入前] 初始設定=21036; 信號交換=0; (Microsoft SQL Server,錯誤: -2)。

  • System.InvalidOperationException: 已超過連接逾時的設定。 在取得集區連接之前超過逾時等待的時間。

    如果連線未正確關閉,可能會發生錯誤。 這些錯誤的發生原因是所有集區連線都在使用中,且達到集區大小上限。 如果您遵循已用盡連線集區一文中所述的步驟,可以避免這些錯誤。

注意事項

安裝 .NET Framework 4.5 或更新版本時,會發生第二個和第三個錯誤。

判斷逾時過期錯誤的類型

從連線能力的觀點來看,您會遇到下列逾時問題:

  • 連接逾時 (預設為 15 秒)
  • 查詢或命令逾時 (預設為 30 秒)

注意事項

預設值可以透過程式碼、連接字串或其他方法來設定。

進行疑難排解之前,請檢視錯誤訊息的完整呼叫堆疊,以判斷錯誤類型。

  • 請參閱下列連接逾時呼叫堆疊範例:

    System.Data.SqlClient.SqlException: Timeout expired. The timeout period elapsed prior to completion of the operation or the server is not responding.
    at System.Data.SqlClient.SqlInternalConnection.OnError(SqlException exception, Boolean breakConnection)
    at System.Data.SqlClient.TdsParser.ThrowExceptionAndWarning(TdsParserStateObject stateObj)
    at System.Data.SqlClient.TdsParserStateObject.ReadSniError(TdsParserStateObject stateObj, UInt32 error)
    at System.Data.SqlClient.TdsParserStateObject.ReadSni(DbAsyncResult asyncResult, TdsParserStateObject stateObj)
    at System.Data.SqlClient.TdsParserStateObject.ReadNetworkPacket()
    at System.Data.SqlClient.TdsParser.ConsumePreLoginHandshake(Boolean encrypt,Boolean trustServerCert, Boolean& marsCapable)
    at System.Data.SqlClient.TdsParser.Connect(ServerInfo serverInfo, SqlInternalConnectionTds connHandler, Boolean ignoreSniOpenTimeout, Int64 timerExpire, Boolean encrypt, Boolean trustServerCert, Boolean integratedSecurity, SqlConnectionowningObject)
    at System.Data.SqlClient.SqlInternalConnectionTds.AttemptOneLogin(ServerInfoserverInfo, String newPassword, Boolean ignoreSniOpenTimeout, Int64 timerExpire, SqlConnection owningObject)
    at System.Data.SqlClient.SqlInternalConnectionTds.LoginNoFailover(String host, String newPassword, Boolean redirectedUserInstance, SqlConnection owningObject, SqlConnectionString connectionOptions, Int64 timerStart)
    at System.Data.SqlClient.SqlInternalConnectionTds.OpenLoginEnlist(SqlConnection owningObject, SqlConnectionString connectionOptions, String newPassword, Boolean redirectedUserInstance)
    at System.Data.SqlClient.SqlInternalConnectionTds..ctor(DbConnectionPoolIdentity identity, SqlConnectionString connectionOptions, Object providerInfo, String newPassword, SqlConnection owningObject, Boolean redirectedUserInstance)
    at System.Data.SqlClient.SqlConnectionFactory.CreateConnection(DbConnectionOptions options, Object poolGroupProviderInfo, DbConnectionPool pool, DbConnection owningConnection)
    at System.Data.ProviderBase.DbConnectionFactory.CreatePooledConnection(DbConnection owningConnection, DbConnectionPool pool, DbConnectionOptions options)  
    at System.Data.ProviderBase.DbConnectionPool.CreateObject(DbConnection owningObject) at System.Data.ProviderBase.DbConnectionPool.UserCreateRequest(DbConnection owningObject)
    at System.Data.ProviderBase.DbConnectionPool.GetConnection(DbConnection owningObject)
    at System.Data.ProviderBase.DbConnectionFactory.GetConnection(DbConnection owningConnection)
    at System.Data.ProviderBase.DbConnectionClosed.OpenConnection(DbConnection outerConnection, DbConnectionFactory connectionFactory)
    at System.Data.SqlClient.SqlConnection.Open()  
    

    SqlConnection.Open 表示用戶端嘗試開啟連線,因此與查詢無關。

  • 請參閱下列查詢或命令逾時的呼叫堆疊範例:

    System.Data.SqlClient.SqlException: Timeout expired. The timeout period elapsed prior to completion of the operation or the server is not responding.
    at System.Data.SqlClient.SqlConnection.OnError(SqlException exception, Boolean breakConnection)
    at System.Data.SqlClient.TdsParser.ThrowExceptionAndWarning(TdsParserStateObject stateObj)
    at System.Data.SqlClient.TdsParser.Run(RunBehavior runBehavior, SqlCommand cmdHandler, SqlDataReader dataStream, BulkCopySimpleResultSet bulkCopyHandler, TdsParserStateObject stateObj)
    at System.Data.SqlClient.SqlDataReader.ConsumeMetaData()
    at System.Data.SqlClient.SqlDataReader.get_MetaData()
    at System.Data.SqlClient.SqlCommand.FinishExecuteReader(SqlDataReader ds, RunBehavior runBehavior, String resetOptionsString) at System.Data.SqlClient.SqlCommand.RunExecuteReaderTds(CommandBehavior cmdBehavior, RunBehavior runBehavior, Boolean returnStream, Boolean async)
    at System.Data.SqlClient.SqlCommand.RunExecuteReader(CommandBehavior cmdBehavior, RunBehavior runBehavior, Boolean returnStream, String method, DbAsyncResult result)
    at System.Data.SqlClient.SqlCommand.RunExecuteReader(CommandBehavior cmdBehavior, RunBehavior runBehavior, Boolean returnStream, String method)
    at System.Data.SqlClient.SqlCommand.ExecuteScalar()
    

    類別 SqlCommand 是用來處理查詢,而不是連線。 方法 ExecuteScalar 是用來執行查詢。 您也可以查看其他項目,例如 ExecuteReaderExecuteNonQuery

針對逾時過期錯誤進行疑難排解

  • 如果您遇到查詢或命令逾時錯誤,請參閱針對查詢逾時錯誤進行疑難排解 (部分機器翻譯)。

  • 如果您遇到連接逾時錯誤,請遵循下列步驟:

    1. 增加連接逾時參數。

      • 如果您使用應用程式連線到 SQL Server,請增加相關的連接逾時參數值,並檢查連線最終是否成功。 例如,如果您使用 System.Data.SqlClient ,請將 SqlConnection.ConnectionTimeout 屬性設定為 30 或更高的值。

        注意事項

        如果您使用其他提供者,請參閱 SQL 用戶端程式設計的首頁 (部分機器翻譯)。

      • 如果您使用 SQL Server Management Studio (SSMS),請選取 [連接到伺服器] 對話方塊中的 [連接屬性] 索引標籤,並將 [連接逾時] 設定設為較高的值。

    2. 如果連線最終成功,則是發生網路問題。 您必須與網路系統管理員合作來解決問題。 解決問題後,您可以還原為應用程式中的預設設定。

      注意事項

      增加應用程式中的連接逾時是可行的方法,但不是長期解決方案。 這是因為當您嘗試連線到資料來源時,連線 (通常會在幾毫秒內) 快速發生。

錯誤的一般原因和解決方法

下表列出逾時過期錯誤的一般原因和解決方案。 如需更多祕訣和建議,請參閱疑難排解:等候時間逾時

一般原因 解決方案
輸入的伺服器名稱不正確。 請使用正確的伺服器名稱再試一次。
伺服器上的 SQL Server 服務未執行。 啟動 SQL Server Database Engine 的執行個體。
防火牆會封鎖 Database Engine 執行個體的 TCP/IP 連接埠。 設定防火牆以允許存取 Database Engine。
Database Engine 未接聽連接埠 1433。 這是因為連接埠已變更,或不是預設執行個體,且 SQL Server Browser 服務未執行。 啟動 SQL Server Browser 服務,或指定要與命令連線的 Sqlcmd -S <ip_addres>,<port> TCP/IP 連接埠號碼。 在錯誤記錄檔中,尋找 SQL Server 接聽的連接埠號碼。
SQL Server 瀏覽器服務正在執行,但 UDP 連接埠 1434 遭到防火牆封鎖。 設定防火牆以允許存取伺服器上的 UPD 連接埠 1434,或指定要連線的 TCP/IP 連接埠號碼。
用戶端和伺服器未設定為使用相同的網路通訊協定。 使用 SQL Server 設定管理員,確定伺服器和用戶端電腦至少有一個通用的啟用通訊協定。 例如,如果用戶端使用 TCP/IP 通訊端進行連線,但 SQL Server 只接聽具名管道,則無法建立連線能力。
網路無法將伺服器名稱解析為 IP 位址,這可以使用 Ping 或 Telnet 程式進行測試。 修正網路上的電腦名稱解析問題,或使用 IP 位址連線到伺服器,這不是 SQL Server 問題。 如需協助,請參閱您的 Windows 文件,或連絡您的網路系統管理員。 請使用下列命令來測試連線能力:
telnet <ServerName> [<Port>]
telnet <IP_Address> <Port>
如果使用 IP 位址可以運作,但伺服器名稱無法運作,則這是名稱解析問題。
網路無法使用 IP 位址連線,這可以使用 Ping、Telnet 或 tracert 程式進行測試。 修正網路上的 TCP/IP 問題,這不是 SQL Server 問題。 如需協助,請參閱您的 Windows 文件,或連絡您的網路系統管理員。
如需更進階的網路疑難排解,請參閱 0300 間歇性或定期網路問題

另請參閱