web-dev-qa-db-ja.com

現在、「System.ComponentModel.Win32Exception:待機操作がタイムアウトしました」を示すすべてのSQLリクエスト

突然、「System.ComponentModel.Win32Exception:The wait operation timed out」を示すすべてのSQLサーバー要求。問題を見つける最も速い方法は何ですか?

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/

11
user960567

ここで私が問題を見つけることができた方法、最初にすべての開いているトランザクションをデータベースで確認し、

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/

14
user960567

次のコマンドを実行してみてください:

exec sp_updatestats
4
Dhaval

このタイプのSQL Serverタイムアウトエラーは、特定のテーブルをINSERTまたはUPDATEしようとすると、そのテーブルで長時間実行SELECTクエリが現在実行されている場合に発生します(SELECTの分離レベルによって異なります)。

関連:

1
Jon Schneider

私たちの場合、問題は次の理由によるものでした:

  1. .Net 4.0を実行しているレガシーアプリケーション
  2. 最近サーバーに最新の.Netパッチが適用されました(2018/11/08現在
  3. 問題のデータベースはミラーリングされました

デッドロックはなく、クライアントサービスとSQL Serverには十分なリソースがありました。

私たちのソリューション:

1)パッチ/サービスパックのロールバックをテストし、機能しました(非推奨

2)(推奨)Microsoftによると 、上記の条件によりエラーが発生します:

アプリケーションがMicrosoft .NET Framework 3.5またはMicrosoft .NET Framework 4データプロバイダーを使用して、Microsoft SQL Server(SQLClient)がミラーリングされたデータベースに接続すると、次のエラーメッセージが表示されることがあります。

タイムアウトになりました。操作が完了する前にタイムアウト期間が経過したか、サーバーが応答していません。 System.Data.SqlClient.SqlInternalConnection.OnError(SqlException exception、Boolean breakConnection)at System.Data.SqlClient.TdsParser.ThrowExceptionAndWarning()at System.Data.SqlClient.TdsParserStateObject.ReadSniError(TdsParserStateObject stateObj、UInt32 error) .SqlClient.TdsParserStateObject.ReadSni(DbAsyncResult asyncResult、TdsParserStateObject stateObj)at System.Data.SqlClient.TdsParserStateObject.ReadNetworkPacket()at System.Data.SqlClient.TdsParser.ConsumePreLoginHandshake(Boolean encrypt、Boolean trustServer、Boolean trustServer、Boolean trustServer、Boolean trustServer SqlClient.TdsParser.Connect(ServerInfo serverInfo、SqlInternalConnectionTds connHandler、Boolean ignoreSniOpenTimeout、Int64 timerExpire、Boolean encrypt、Boolean trustServerCert、Boolean IntegratedSecurity)at System.Data.SqlClient.SqlInternalConnectionTds.AttemptOneLogin(ServerInfo serverInfo、String newPasswordr、Timeout newPassword、Timeout SqlConnection owningObject)はSystem.Data.Sにあります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に加えて、他の.NETFrameworkバージョン


詳細と修正プログラムのダウンロード: https://support.Microsoft.com/en-us/help/2605597/fix-time-out-error-when-a-mirrored-database-connection-is-created- by-t

0
user919426

私もこの問題を見つけましたが、なんとか修正しました。

元々、私はすべてのSQL Serverサービスを手動で開始するように設定していました。しかし、これは(しばらくしてSQL Server(server_name)だけを起動した後、このエラーが発生しました。これを修正するには、SQL Server BrowserとSQL Server Agent(server_name)も起動する必要があることがわかりました。

SQL Serverエージェント(server_name)は使用されていなかったため、手動で開始されなかったため、自動に戻し、別のプロセスが使用したときに開始されるようにしました。

0
Harvey

sQL Server Browserサービスを停止して再起動するだけで、問題が解決しました

0
user3173814