【问题标题】:Currently, All my SQL Request showing "System.ComponentModel.Win32Exception: The wait operation timed out"目前,我所有的 SQL 请求都显示“System.ComponentModel.Win32Exception:等待操作超时”
【发布时间】:2013-12-02 18:51:20
【问题描述】:

突然,所有的 sql server 请求都显示“System.ComponentModel.Win32Exception: The wait operation timed out”。找到问题的最快方法是什么?

Stack Trace: 


[Win32Exception (0x80004005): The wait operation timed out]

[SqlException (0x80131904): Timeout expired.  The timeout period elapsed prior to completion of the operation or the server is not responding.]
   System.Data.SqlClient.SqlConnection.OnError(SqlException exception, Boolean breakConnection, Action`1 wrapCloseInAction) +1767866
   System.Data.SqlClient.SqlInternalConnection.OnError(SqlException exception, Boolean breakConnection, Action`1 wrapCloseInAction) +5352418
   System.Data.SqlClient.TdsParser.ThrowExceptionAndWarning(TdsParserStateObject stateObj, Boolean callerHasConnectionLock, Boolean asyncClose) +244
   System.Data.SqlClient.TdsParser.TryRun(RunBehavior runBehavior, SqlCommand cmdHandler, SqlDataReader dataStream, BulkCopySimpleResultSet bulkCopyHandler, TdsParserStateObject stateObj, Boolean& dataReady) +1691
   System.Data.SqlClient.SqlDataReader.TryConsumeMetaData() +61
   System.Data.SqlClient.SqlDataReader.get_MetaData() +90
   System.Data.SqlClient.SqlCommand.FinishExecuteReader(SqlDataReader ds, RunBehavior runBehavior, String resetOptionsString) +365
   System.Data.SqlClient.SqlCommand.RunExecuteReaderTds(CommandBehavior cmdBehavior, RunBehavior runBehavior, Boolean returnStream, Boolean async, Int32 timeout, Task& task, Boolean asyncWrite, SqlDataReader ds) +1406
   System.Data.SqlClient.SqlCommand.RunExecuteReader(CommandBehavior cmdBehavior, RunBehavior runBehavior, Boolean returnStream, String method, TaskCompletionSource`1 completion, Int32 timeout, Task& task, Boolean asyncWrite) +177
   System.Data.SqlClient.SqlCommand.RunExecuteReader(CommandBehavior cmdBehavior, RunBehavior runBehavior, Boolean returnStream, String method) +53
   System.Data.SqlClient.SqlCommand.ExecuteReader(CommandBehavior behavior, String method) +134
   System.Data.SqlClient.SqlCommand.ExecuteDbDataReader(CommandBehavior behavior) +41
   System.Data.Common.DbCommand.System.Data.IDbCommand.ExecuteReader(CommandBehavior behavior) +10
   System.Data.Common.DbDataAdapter.FillInternal(DataSet dataset, DataTable[] datatables, Int32 startRecord, Int32 maxRecords, String srcTable, IDbCommand command, CommandBehavior behavior) +140
   System.Data.Common.DbDataAdapter.Fill(DataSet dataSet, Int32 startRecord, Int32 maxRecords, String srcTable, IDbCommand command, CommandBehavior behavior) +316
   System.Data.Common.DbDataAdapter.Fill(DataSet dataSet, String srcTable) +86
   System.Web.UI.WebControls.SqlDataSourceView.ExecuteSelect(DataSourceSelectArguments arguments) +1481
   System.Web.UI.DataSourceView.Select(DataSourceSelectArguments arguments, DataSourceViewSelectCallback callback) +21

我得到了导致阻塞问题的 SQl,

http://www.sqlskills.com/blogs/paul/script-open-transactions-with-text-and-plans/

【问题讨论】:

  • 你能提供堆栈跟踪吗?这个错误似乎有很多原因。
  • @user960567 您能否将更新发布为答案并接受它,以便对其他人也有帮助

标签: sql sql-server tsql sql-server-2012


【解决方案1】:

我是如何找到问题的, 首先检查所有打开的事务你的数据库,

DBCC OPENTRAN ('Databse')

如果有一个打开的事务,则获取它的 SPID 并将其放入 INPUTBUFFER

DBCC INPUTBUFFER (58)

这将为您提供实际的 SQL。如果你愿意,你可以杀死这个事务,

KILL 58

顺便说一句,在我的应用程序中,我可以使用 READ COMMITTED 数据,

SET TRANSACTION ISOLATION LEVEL READ UNCOMMITTED

或者

Select * from Products WITH NoLock

这是另一种快速找到 SQl 的方法,

SELECT
    [s_tst].[session_id],
    [s_es].[login_name] AS [Login Name],
    DB_NAME (s_tdt.database_id) AS [Database],
    [s_tdt].[database_transaction_begin_time] AS [Begin Time],
    [s_tdt].[database_transaction_log_bytes_used] AS [Log Bytes],
    [s_tdt].[database_transaction_log_bytes_reserved] AS [Log Rsvd],
    [s_est].text AS [Last T-SQL Text],
    [s_eqp].[query_plan] AS [Last Plan]
FROM
    sys.dm_tran_database_transactions [s_tdt]
JOIN
    sys.dm_tran_session_transactions [s_tst]
ON
    [s_tst].[transaction_id] = [s_tdt].[transaction_id]
JOIN
    sys.[dm_exec_sessions] [s_es]
ON
    [s_es].[session_id] = [s_tst].[session_id]
JOIN
    sys.dm_exec_connections [s_ec]
ON
    [s_ec].[session_id] = [s_tst].[session_id]
LEFT OUTER JOIN
    sys.dm_exec_requests [s_er]
ON
    [s_er].[session_id] = [s_tst].[session_id]
CROSS APPLY
    sys.dm_exec_sql_text ([s_ec].[most_recent_sql_handle]) AS [s_est]
OUTER APPLY
    sys.dm_exec_query_plan ([s_er].[plan_handle]) AS [s_eqp]
ORDER BY
    [Begin Time] ASC;
GO

http://www.sqlskills.com/blogs/paul/script-open-transactions-with-text-and-plans/

【讨论】:

    【解决方案2】:

    尝试执行这个命令:

    exec sp_updatestats
    

    【讨论】:

    • 这种情况经常发生。我需要找到根本原因吗?
    • 您的 SQL 服务器上是否有任何移植之王?意味着是否有任何过程在一段时间后定期在一个或多个表中批量插入/更新/删除?因为这个一般是因为索引,统计数据
    • 我没有任何索引。这是一张简单的表格。
    • 抱歉,我无法对此进行更多思考。我认为您应该在 dba.stackexchange.com 或 serverfault.com 上尝试一下,已经有一篇帖子重新注册了这个 ..serverfault.com/questions/419997/…
    • 也许您的表应该有一个索引 - 它使搜索数据的速度提高了几个数量级。
    【解决方案3】:

    这种类型的 SQL Server 超时错误可能发生在尝试插入或更新特定表时,而当前正在对该表执行长时间运行的 SELECT 查询(取决于 SELECT 的隔离级别)。

    相关:

    【讨论】:

      【解决方案4】:

      只需停止并再次启动 sql server 浏览器服务,它就解决了我的问题

      【讨论】:

        【解决方案5】:

        我也发现了这个问题,但我设法解决了。

        最初我已将所有 SQL Server 服务设置为由我手动启动。但是这个(刚启动SQL Server(server_name)一段时间后,出现了这个错误。为了解决这个问题,我发现SQL Server Browser和SQL Server Agent(server_name)也需要启动。

        SQL Server 代理 (server_name) 不会被手动启动,因为它没有被使用,所以我将它设置回自动,这样它就会在另一个进程使用它时启动。

        【讨论】:

          【解决方案6】:

          对于我们的案例,问题是由于以下原因:

          1. 运行 .Net 4.0 的旧版应用程序
          2. 服务器最近使用了最新的 .Net 补丁(截至 2018 年 11 月 8 日
          3. 有问题的数据库已镜像

          没有死锁,客户端服务和 SQL Server 资源充足。

          我们的解决方案:

          1) 我们测试了补丁/服务包的回滚并且它有效(不推荐

          2) (推荐)According to Microsoft,以上条件为我们设置了错误:

          当应用程序使用 Microsoft .NET Framework 3.5 或 Microsoft 用于 Microsoft SQL Server (SQLClient) 的 .NET Framework 4 数据提供程序 连接到镜像数据库,您可能会收到以下错误 消息:

          超时。超时时间过去之前 操作完成或服务器没有响应。在 System.Data.SqlClient.SqlInternalConnection.OnError(SqlException 异常,布尔型 breakConnection) 在 System.Data.SqlClient.TdsParser.ThrowExceptionAndWarning() 在 System.Data.SqlClient.TdsParserStateObject.ReadSniError(TdsParserStateObject stateObj,UInt32 错误)在 System.Data.SqlClient.TdsParserStateObject.ReadSni(DbAsyncResult asyncResult, TdsParserStateObject stateObj) 在 System.Data.SqlClient.TdsParserStateObject.ReadNetworkPacket() 在 System.Data.SqlClient.TdsParser.ConsumePreLoginHandshake(布尔值 加密、布尔值 trustServerCert、布尔值和 marsCapable)在 System.Data.SqlClient.TdsParser.Connect(ServerInfo serverInfo, SqlInternalConnectionTds connHandler, Boolean ignoreSniOpenTimeout, Int64 timerExpire, Boolean encrypt, Boolean trustServerCert, Boolean 综合安全)在 System.Data.SqlClient.SqlInternalConnectionTds.AttemptOneLogin(ServerInfo serverInfo,字符串 newPassword,布尔型 ignoreSniOpenTimeout, TimeoutTimer 超时,SqlConnection owningObject) 在 System.Data.SqlClient.SqlInternalConnectionTds.LoginWithFailover(布尔 useFailoverHost, ServerInfo primaryServerInfo, String failoverHost, 字符串 newPassword、布尔重定向用户实例、SqlConnection owningObject, SqlConnectionString connectionOptions, TimeoutTimer timeout) 注意如果 ConnectionTimeout 属性设置为默认值 值 15 秒,您可能会在 连接打开 1.2 秒。

          原因

          出现此问题是因为 连接重试中的错误 镜像数据库算法。

          当使用重试算法时,数据提供者等待 第一次读取 (SniReadSync) 调用完成。呼叫被发送到 运行 SQL Server 的后端计算机,等待时间为 通过将连接超时值乘以 0.08 计算得出。 但是,数据提供者错误地将连接设置为注定失败的 说明响应是否缓慢且第一个 SniReadSync 调用不是 在等待时间到期之前完成。

          注意这种情况下的缓慢响应可能是由 服务器或网络延迟。

          分辨率

          此问题已在 .NET Framework 4.5.2 中得到解决。除了 .NET Framework 4.5.2,有可用于其他 .NET 的修补程序 F框架版本


          更多详细信息和修补程序下载: https://support.microsoft.com/en-us/help/2605597/fix-time-out-error-when-a-mirrored-database-connection-is-created-by-t

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 2018-06-30
            • 1970-01-01
            • 1970-01-01
            • 2015-02-02
            • 1970-01-01
            • 2019-03-13
            • 1970-01-01
            相关资源
            最近更新 更多