適用於:SQL Server
總結
SQL Server 中的「逾時過期」錯誤表示連線或指令操作未在客戶端應用程式允許的逾時間隔內完成,因此客戶端取消該操作而非無限等待。 本文幫助你判斷自己是遇到連線逾時,還是查詢或指令逾時。 它涵蓋了你可能遇到的連線逾時錯誤訊息,以及連線逾時後常見的服務、埠口、防火牆和名稱解析造成的問題。 當用戶端應用程式間歇性或持續無法連接 SQL Server 實例且連線逾時時,請使用此文章。
要排除查詢或指令逾時錯誤,請參見 「查詢逾時錯誤故障排除」。
注意
開始疑難解答之前,請先檢查 必要條件 並完成檢查清單。
連接 SQL Server 時逾時過期錯誤訊息
當您遇到「逾時過期」問題時,您會收到下列一或多個錯誤訊息:
-
已超過逾時的設定。 在作業完成前就已超過逾時期間,或是伺服器沒有回應。
-
System.Data.SqlClient.SqlException (0x80131904):連線逾時已過期。 嘗試取用登入前的交握確認時超過逾時時間。 這可能是因為登入前交握失敗,或伺服器無法及時回應。 嘗試連線到這部伺服器所花費的時間為 [登入前] 初始化=23;交握=14979;
System.ComponentModel.Win32Exception (0x80004005):等候作業已逾時。 -
System.Data.SqlClient.SqlException (0x80131904):逾時已過期。 在作業完成前就已超過逾時期間,或是伺服器沒有回應。 System.ComponentModel.Win32Exception (0x80004005):等候作業已逾時。
-
已超過連線逾時。 嘗試取用登入前的交握確認時超過逾時時間。 這可能是因為登入前交握失敗,或伺服器無法及時回應。
嘗試連線到此伺服器的持續時間是 [登入前] 初始化=21036;handshake=0;(Microsoft SQL Server,錯誤: -2)。 -
System.InvalidOperationException:逾時已過期。 從集區取得連線之前超過逾時等待的時間。
如果連線未正確關閉,可能會發生錯誤。 發生這些錯誤的原因是所有集區連線都在使用中,而且達到集區大小上限。 如果您遵循連線集區耗盡一文中所述的步驟,您可以避免這些錯誤。 欲了解更多關於池化運作方式的資訊,請參閱 SQL Server 連線池(ADO.NET)。
注意
第二和第三個錯誤發生在安裝 .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可用來執行查詢。 您也可以檢視其他專案,例如ExecuteReader或ExecuteNonQuery。若遇到查詢或指令逾時錯誤,請參閱 「疑難排除查詢逾時錯誤」。
故障排除 SQL Server 中的連線逾時錯誤
如果遇到連線逾時錯誤,請依照以下步驟操作:
增加連線逾時參數。
如果您使用應用程式連線到 SQL Server,請增加相關的連線逾時參數值,並檢查連接最終是否成功。 例如,如果您使用
System.Data.SqlClient,請將 SqlConnection.ConnectionTimeout 屬性設定為 30 或更高的值。 如果你使用目前的 Microsoft。Data.SqlClient 驅動程式,設定等效的 SqlConnection.ConnectionTimeout 屬性。注意
如果您使用其他提供者,請檢查 首頁以取得 SQL 用戶端程序設計。
如果您使用 SQL Server Management Studio (SSMS),請選取 [連接到伺服器] 對話方塊中的 [連線屬性] 索引標籤,並將 [連線逾時] 設定為較高的值。
如果連線最終成功,則這是網路問題。 請與你的網路管理員合作解決這個問題。 解析之後,您可以還原為應用程式中的預設設定。
注意
增加應用程式中的聯機逾時是可行的方法,但不是長期解決方式。 這是因為當您嘗試連線到數據源時,聯機會快速發生(通常是在幾毫秒內)。
服務、埠與協定導致連線逾時錯誤的原因
下表列出 SQL Server 服務、埠碼及網路協定導致逾時過期錯誤的原因,以及如何解決每個錯誤。 如需更多秘訣和建議,請參閱 疑難解答:逾時已過期。
| 一般原因 | 解決方法 |
|---|---|
| 伺服器上的 SQL Server 服務未執行。 | 啟動 SQL Server 資料庫引擎 的實例。 |
| 資料庫引擎 實例的 TCP/IP 埠會遭到防火牆封鎖。 | 設定防火牆以允許存取 資料庫引擎。 |
| 資料庫引擎 未接聽埠 1433。 這是因為埠已變更,或不是默認實例,而且 SQL Server Browser 服務未執行。 | 啟動 SQL Server Browser 服務,或指定 TCP/IP 埠號碼以使用 命令進行 Sqlcmd -S <ip_addres>,<port> 連線。 在錯誤記錄檔中,尋找 SQL Server 正在接聽的埠號碼。 欲了解更多資訊,請參閱 「設定伺服器監聽特定 TCP 埠」。 |
| SQL Server Browser 服務正在執行,但 UDP 連接埠 1434 遭到防火牆封鎖。 | 設定防火牆以允許存取伺服器上的UPD埠1434,或指定要連線的TCP/IP埠號碼。 |
| 用戶端和伺服器未設定為使用相同的網路通訊協定。 | 請透過使用 SQL Server 組態管理員,確保伺服器與用戶端電腦至少有一種啟用協定。 例如,如果用戶端是使用 TCP/IP 套接字進行連線,但 SQL Server 只會在命名管道上接聽,則無法建立連線能力。 |
網路與名稱解析導致連線逾時錯誤的原因
下表列出了網路層級逾時錯誤的原因,例如DNS名稱解析失敗及TCP/IP路由問題,以及解決方法。
| 一般原因 | 解決方法 |
|---|---|
| 伺服器名稱的輸入不正確。 | 請以正確的伺服器名稱再試一次。 |
| 網路無法解析伺服器名稱為 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 間歇性或定期網路問題。 |