繁体   English   中英

目前,我的所有SQL请求显示“System.ComponentModel.Win32Exception:等待操作超时”

[英]Currently, All my SQL Request showing “System.ComponentModel.Win32Exception: The wait operation timed out”

突然,所有sql server请求显示“System.ComponentModel.Win32Exception:等待操作超时”。 找到问题的最快方法是什么?

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/

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

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/

尝试执行此命令:

exec sp_updatestats

当当前在该表上执行长时间运行的SELECT查询时(取决于SELECT的隔离级别),尝试INSERT或UPDATE特定表时,可能会发生此类SQL Server超时错误。

有关:

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

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

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

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

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

  1. 运行.Net 4.0的遗留应用程序
  2. 服务器最近使用最新的.Net补丁修补( 截至2018/11/08
  3. 有问题的数据库是镜像的

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

我们的方案:

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

2) (推荐)据微软称 ,上述条件为我们设置了错误:

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

超时已过期。 操作完成之前经过的超时时间或服务器没有响应。 在System.Data.SqlClient.SqlInternalConnection.OnError(SqlException异常,布尔breakConnection)处于System.Data.SqlClient.TdsParser.ThrowExceptionAndWarning()处于System.Data.SqlClient.TdsParserStateObject.ReadSniError(TdsParserStateObject stateObj,UInt32错误)处于System.Data在System.Data的System.Data.SqlClient.TdsParser.ConsumePreLoginHandshake(Boolean encrypt,Boolean trustServerCert,Boolean&marsCapable)的System.Data.SqlClient.TdsParserStateObject.ReadNetworkPacket()处的.SqlClient.TdsParserStateObject.ReadSni(DbAsyncResult asyncResult,TdsParserStateObject stateObj)。 System.Data.SqlClient.SqlInternalConnectionTds.AttemptOneLogin中的SqlClient.TdsParser.Connect(ServerInfo serverInfo,SqlInternalConnectionTds connHandler,Boolean ignoreSniOpenTimeout,Int64 timerExpire,Boolean encrypt,Boolean trustServerCert,Boolean integratedSecurity)(ServerInfo serverInfo,String newPassword,Boolean ignoreSniOpenTimeout,TimeoutTimer timeout, System.Data.S中的SqlConnection owningObject) qlClient.SqlInternalConnectionTds.LoginWithFailover(Boolean useFailoverHost,ServerInfo primaryServerInfo,String failoverHost,String newPassword,Boolean redirectedUserInstance,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 ramework版本 可用的修补程序


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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM