Event Monitor の概要と特徴

Event Monitor は DB2 のイベント駆動型の情報収集機能です。指定したイベント(SQL 実行完了・デッドロック発生・接続/切断・トランザクション完了など)が発生したタイミングで詳細情報を記録します。Oracle の SQL トレース(10046 イベント)やデッドロックグラフに相当する情報を取得できます。

主な特徴

  • イベント発生時の詳細情報(SQL テキスト・実行計画・実行統計)を記録
  • デッドロックの参加者・保有ロック・待機ロックを完全に記録できる
  • テーブル型(V9.7 以降)ではイベントデータを SQL で直接参照・分析可能
  • 事前定義が必要(ACTIVATE するまで収集しない)

実行権限

DBADM / SQLADM 権限が必要です。ファイル出力先へのディレクトリ書き込み権限も必要です。

Event Monitor の2種類

Event Monitor には出力先の違いにより2種類あります。

  • ファイル型: 指定ディレクトリにバイナリファイルを出力。db2evmon コマンドでテキスト変換して確認します。
  • テーブル型(推奨): DB2 V9.7 以降で利用可能。イベントデータをデータベーステーブルに格納し、SELECT で直接参照できます。

Event Monitor の種類

イベントタイプ 収集情報 Oracle AWR / Trace 対応
STATEMENTS SQL 実行ごとの詳細(テキスト・実行時間・I/O・CPU・行数) SQL Trace(10046)/ SQL Statistics 詳細
DEADLOCKS WITH DETAILS HISTORY デッドロック発生時の参加者・ロック保有・待機の完全情報 Enqueue Activity / Wait Statistics(デッドロック詳細)
CONNECTIONS 接続・切断イベント(ユーザ・時刻・統計) Report Summary(接続情報)
TRANSACTIONS トランザクション完了ごとの統計(コミット・ロールバック) Instance Activity Statistics(UOW)
ACTIVITIES WLM(ワークロード管理)アクティビティの詳細 (DB2 固有)
UNIT OF WORK 作業単位(UOW)の完了情報(V10.5 以降) Instance Activity / Wait Events

作成・有効化・確認の手順

テーブル型 Event Monitor の作成(推奨)

-- デッドロック詳細を記録するテーブル型 Event Monitor
CREATE EVENT MONITOR DEADLOCK_MON
FOR DEADLOCKS WITH DETAILS HISTORY
WRITE TO TABLE
  DLCONN (TABLE DEADLOCK_MON_DLCONN),
  DLLOCK (TABLE DEADLOCK_MON_DLLOCK),
  DLLOCKWAIT (TABLE DEADLOCK_MON_DLLOCKWAIT),
  DLLOCKLIST (TABLE DEADLOCK_MON_DLLOCKLIST);

-- SQL 統計を記録するテーブル型 Event Monitor
CREATE EVENT MONITOR STMT_MON
FOR STATEMENTS
WRITE TO TABLE
  STMT (TABLE STMT_MON_STMT),
  CONN (TABLE STMT_MON_CONN)
AUTOSTART;

ファイル型 Event Monitor の作成

-- デッドロック情報をファイルへ記録
CREATE EVENT MONITOR DEADLOCK_FILE_MON
FOR DEADLOCKS WITH DETAILS HISTORY
WRITE TO FILE '/tmp/db2event'
BLOCKED;

-- 出力ディレクトリは事前に作成が必要
-- mkdir /tmp/db2event

Event Monitor の有効化・停止

-- 有効化
SET EVENT MONITOR DEADLOCK_MON STATE 1;

-- 停止
SET EVENT MONITOR DEADLOCK_MON STATE 0;

-- 作成済みの Event Monitor を確認
SELECT EVMONNAME, TARGET_TYPE, ACTIVE
FROM SYSCAT.EVENTMONITORS;

ファイル型の結果確認

-- バイナリファイルをテキスト変換して確認
db2evmon -path /tmp/db2event | more

-- ファイルに保存
db2evmon -path /tmp/db2event > /tmp/evmon_result.txt

イベントタイプ別セクション定義

① STATEMENTS イベント

Oracle の SQL Trace(10046 イベント)に相当します。SQL の実行ごとに詳細情報を記録します。

項目 / 列名 何を表すか 読み方・異常値の目安
STMT_TEXT 実行された SQL テキスト(完全) 原因 SQL の特定に使用。完全テキストが取得できる
TOTAL_EXEC_TIME SQL の実行時間(ミリ秒) スロークエリの閾値(例: 1,000 ms 以上)でフィルタして確認
TOTAL_CPU_TIME CPU 消費時間(マイクロ秒) TOTAL_EXEC_TIME と比較して CPU バウンドか待機バウンドかを判別
ROWS_READ 読み取り行数 ROWS_RETURNED との比較でフィルタ率を確認。比率が高いほど非効率
POOL_DATA_L_READS 論理読み込み回数(この SQL 単体) Oracle の Buffer Gets に相当
POOL_DATA_P_READS 物理読み込み回数(この SQL 単体) 高い値はバッファプールに収まらない大量データスキャンを示す
SORT_OVERFLOWS この SQL でのソートオーバーフロー回数 1 以上で SORTHEAP 不足。インデックスや SORTHEAP の見直し
START_TIME SQL 実行開始時刻 問題発生時刻との照合に使用
STOP_TIME SQL 実行終了時刻 START_TIME との差で実行時間を算出して検証

② DEADLOCKS WITH DETAILS HISTORY イベント

Oracle の Enqueue Activity(デッドロック詳細)に相当します。デッドロック発生時の全情報を記録します。

