web-dev-qa-db-ja.com

SQL Serverでのアプリケーションタイムアウトエラーの追跡

SQL Server 2008 SP3

これらのタイムアウトエラーを追跡するにはどうすればよいですか?

enter image description here

エラーは、IISのエラーレポート専用に使用されるイントラネットダッシュボードに表示されます。私の疑いは、Webアプリケーションのデフォルトのタイムアウトが30秒であり、クエリに30秒以上かかる場合、例外がスローされることです。これらのSQLサーバーには30秒以上かかるクエリが多数あるため、プロファイラーで期間に基づいてフィルターをかけることはできません。

このダッシュボードで監視されているWebサイトにサービスを提供しているのは、2つのIISサーバーが7つのSQL Serverインスタンスからデータを取得することです。

"ユーザーエラーメッセージイベント""OLEDBエラーイベント"を使用して、SQL Serverプロファイラーでこれらのエラーを追跡できますか?

8
Craig Efrein

アーロン・バートランドは彼のコメントで私を正しい軌道に乗せました

そして、継続時間とエラー<> 0でフィルタリングできるはずです

Tsql_durationプロファイルテンプレートを使用してサーバー側のトレースを作成しました

  1. ユーザーエラーメッセージイベントを追加

  2. 次のフィルターを追加しました

    エラー<> 0

    エラー<> 1

    重大度<> 10

SE DATABASEコマンドのキャプチャを回避しました

プロファイラーによってキャプチャされたエラーメッセージは2-中止で、イベントクラスは10 RPC:Completedでした。

5
Craig Efrein

T-SQLステートメントをキャプチャするためのイベントで、プロファイラーの Attention イベントを利用できます。私がテストしたとき、それは必ずしもアテンションイベントが何であるかを明確に述べているわけではないので、それがイベントシーケンスに従っているという事実は、問題のあるクエリを推定できると思います。コードなどを使って完全にテストする機会はありませんでした。

ただし、タイムアウトクエリの検索に使用できる拡張イベントの正確な例に出くわしました。この例はSQL Server 2008のものです。これは、Jonathan Kehayiasによるものです 1日のXEvent(9/31)–ターゲット週– pair_matching


タイムアウトエラーはクライアント側であり、エラーはデータベース接続で使用されているプロバイダー(またはクライアント)が原因です。 SQL Serverは、これらを追跡し続ける必要はなく、直感的な方法でこれらを追跡することもできません。

トレースを使用すると、SQL Server側のタイムアウトは基本的に、開始はあるが完了はないクエリです。 Sean McCownの例を紹介する非常に優れたビデオ Profilerでクエリタイムアウトを検索 を見つけました。ショーンがビデオで指摘しているように、トランザクションが終了しない原因となる可能性のある他のものがあるので、今ではそれは確固たる証拠ではありません。

手順の概要:

  • プロファイラで、ストアドプロシージャとTSQLの開始イベントと完了イベントをキャプチャするトレースを作成します。
  • そのデータをテーブルにロードします
  • そのデータをクエリして開始イベントを見つけ、次に終了イベントを見つけます。

例として、SP:Starting(44)およびSP:Completed(43)トレースデータをテーブルに取得すると、次のようになります。

SELECT *
INTO #TraceStart
FROM MyTraceData
WHERE EventClass = 44

SELECT *
INTO #TraceEnd
FROM MyTraceData
WHERE EventClass = 45

SELECT TextData
FROM #TraceStart
EXCEPT
SELECT TextData
FROM #TraceEnd

これは拡張イベントで行う方が簡単かもしれないと思いますが、このメソッドを拡張イベントに転送しようとしたことはありません。 SQL Server 2008のバージョンの拡張イベントが2012以降のクライアントレベルのエラーへのアクセスを開いたかどうかはわかりません。上記は、まだ機能する、迅速でダーティな方法です。

2
user507

ブロッキングもチェックしていますか?

ブロッキングは確かにタイムアウトの原因となる可能性があり、かなり簡単に追跡できます。ブロックに関連しないタイムアウトには、他の問題があります。 30秒のタイムアウトは一般的なclient設定ですが、コマンドオブジェクトで制御できます。 0に設定すると、接続はタイムアウトしません。

イベント通知とService Brokerを使用してblockingの監視を設定するには、Tony Rogersonの投稿をご覧ください。

http://sqlblogcasts.com/blogs/tonyrogerson/archive/2007/04/06/event-notifications-monitoring-blocked-processes-and-other-events-end-to-end-how-to- set-it-up-and-make-it-work.aspx

彼の例では、彼は10秒以上のブロックを監視します(そして、20、30、40秒などの期間の増分ごとに)私は25秒ごとに監視します。 。ブロックされたプロセスとブロックされたプロセスの両方が、ブロックのXML記述に表示されます。

情報をテーブルに保持することで、履歴を確認して、時間の経過とともに確認できます。

1
RLF