久しぶりに Wait-for-graph(WFG) を見る用事があったのですが、すっかり忘れていました。
RAC の場合、デッドロック時の待機状況をしめす WFG は LMDプロセスが出力してくれます。基本、全ノードの LMD のトレースを確認するのがよいです。
Global Wait-For-Graph(WFG) at ddTS[0.9] :
BLOCKED 0xc0000000ef59db70 5 wq 2 cvtops x1 TX 0x1001b.0x40372(ext 0x2,0x0)[2002-0022-0003CECA] inst 3
BLOCKER 0xc0000000ef47faf8 5 wq 1 cvtops x28 TX 0x1001b.0x40372(ext 0x2,0x0)[3002-0028-00013E57] inst 2
BLOCKED 0xc0000000ef59f160 5 wq 2 cvtops x1 TX 0x6001d.0x3f91a(ext 0x2,0x0)[3002-0028-00013E57] inst 2
BLOCKER 0xc0000000ef59ef90 5 wq 1 cvtops x28 TX 0x6001d.0x3f91a(ext 0x2,0x0)[3002-0026-000152C8] inst 2
BLOCKED 0xc0000000ef59e0f8 5 wq 2 cvtops x1 TX 0x1e0008.0x26f4(ext 0xf,0x0)[3002-0026-000152C8] inst 2
BLOCKER 0xc0000000ef4ae510 5 wq 1 cvtops x28 TX 0x1e0008.0x26f4(ext 0xf,0x0)[2002-0022-0003CECA] inst 3
^^^^^^^ ^^^^^^^^^^^^^^^^^^ ^ ^^^^ ^^^^^^^^^^ ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ ^^^^^^^^^^^^^^^^^^^ ^^^^^^
*1 *2 *3 *4 *5 *6 *7 *8
*1 : BLOCKしている(BLOCKER) or BLOCKされている(BLOCKED)
*2 : lock pointer ?
*3 : lock の mode. null(0), SS(1), SX(2), S(3), SSX(4), X(5)
*4 : 獲得済みか、獲得待ちか。 granted queue(1), convert queue(2)
*5 : ???
*6 : enqueue
*7 : ???
*8 : 該当プロセスのインスタンス
よくわからないことも多いです。
*2 の情報から実行されているSQLなど確認することができます。
user session for deadlock lock 0xc0000000ef59db70
sid: xx ser: xxxxx audsid: 99999 user: 99/TEST
flags: (0x99) USR/- flags_idl: (0x1) BSY/-/-/-/-/-
flags2: (0x99999) -/-/INC
pid: 99 O/S info: user: test, term: UNKNOWN, ospid: 99999
image: oracle@test
client details:
O/S info: user: test , term: pts/0, ospid: 99999
machine: test program: sqlplus@test (TNS V1-V3)
application name: SQL*Plus, hash value=9999999999
current SQL:
update tab3 set c1=1000
"user session for deadlock lock" がWFGのトレースと同じように、LMD のトレースに出力されます。