突然,所有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/
答案 0 :(得分:14)
我在这里是如何找到问题的, 首先检查数据库的所有打开事务,
DBCC OPENTRAN ('Databse')
如果有一个打开的交易,那么抓住它的SPID并将其放入INPUTBUFFER
DBCC INPUTBUFFER (58)
这将为您提供实际的SQL。如果需要,可以终止此交易,
KILL 58
BTW,在我的应用程序中,我可以使用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/
答案 1 :(得分:4)
尝试执行此命令:
exec sp_updatestats
答案 2 :(得分:1)
当一个长时间运行的SELECT查询当前正在该表上执行时(取决于SELECT的隔离级别),当尝试INSERT或UPDATE特定表时,可能会发生这种类型的SQL Server超时错误。
相关:
答案 3 :(得分:0)
再次停止并启动sql server浏览器服务,它解决了我的问题
答案 4 :(得分:0)
我也发现了这个问题,但我设法解决了这个问题。
最初我已将所有SQL Server服务设置为由我手动启动。但是这(在启动SQL Server(server_name)一段时间后,出现了这个错误。为了记住它,我发现SQL Server Browser和SQL Server Agent(server_name)也需要启动。
SQL Server代理(server_name)不会在未使用时手动启动,因此我将其设置为自动,以便在其他进程使用它时启动它。
答案 5 :(得分:0)
对于我们的情况,问题归结于以下原因:
没有死锁,并且客户端服务以及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,布尔值ignoreSniOpenTimeout, Int64 timerExpire,布尔加密,布尔trustServerCert,布尔 IntegratedSecurity) System.Data.SqlClient.SqlInternalConnectionTds.AttemptOneLogin(ServerInfo serverInfo,字符串newPassword,布尔值ignoreSniOpenTimeout, TimeoutTimer超时,SqlConnection owningObject)在 System.Data.SqlClient.SqlInternalConnectionTds.LoginWithFailover(布尔 useFailoverHost,ServerInfo primaryServerInfo,字符串failoverHost, 字符串newPassword,布尔型redirectedUserInstance,SqlConnection owningObject,SqlConnectionString connectionOptions,TimeoutTimer 超时)注意如果ConnectionTimeout属性设置为默认值 值15秒,您可能会在 连接打开了1.2秒。
发生此问题是由于 connection-retry中的错误 镜像数据库的算法。
使用重试算法时,数据提供者等待 第一次读取(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