簡體   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