!!!DB2 ロック・イベントのモニター [DB2 v10.1][Database] {{amazon 479813189X}} *http://www-01.ibm.com/support/knowledgecenter/SSEPGG_10.1.0/com.ibm.db2.luw.admin.mon.doc/doc/c0054136.html?lang=ja !次のような状況下では、ロック・イベント・データを収集する *MON_GET_WORKLOAD 表関数を使用したところ、ロック待機の値がいつもより長い。 *アプリケーションが「ロック・タイムアウトのために、トランザクションがロールバックされました」という内容の -911 SQL 戻りコードを理由コード 68 と共に管理通知ログに戻す *管理通知ログにデッドロック・イベント・メッセージ !!MON_GET_WORKLOAD 表関数 - ワークロード・メトリックの取得 *http://www-01.ibm.com/support/knowledgecenter/SSEPGG_10.1.0/com.ibm.db2.luw.sql.rtn.doc/doc/r0053940.html?lang=ja *メンバー全体で集約し、ロック待機時間の長い順に、ワークロードごとのロック情報を表示します。 SELECT varchar(workload_name,30) as workload_name, sum(lock_wait_time) as total_lock_wait_time, sum(lock_waits) as total_lock_waits, sum(lock_timeouts) as total_lock_timeouts, sum(lock_escals) as total_lock_escals FROM TABLE(MON_GET_WORKLOAD('',-2)) AS t GROUP BY workload_name ORDER BY total_lock_wait_time DESC ::列抜粋 ,列,内容 ,DEADLOCKS,deadlocks - デッドロック検出数 ,LOCK_ESCALS,lock_escals - ロック・エスカレーション数 ,LOCK_TIMEOUTS,lock_timeouts - ロック・タイムアウト数 ,LOCK_WAIT_TIME,lock_wait_time - ロック待機中の時間 ,LOCK_WAITS,lock_waits - ロック待機数 SELECT WORKLOAD_NAME, DEADLOCKS, LOCK_WAIT_TIME, LOCK_WAITS, LOCK_ESCALS, LOCK_TIMEOUTS FROM TABLE(MON_GET_WORKLOAD(null,-2)); !!ロック・イベント・モニター *ロック・データを収集してロック競合状態の診断および修正作業を単純化するように設計 *ロック・イベントの発生時に、それらのロック・イベントに関する説明情報をキャプチャー *ロック・イベントの原因となっているロック競合に関係した主要なアプリケーションを識別 **ロック・リクエスター(エラーを受け取った、ロックを待機したアプリケーション) **ロック所有者 *バイナリー・フォーマット、通常の表にイベント情報を書き込む **[イベント・モニターの出力オプション|http://www-01.ibm.com/support/knowledgecenter/SSEPGG_10.1.0/com.ibm.db2.luw.admin.mon.doc/doc/c0059021.html?lang=ja-jp] ""デッドロック・イベント・モニターは非推奨、機能は、ロック・イベント・モニターに統合 *[推奨されないロック・モニター機能|http://www-01.ibm.com/support/knowledgecenter/SSEPGG_10.1.0/com.ibm.db2.luw.admin.mon.doc/doc/c0054136.html?lang=ja-jp#c0054136__DeprecatedLockMonitoringFunctional] !!機能の有効化手順 !CREATE EVENT MONITOR FOR LOCKING ステートメントを使用して LOCK EVENT モニターを作成 *モニターの名前を入力 *出力形式として UE 表を使用する場合は、ロック・イベント・データが書き込まれる未フォーマット・イベント表の名前も入力 *出力に通常の表を使用するように選択した場合は、 デフォルトの表名が割り当てられます ::バイナリー・データの扱い *db2evmonfmt Java アプリケーションを使用して XML またはテキスト文書に変換できる *EVMON_FORMAT_UE_TO_XML 表関数を使用して XML レポート文書にフォーマット *EVMON_FORMAT_UE_TO_TABLES プロシージャーを使用してリレーショナル表にフォーマット !ロック・イベント・データをキャプチャーするレベルを指定 ::ワークロード *既存のワークロードを変更する *CREATE または ALTER WORKLOAD ステートメントを使用して新規ワークロードを作成する *ワークロード・レベルで、キャプチャーするロック・イベント・データのタイプ、およびロックに関係したアプリケーションの SQL ステートメント履歴および入力値を必要とするかどうかを指定 ""SQL ステートメント履歴および入力値のキャプチャーにより、プロセッサー時間、メモリー、およびストレージの使用量が増大しますが、 ロック問題を適切にデバッグするには、多くの場合このレベルの詳細情報が必要 ::データベース・レベルで収集し、すべての DB2 ワークロードに影響を与える ,値,内容 ,mon_lockwait,ロック待機イベントの生成を制御 ,mon_locktimeout,ロック・タイムアウト・イベントの生成を制御 ,mon_deadlock,ッドロック・イベントの生成を制御 ,mon_lw_thresh,mon_lockwait のイベントが生成されるまでのロック待機時間を制御 !!ロック・イベント・データの収集とレポートの生成 *http://www-01.ibm.com/support/knowledgecenter/SSEPGG_10.1.0/com.ibm.db2.luw.admin.mon.doc/doc/t0055093.html?lang=ja *DBADM または SQLADM 権限 が必要 *データ値を表示するには、EVMON_FORMAT_UE_* ルーチンに対する EXECUTE 特権が必要(DBADM 権限が暗黙的に保持) !!手順 !lockevmon というロック・イベント・モニターを作成 CREATE EVENT MONITOR lockevmon FOR LOCKING WRITE TO UNFORMATTED EVENT TABLE *イベント・モニターは前もって作成できます。また、ディスク・スペースが使い尽くされることを心配する必要はありません。 *データベース・レベルまたはワークロード・レベルのデータ収集を活動化するまでは何も書き込まれません。 *データ取得のための表へのアクセス時に進行中の作業によるハイパフォーマンス作業に対する妨害が最小になるように、表スペースとバッファー・プールをセットアップするようにします !ロック・イベント・モニター lockevmon を活動化 SET EVENT MONITOR lockevmon STATE 1 !ロック・イベント・データ収集を使用可能 ::ワークロード・レベル *COLLECT 節の 1 つを使用して ALTER WORKLOAD ステートメントを発行 *COLLECT 節で WITH HISTORY オプションを指定 ::すべてのワークロード *データベース構成パラメーターを設定すると、データベース・レベルのロック・イベント・データ収集に影響を与え、すべてのワークロードが影響 ::ロック待機イベントの場合(COLLECT LOCK WAIT DATA) *例 **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 ::ロック・タイムアウト・イベントの場合(COLLECT LOCK TIMEOUT DATA) *例 **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 ::デッドロック・イベントの場合(COLLECT DEADLOCK DATA) *例 **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 !ロッキング・イベント・レポートを取得 *ワークロードの再実行とデータベースへの接続 ::XML パーサー・ツール db2evmonfmt を使用 *C:\IBM\SQLLIB\samples\java\jdbc\db2evmonfmt.java から適当なディレクトリでコンパイル java db2evmonfmt -d db_name -ue table_name -ftext -u user_id -p password SELECT evmon.xmlreport FROM TABLE ( EVMON_FORMAT_UE_TO_XML( 'LOG_TO_FILE',FOR EACH ROW OF ( SELECT * FROM lockevmon ORDER BY EVENT_ID, EVENT_TIMESTAMP, EVENT_TYPE, MEMBER ))) AS evmon !未フォーマット・イベント表からデータを抽出するルーチン *http://www-01.ibm.com/support/knowledgecenter/SSEPGG_10.1.0/com.ibm.db2.luw.admin.mon.doc/doc/c0059091.html?lang=ja ::EVMON_FORMAT_UE_TO_TABLES *http://www-01.ibm.com/support/knowledgecenter/SSEPGG_10.5.0/com.ibm.db2.luw.admin.mon.doc/doc/r0055559.html?lang=ja ::EVMON_FORMAT_UE_TO_XML !ロック・データ収集をオフ ::ロック待機イベントの場合 ALTER WORKLOAD finance COLLECT LOCK WAIT DATA NONE ALTER WORKLOAD payroll COLLECT LOCK WAIT DATA NONE 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 db2 update db cfg for sample using mon_locktimeout none ::デッドロック・イベントの場合 ALTER WORKLOAD finance COLLECT DEADLOCK DATA NONE ALTER WORKLOAD payroll COLLECT DEADLOCK DATA NONE db2 update db cfg for sample using mon_deadlock without_hist {{amazon 4774145971}}