ロック・イベント・データの収集とレポートの生成

ロック・イベント・モニターを使用してロック・タイムアウト、ロック待機、およびデッドロック情報を収集することにより、ロッキングに関する問題の識別と解決に役立てることができます。 ロック・イベント・データは読めない形式で未フォーマット・イベント表に収集されるので、このタスクでは、可読テキスト・レポートを後から取得する方法について説明します。

始める前に

ロッキング・イベント・モニターを作成してロック・イベント・モニター・データを収集するには、DBADM または SQLADM 権限がなければなりません。

このタスクについて

ロック・イベント・モニターは、ロッキングに関する問題の識別と解決に役立つ関連情報を収集します。 ロック・イベント・モニターが収集するロック・イベントの情報には、例えば以下の情報が含まれます。
  • ロック・イベントになったロック。
  • ロック・イベントになったロックを要求または保持しているアプリケーション。
  • ロック・イベント時のアプリケーションの実行内容。
このタスクでは、特定のワークロードに関するロック・イベント・データを収集するための手順を説明します。 次のような状況下では、ロック・イベント・データを収集することをお勧めします。
  • MON_GET_WORKLOAD 表関数を使用したところ、ロック待機の値がいつもより長い。
  • アプリケーションが「ロック・タイムアウトのために、トランザクションがロールバックされました」という内容の -911 SQL 戻りコードを理由コード 68 と共に管理通知ログに戻す。詳しくは、メッセージ SQL0911N も参照してください。
  • 管理通知ログにデッドロック・イベント・メッセージ (「デッドロックのために、トランザクションがロールバックされました」という内容の -911 SQL 戻りコードで、理由コードが 2) が含まれている。ログ・メッセージが、2 つのアプリケーション (例えば、ワークロード FINANCE の一部であるアプリケーション A とワークロード PAYROLL の一部であるアプリケーション B) の間でロック・イベントが発生したことを示している。 詳しくは、メッセージ SQL0911N も参照してください。

制約事項

データ値を表示するには、EVMON_FORMAT_UE_* ルーチンに対する EXECUTE 特権が必要です。この特権は、SQLADM および DBADM 権限が暗黙的に保持しています。 未フォーマット・イベント表に対する SELECT 特権も必要です。DATAACCESS 権限を持つユーザーと、イベント・モニターおよび関連する未フォーマット・イベント表の作成者は、デフォルトでこの特権を保持しています。

手順

