连接到 SQL Server 时超时过期的消息

适用于: SQL Server

注意

在开始故障排除之前,请查看先决条件并核对清单。

超时错误意味着特定操作所用的时间比需要的时间长。 客户端应用程序停止操作(而不是无限期地等待),这可能会阻止其他操作并使应用程序暂停运行。 本文提供连接到 SQL Server 时出现的“命令超时”和“连接超时”错误的解决方法。

验证超时已过期错误

遇到“超时已过期”错误时,可能会收到下面的一条或多条错误消息:

  • 超时过期。 The timeout period elapsed prior to completion of the operation or the server is not responding.

  • System.Data.SqlClient.SqlException (0x80131904): 连接超时已过期。 在尝试使用登录前握手确认时超过了此超时时间。 这可能是因为登录前握手失败或服务器无法及时响应。 尝试连接到此服务器所花费的持续时间为 [登录前] 初始化 = 23; 握手=14979;
    System.ComponentModel.Win32Exception (0x80004005):等待操作超时。

  • System.Data.SqlClient.SqlException (0x80131904): 超时已过期。 The timeout period elapsed prior to completion of the operation or the server is not responding. System.ComponentModel.Win32Exception (0x80004005):等待操作超时。

  • 连接超时时间已到。 在尝试使用登录前握手确认时超过了此超时时间。 这可能是因为登录前握手失败或服务器无法及时响应。
    尝试连接到此服务器时花费的时间是 [Pre-Login] initialization=21036; handshake=0; (Microsoft SQL Server, Error: -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 数据库引擎的实例。
数据库引擎实例的 TCP/IP 端口被防火墙阻止。 配置防火墙以允许访问数据库引擎。
数据库引擎未侦听端口 1433。 这是因为端口已更改,或者它不是默认实例,并且 SQL Server Browser 服务未运行。 启动 SQL Server Browser 服务,或使用 Sqlcmd -S <ip_addres>,<port> 命令指定要连接的 TCP/IP 端口号。 在错误日志中,查找 SQL Server 正在侦听的端口号。
SQL Server Browser 服务正在运行,但 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 间歇性或周期性网络问题

另请参阅