1

優れたオープンソースまたは無料のMSSQLServerトランザクションブロッキング監視ツールはありますか?Xより長く続くブロッキングトランザクションを検出し、どこかにアラートを電子メールで送信するものが理想的です。

1台のサーバーでシンプル。特にMSSQLExpress 2008の場合ですが、実際のすべて、または最近のすべてに適用する必要があります。

4

1 に答える 1

6

はい、実際にはSQL Serverにはそのようなオプションが標準で付属していますが、それを知っている人はごくわずかであり、使用方法を知っている人はさらに少なくなります。それは:と呼ばれblocked process thresholdます

ブロックされたプロセスのしきい値オプションを使用して、ブロックされたプロセスのレポートが生成されるしきい値を秒単位で指定します。しきい値は0から86,400まで設定できます。デフォルトでは、ブロックされたプロセスレポートは作成されません。このイベントは、システムタスク、または検出可能なデッドロックを生成しないリソースを待機しているタスクに対しては生成されません。

このイベントが生成されたときに実行されるアラートを定義できます。したがって、たとえば、ブロック状況を処理するための適切なアクションを実行するように管理者を呼び出すことを選択できます。

このオプションを有効にすると、システムはブロックされたプロセスレポートイベントクラスのプロファイラーイベントを生成します。パズルの次の部分は、この(およびその他の)プロファイラーイベントをDDLイベント通知を使用してキャプチャできることです。これが実際の例です:

use msdb;
go

create queue events;
go

create service events on queue [events] (
    [http://schemas.microsoft.com/SQL/Notifications/PostEventNotification]);
go

create event notification [blocked_threshold_exceeded]
    on server for BLOCKED_PROCESS_REPORT
    to service N'events', N'current database';
go

exec sp_configure 'show advanced options', 1;
reconfigure
go


exec sp_configure 'blocked process threshold', 10;
reconfigure
go

-- simulate blocking
use tempdb;
go

begin transaction;
create table x (a int);
go

ここで、別のセッションで、コミットされていないトランザクションをブロックするrunaクエリが上記で開始されました。

select * from tempdb..x

そして確かに、10秒(設定されたしきい値)で通知を受け取ります:

use msdb;
receive cast(message_body as xml) from [events];

<EVENT_INSTANCE>
  <EventType>BLOCKED_PROCESS_REPORT</EventType>
  <PostTime>2013-02-12T16:19:55.610</PostTime>
  <SPID>5</SPID>
  <TextData>
    <blocked-process-report monitorLoop="104441">
      <blocked-process>
        <process id="process47b946cf8" 
             waitresource="OBJECT: 2:373576369:0 " 
             waittime="18952" ...>
          <executionStack>
            <frame line="1" stmtstart="-1" ... />
          </executionStack>
          <inputbuf>
select * from x   </inputbuf>
        </process>
      </blocked-process>
      <blocking-process>
        <process status="sleeping" ....>
          <executionStack />
          <inputbuf>
create table x (a int)   </inputbuf>
        </process>
      </blocking-process>
    </blocked-process-report>
  </TextData>
...
</EVENT_INSTANCE>

ブロッカーによって最後に実行されたステートメント、ブロックされた現在実行されているステートメント、待機時間などを確認できます。

を使用してメールを送信する手順をアクティブにするためにイベント通知を配線することはsp_send_db_mail、読者への演習として残されています。はい、上記のすべてがExpressEditionで利用できます。

于 2013-02-12T14:26:00.273 に答える