今後発生する可能性のあるロック・イベントに関する詳細情報を収集するには、以下のステップを実行します。

  1. 次の例に示すように、CREATE EVENT MONITOR FOR LOCKING ステートメントを使用して、lockevmon というロック・イベント・モニターを作成します。
    CREATE EVENT MONITOR lockevmon FOR LOCKING
       WRITE TO UNFORMATTED EVENT TABLE
    注: 以下は、イベント・モニターを作成する際に覚えておかなければならない重要点のリストです。
    • イベント・モニターは前もって作成できます。また、ディスク・スペースが使い尽くされることを心配する必要はありません。データベース・レベルまたはワークロード・レベルのデータ収集を活動化するまでは何も書き込まれません。
    • パーティション・データベース環境では、すべてのノードにわたるパーティション表スペースにイベント・モニターを配置するようにします。 こうしないと、パーティション表スペースが存在しないパーティションでは、ロック・イベントが見落とされることになります。
    • データ取得のための表へのアクセス時に進行中の作業によるハイパフォーマンス作業に対する妨害が最小になるように、表スペースとバッファー・プールをセットアップするようにします。
  2. 次に示すステートメントを実行して、ロック・イベント・モニター lockevmon を活動化します。
    SET EVENT MONITOR lockevmon STATE 1
  3. ワークロード・レベルでロック・イベント・データ収集を使用可能にするには、次に示す COLLECT 節の 1 つを使用して ALTER WORKLOAD ステートメントを発行します。COLLECT LOCK TIMEOUT DATA、COLLECT DEADLOCK DATA、または COLLECT LOCK WAIT DATA のいずれかです。COLLECT 節で WITH HISTORY オプションを指定します。データベース構成パラメーターを設定すると、データベース・レベルのロック・イベント・データ収集に影響を与え、すべてのワークロードが影響を受けます。
    ロック待機イベントの場合
    FINANCE アプリケーションについては 5 秒経過後に獲得されたロックのロック待機データを収集し、PAYROLL アプリケーションについては 10 秒経過後に獲得されたロックのロック待機データを収集するには、以下のステートメントを発行します。
    ALTER WORKLOAD finance COLLECT LOCK WAIT DATA WITH HISTORY AND VALUES
       FOR LOCKS WAITING MORE THAN 5 SECONDS
    ALTER WORKLOAD payroll COLLECT LOCK WAIT DATA 
       FOR LOCKS WAITING MORE THAN 10 SECONDS WITH HISTORY
    SAMPLE データベースの mon_lockwait データベース構成パラメーターを HIST_AND_VALUES 入力データ値を指定して設定し、mon_lw_thresh データベース構成パラメーターを 10 秒に設定するには、以下のコマンドを発行します。
    db2 update db cfg for sample using mon_lockwait hist_and_values
    db2 update db cfg for sample using mon_lw_thresh 10000000
    ロック・タイムアウト・イベントの場合
    FINANCE および PAYROLL アプリケーションのロック・タイムアウト・データを収集するには、以下のステートメントを発行します。
    ALTER WORKLOAD finance COLLECT LOCK TIMEOUT DATA WITH HISTORY
    ALTER WORKLOAD payroll COLLECT LOCK TIMEOUT DATA WITH HISTORY
    SAMPLE データベースの mon_locktimeout データベース構成パラメーターを HIST_AND_VALUES 入力データ値を指定して設定するには、次のコマンドを発行します。
    db2 update db cfg for sample using mon_locktimeout hist_and_values
    デッドロック・イベントの場合
    FINANCE および PAYROLL アプリケーションのデータを収集するには、以下のステートメントを発行します。
    ALTER WORKLOAD finance COLLECT DEADLOCK DATA WITH HISTORY
    ALTER WORKLOAD payroll COLLECT DEADLOCK DATA WITH HISTORY
    SAMPLE データベースの mon_deadlock データベース構成パラメーターを HIST_AND_VALUES 入力データ値を指定して設定するには、次のコマンドを発行します。
    db2 update db cfg for sample using mon_deadlock hist_and_values
  4. 別のロック・イベント通知を受け取るために、ワークロードを再実行します。
  5. データベースに接続します。
  6. 以下のいずれかのアプローチで、ロッキング・イベント・レポートを取得します。
    1. XML パーサー・ツール db2evmonfmt を使用して、未フォーマット・イベント表に収集されたイベント・データに基づいた、デフォルトのスタイルシートを使用するフラット・テキスト・レポートを生成します。例えば、次のようにします。
      java db2evmonfmt -d db_name -ue table_name -ftext -u user_id -p password
    2. EVMON_FORMAT_UE_TO_XML 表関数を使用して、XML 文書を取得します。
    3. EVMON_FORMAT_UE_TO_TABLES プロシージャーを使用して、データをリレーショナル表に出力します。
  7. レポートを分析し、ロック・イベントに関する問題の理由を判別して、問題を解決します。
  8. 以下のステートメントを実行するか、データベース構成パラメーターを再設定して、FINANCE と PAYROLL の両方のアプリケーションのロック・データ収集をオフにします。
    ロック待機イベントの場合
    ALTER WORKLOAD finance COLLECT LOCK WAIT DATA NONE
    ALTER WORKLOAD payroll COLLECT LOCK WAIT DATA NONE
    SAMPLE データベースの mon_lockwait データベース構成パラメーターをデフォルトの NONE 入力データ値を指定して再設定し、mon_lw_thresh データベース構成パラメーターを再設定してデフォルト値の 5 秒に戻すには、以下のコマンドを発行します。
    db2 update db cfg for sample using mon_lockwait none
    db2 update db cfg for sample using mon_lw_thresh 5000000
    ロック・タイムアウト・イベントの場合
    ALTER WORKLOAD finance COLLECT LOCK TIMEOUT DATA NONE
    ALTER WORKLOAD payroll COLLECT LOCK TIMEOUT DATA NONE
    SAMPLE データベースの mon_locktimeout データベース構成パラメーターをデフォルトの NONE 入力データ値を指定して再設定するには、次のコマンドを発行します。
    db2 update db cfg for sample using mon_locktimeout none
    デッドロック・イベントの場合
    ALTER WORKLOAD finance COLLECT DEADLOCK DATA NONE
    ALTER WORKLOAD payroll COLLECT DEADLOCK DATA NONE
    SAMPLE データベースの mon_deadlock データベース構成パラメーターをデフォルトの WITHOUT_HIST 入力データ値を指定して再設定するには、次のコマンドを発行します。
    db2 update db cfg for sample using mon_deadlock without_hist

次のタスク

該当アプリケーションを再実行して、ロッキングに関する問題が除去されたことを確認します。