テーブル / 項目 何を表すか 読み方・異常値の目安
DLCONN(接続情報) デッドロックに参加した接続の情報 DEADLOCK_ID で各テーブルを結合して原因を特定する
DEADLOCK_ID デッドロックの識別子 各テーブルを結合する共通キー
DEADLOCK_TIME デッドロック発生時刻 問題発生時刻と照合して該当デッドロックを特定
DLLOCK(ロック情報) デッドロック参加者が保有・待機していたロック TABLE_NAME / LOCK_MODE で競合オブジェクトを特定
LOCK_OBJECT_TYPE ロック対象の種類(ROW / TABLE / TABLESPACE 等) ROW レベルのデッドロックが多い場合はアクセス順序を確認
LOCK_MODE ロックの種類(S / X / IS / IX / SIX) X ロード同士の競合は更新処理の順序問題
DLLOCKWAIT(待機情報) ロック待機者の情報(どのロックを待っているか) DLLOCK の DEADLOCK_ID で結合してデッドロックの連鎖を把握
DLLOCKLIST(SQL 履歴) デッドロック参加者が直前に実行した SQL の履歴 WITH HISTORY を指定した場合のみ記録。原因 SQL の特定に直結

③ CONNECTIONS イベント

Oracle AWR の Report Summary(接続情報)に相当します。接続・切断のタイミングで情報を記録します。

項目 何を表すか 読み方・異常値の目安
AUTH_ID 認証ユーザ ID 接続ユーザの監査・確認に使用
CONNECT_TIME 接続時刻 接続パターンの分析(ピーク時間帯の把握)に使用
DISCONNECT_TIME 切断時刻 接続時間の算出(長時間接続セッションの特定)
TOTAL_APP_COMMITS この接続が実行したコミット数 接続ごとのトランザクション量の把握
DEADLOCKS この接続が関与したデッドロック数 特定接続でデッドロックが集中している場合はアプリロジックを確認

活用 SQL 例

スロークエリの抽出(STATEMENTS イベント)

-- 実行時間 1 秒以上の SQL を実行時間の降順で確認
SELECT
  START_TIME,
  TOTAL_EXEC_TIME / 1000      AS EXEC_SEC,
  TOTAL_CPU_TIME  / 1000000   AS CPU_SEC,
  ROWS_READ,
  ROWS_RETURNED,
  POOL_DATA_P_READS           AS PHYS_READS,
  SUBSTR(STMT_TEXT, 1, 150)   AS SQL_TEXT
FROM STMT_MON_STMT
WHERE TOTAL_EXEC_TIME >= 1000
ORDER BY TOTAL_EXEC_TIME DESC
FETCH FIRST 20 ROWS ONLY;

デッドロック発生状況の確認

-- デッドロック一覧と参加接続数
SELECT
  DEADLOCK_ID,
  DEADLOCK_TIME,
  COUNT(*) AS PARTICIPANTS
FROM DEADLOCK_MON_DLCONN
GROUP BY DEADLOCK_ID, DEADLOCK_TIME
ORDER BY DEADLOCK_TIME DESC;

デッドロックの原因 SQL を特定

-- 特定デッドロードの SQL 履歴を確認(WITH HISTORY が必要)
SELECT
  C.AUTH_ID,
  C.DEADLOCK_ID,
  L.LOCK_OBJECT_TYPE,
  L.LOCK_MODE,
  H.STMT_TEXT
FROM DEADLOCK_MON_DLCONN  C
JOIN DEADLOCK_MON_DLLOCK  L ON C.DEADLOCK_ID = L.DEADLOCK_ID
LEFT JOIN DEADLOCK_MON_DLLOCKLIST H
       ON C.DEADLOCK_ID = H.DEADLOCK_ID
      AND C.AGENT_ID     = H.AGENT_ID
WHERE C.DEADLOCK_ID = 1  -- 調査対象の DEADLOCK_ID
ORDER BY C.AUTH_ID, H.EVMON_ACTIVITES_ORD_NUM;

Event Monitor の確認と削除

-- 作成済み Event Monitor の一覧
SELECT EVMONNAME, TARGET_TYPE, ACTIVE
FROM SYSCAT.EVENTMONITORS;

-- Event Monitor の削除(停止してから削除)
SET EVENT MONITOR DEADLOCK_MON STATE 0;
DROP EVENT MONITOR DEADLOCK_MON;

-- テーブル型の場合は出力テーブルも削除
DROP TABLE DEADLOCK_MON_DLCONN;
DROP TABLE DEADLOCK_MON_DLLOCK;

注意事項

  • 事前作成が必要: Event Monitor は問題発生前に作成・有効化しておく必要があります。デッドロックが頻発する環境では常時 ACTIVATE しておくことを推奨します。
  • ディスク容量: STATEMENTS イベントは全 SQL を記録するため、ディスク消費量が大きくなります。本番環境では期間を限定して取得するか、条件付き(FILTER 句)で絞り込んでください。
  • テーブル型のパージ: テーブル型の Event Monitor はデータを自動的に削除しません。定期的に古いデータを DELETE するか、テーブルをパーティション化して管理してください。
  • AUTOSTART オプション: AUTOSTART を指定すると DB2 起動時に自動的に ACTIVATE されます。常時監視が必要なデッドロックモニターには有効です。
  • V9.7 以降のテーブル型: テーブル型(WRITE TO TABLE)は DB2 V9.7 以降で使用可能です。それ以前の環境ではファイル型を使用し、db2evmon でテキスト変換して確認してください。
  • DEADLOCKS WITH DETAILS HISTORY: WITH DETAILS HISTORY オプションを指定することで、デッドロック参加者が直前に実行した SQL の履歴が記録されます。原因 SQL の特定に必須のオプションです。