はじめに
DB2における、テーブルのロックやデッドロックの調査をしていきましょう。
DB2では、ロックイベントモニターを使用してこれらのイベントを詳細に追跡することができます。この記事では、初心者でも理解しやすいようにDB2のロックイベントモニターの設定と使用方法を解説します。
ロックイベントとは?
ロックイベントとは、複数のトランザクションが同じデータにアクセスしようとした際に発生するイベントです。これが原因でデータベースのパフォーマンスが低下したり、最悪の場合はデッドロックが発生することもあります。
現在のイベントモニター設定状況の確認
DB2では、ロックに関するイベントモニターは主にLOCKEVMON
として設定されます。つまりはDB2の表として保存されます。
イベントモニターがデータをどこに保存するかはTARGET_TYPE
で決定され、F
はファイル、U
は未フォーマットのイベント表に保存されます。設定を確認するには以下のSQLコマンドを使用します:
db2 => SELECT SUBSTR(EVMONNAME,1,20) AS EVMON_NAME, TARGET_TYPE, OWNER FROM SYSCAT.EVENTMONITORS EVMON_NAME TARGET_TYPE OWNER -------------------- ----------- ---------------------------- DB2DETAILDEADLOCK F DB2INST1 LOCKEVMON U DB2INST1 2 レコードが選択されました。
参考:SYSCAT.EVENTMONITORS カタログ・ビュー
https://www.ibm.com/docs/ja/db2/11.5?topic=views-syscateventmonitors
結果を見ると、ロックイベントモニターLOCKEVMONは、「U」(LOCKEVMON
という未フォーマット表)に取得されていることがわかります。ロックイベントが発生するとLOCKEVMONにロック情報が蓄積されていきます。
次は、LOCKEVMONの内容をテキストに出力して解析していきましょう。
イベントモニターの情報をフォーマットする
設定されているロックイベントモニターが未フォーマットで保存されている場合、db2evmonfmt
ツールを使用して情報をフォーマットします。
このツールは以下のコマンドで実行できます:
cd ${JAVA_HOME} ${JAVA_HOME}/bin/java db2evmonfmt -d [DBNAME] -u DB2INST1 -p [PASSWORD] -ue LOCKEVMON -ftext -hours 24 -type locktimeout | tee -a [出力ファイル名]
オプションの説明
${JAVA_HOME}/bin/java | javaのインストールディレクトリ、DB2と一緒にインストールしたJAVAをしていするとよい |
-d | データベース名 |
-u | ユーザー ID |
-p | パスワード |
-ue | 未フォーマット・イベント表の名前 |
-ftext | テキスト文書にする |
-hours | 指定した直近の数時間内に発生したすべてのイベントを表示 |
-type | イベント・タイプ ロックタイムアウト…locktimeout デッドロック…deadlock |
|tee -a | db2evmonfmtの結果をファイルに保存 |
参考:イベント・モニター情報へのアクセス方法
https://www.ibm.com/docs/ja/db2/11.5?topic=monitors-methods-accessing-event-monitor-information
参考:db2evmonfmt ツール
https://www.ibm.com/docs/ja/db2/11.5?topic=monitors-methods-accessing-event-monitor-information
ロック情報を解析してみる
こちらはIBMのサポートページに見方の記事がありましたので、そちらを紹介します
参考:ロック・イベントの見方
https://www.ibm.com/support/pages/node/207149