DB2 6 min read

Db2でロック待ちが解けない ― 誰が握っているかを特定する逆引き

Db2で処理が止まったまま返ってこない。誰かがロックを握っているのは分かるが、それがどの接続なのかが分からない――という場面の逆引きです。

先に押さえておくべき前提が1つあります。ロック待ちの情報は、待っている最中にしか存在しません。SQL0911N が返った時点で待ちは解消されており、誰が握っていたかを示す情報は消えています。調べるなら、詰まっている今のうちです。

まず見る(結論)

接続できる状態なら、この1本で被害者・犯人・対象表・待ち時間まで揃います。db2pd を読む必要はありません。

db2 "SELECT REQ_APPLICATION_HANDLE, HLD_APPLICATION_HANDLE, TABNAME,
            LOCK_WAIT_ELAPSED_TIME, REQ_STMT_TEXT
       FROM SYSIBMADM.MON_LOCKWAITS"

REQ_ が待たされている側、HLD_ が握っている側です。0件なら、その瞬間にロック待ちは起きていません。

DBに接続すらできないなら db2pd に切り替えます。

db2pd -db <DB名> -locks wait

症状 → 原因 → 対処(逆引き)

症状 よくある原因 まず打つ手
MON_LOCKWAITS が0件なのに遅い ロック待ちではない(I/O・実行計画・接続数) ロックから離れる。db2 list applications の Status を見る
HLD_CURRENT_STMT_TEXT が空 犯人がコミットせず放置している(実行中の文が無い) 列の仕様どおり。ハンドルを MON_GET_CONNECTION に渡して接続元を追う
SQL0911N rc=68 が出たあとで調べても何も無い 待ちの情報は消えている ロッキングイベントモニターを常設しておく(下記)
SQL0911N rc=2(デッドロック) ロックの取得順序が処理ごとに違う イベントモニターに両者のSQL文が残る。そこから順序を揃える
身に覚えのない表・行で待たされる 述語の列に索引が無く表スキャンになっている SYSCAT.INDEXES を確認。アクセス経路の問題がロックとして出ている
ずっと待ち続けて返らない LOCKTIMEOUT = -1(無限待ち) 秒数を設定し、アプリ側にリトライを用意する

待ち時間の単位は列によって違います。MON_LOCKWAITSLOCK_WAIT_ELAPSED_TIMEMON_GET_*LOCK_WAIT_TIMEミリ秒です。しきい値でアラートを組むときに間違えやすい箇所です。

いちばん多い誤解:犯人のSQL文は取れる

取れません。HLD_CURRENT_STMT_TEXT は「犯人がいま実行している文」を返す列です。ロック競合の典型は更新したまま放置された接続なので、実行中の文が存在せず空になります。犯人が何か実行中でも、入るのはロックを取った文ではなく、いま走っている別の文です。取れるのはアプリケーションハンドルまで、と割り切って先に進むのが速いです。

再発に備えるなら2行だけ

消えてしまう情報を残すには、ロッキングイベントモニターを先に仕込んでおきます。DB CFG の変更は要りません。

db2 "CREATE EVENT MONITOR LOCKEVMON FOR LOCKING WRITE TO UNFORMATTED EVENT TABLE"
db2 "SET EVENT MONITOR LOCKEVMON STATE 1"

よく見かける「MON_LOCKTIMEOUTHIST にする」という手順は不要です。そもそも HIST という値は SQL0104N で弾かれます(WITHOUT_HISTHIST_AND_VALUES は通ります)。デッドロックとロックタイムアウトは既定で収集対象になっているため、モニターを有効化するだけで記録されます。

それでも切り分からないとき(実機ログつきの詳解)

3つの経路(MON_LOCKWAITS / db2pd / イベントモニター)で何が取れて何が取れないのか、デッドロックとロックタイムアウトで情報量が変わる理由まで、Db2 12.1.4 の実機ログつきでZennにまとめています。

▶ Zennで続きを読む(無料)

Db2のロック待ちは誰が犯人か ― 犯人のSQLだけが取れない理由を実機で確かめる


実機ログつきの詳解を読む →

関連: SQL0911N の理由コード(デッドロックとタイムアウトの見分け)SQL1224N は接続数の上限とは限らない

この記事のような現場のTIPSを、Db2運用の全体像として12章に体系化しました。公式マニュアルには載らない「あのとき知っていれば」を減らすための1冊です。

現場で引ける Db2 の教科書

現場で引ける!Db2実践エンジニア・バイブル

Db2はRDBMS市場でシェア数%。情報が少なく、頼れるのは膨大な公式マニュアルだけ―― そんな現状を変えたくて、「なぜこの値にするのか」「この障害のとき次に何を見るのか」という、マニュアルに載っていない現場の文脈を1冊にまとめました。書いてあることはすべて実際の現場で経験したことです。

アーキテクチャ/構成パラメーター選定/セキュリティ/バックアップ・リカバリ/HADR/pureScale/日常点検の自動化/メモリ・ロック競合/SQLチューニング/RUNSTATS・REORG/MON_GET監視/現場の難題集 ―― 全12章+運用シェルスクリプト集

Zennで読む(¥2,000)→