アラートログに表示されるように、3ノードのOracle RACデータベース(バージョン11.2.0.4)でデッドロックが報告されています。これはOracleRACデータベースであるため、リソースはグローバルに管理され、Lock Manager Daemon(LMD)が関与します。アラートログのメッセージは、このグローバル待機グラフ(GWFG)を含むLMDトレースファイルを示していました。
*** 2015-02-27 04:16:33.183 Submitting asynchronized dump request [1c]. summary=[ges process stack dump (kjdglblkrdm1)]. Global blockers dump end:----------------------------------- Global Wait-For-Graph(WFG) at ddTS[0.394d] : BLOCKED 0x551b2c698 2 wq 2 cvtops x1 TM 0x11ffa3.0x0(ext 0x0,0x0)[6B000-0004-0000022D] inst 4 BLOCKER 0x5513ed318 2 wq 2 cvtops x1 TM 0x11ffa3.0x0(ext 0x0,0x0)[B6000-0006-00000099] inst 6 BLOCKED 0x5513ed318 4 wq 2 cvtops x1 TM 0x11ffa3.0x0(ext 0x0,0x0)[B6000-0006-00000099] inst 6 BLOCKER 0x5513ef5b8 4 wq 2 cvtops x1 TM 0x11ffa3.0x0(ext 0x0,0x0)[66000-0005-00000FDB] inst 5 BLOCKED 0x5513ef5b8 4 wq 2 cvtops x1 TM 0x11ffa3.0x0(ext 0x0,0x0)[66000-0005-00000FDB] inst 5 BLOCKER 0x551b2c698 4 wq 2 cvtops x1 TM 0x11ffa3.0x0(ext 0x0,0x0)[6B000-0004-0000022D] inst 4 * Cancel deadlock victim lockp 0x551b2c698
注:実際のSQLとその他のいくつかの詳細は、無実の人々を保護するために変更されている可能性があります。
したがって、デッドロックに関係する3つのセッションがあります。インスタンスID4、5、および6にそれぞれ1つ。
インスタンスID4で生成されたトレースファイルを見ていました。GWFGの上に次の情報がありました:
user session for deadlock lock 0x551b2c698 sid: 1727 ser: 539 audsid: 996549224 user: 13944/MP_SYS flags: (0x41) USR/- flags_idl: (0x1) BSY/-/-/-/-/- flags2: (0x40009) -/-/INC pid: 107 O/S info: user: oracle, term: UNKNOWN, ospid: 11229 image: [email protected] client details: O/S info: user: web-svc, term: web-server1, ospid: 4276:864 machine: DOMAIN\web-server1 program: iis.exe client info: user: WEBSERVICE current SQL: INSERT INTO MP_SYS.T2( column_list) SELECT column_list FROM MP_SYS.T1 WHERE MP_SYS.T1.P_ID=:B1 DUMP LOCAL BLOCKER: initiate state dump for DEADLOCK possible owner[107.11229] on resource TM-0011FFA3-00000000
そのため、実行されているマシン、プログラム、およびSQLステートメントに関する情報を確認できます。上記の赤いユーザーセッション識別子は、GWFGのID値に対応しています。 GFWGの最初の2行をもう一度見てみましょう。
BLOCKED 0x551b2c698 2 wq 2 cvtops x1 TM 0x11ffa3.0x0(ext 0x0,0x0)[6B000-0004-0000022D] inst 4 BLOCKER 0x5513ed318 2 wq 2 cvtops x1 TM 0x11ffa3.0x0(ext 0x0,0x0)[B6000-0006-00000099] inst 6
したがって、SQLステートメントとセッションの詳細はこの最初の行と一致します。このセッションはinst4でブロックされます。ブロッカーはinst6にあり、 0x5513ed318として識別されます。 。さてこれは誰ですか?このGWFGには、BLOCKERを支援する他の詳細はありません。
ブロッカーについて詳しく知るために、私はinst 6に行き、これを行いました:
cd /u01/app/oracle/diag/rdbms/admin/orcl/orcl6/trace
grep 0x5513ed318 *
そのため、セッション識別値でgrepを実行し、LMDトレースファイルを受け取りました。他のインスタンスのLMDトレースファイルを調べると、ブロッキングセッションの詳細がわかります。
user session for deadlock lock 0x5513ed318 sid: 1206 ser: 2673 audsid: 996459926 user: 13944/MP_SYS flags: (0x41) USR/- flags_idl: (0x1) BSY/-/-/-/-/- flags2: (0x40009) -/-/INC pid: 182 O/S info: user: oracle, term: UNKNOWN, ospid: 7049 image: [email protected] client details: O/S info: user: web-svc, term: web-server2, ospid: 4276:864 machine: DOMAIN\web-server2 program: iis.exe client info: user: WEBSERVICE current SQL: DELETE FROM MP_SYS.T1 WHERE P_ID = :B1 DUMP LOCAL BLOCKER: initiate state dump for DEADLOCK possible owner[182.7049] on resource TM-0011FFA3-00000000
ブロックされたセッションがテーブルに対してINSERTステートメントを発行し、ブロッカーが同じテーブルに対してDELETEを発行していたことがわかります。
別のセッションが含まれていますが、この時点では、上記と同じ手順を使用してセッションの詳細を取得するのが基本です。
うまくいけば、このブログエントリは、GWFGを使用してSQLステートメントとグローバルデッドロックに関係するオブジェクトを診断する方法を示しています。デッドロックに関係する正確なSQLステートメント、ひいては関係するオブジェクトも知っています。この問題の解決策は、単一インスタンスデータベースのデッドロック解決策と同じです。
Oracle RAC Global Enqueue Services(GES)の詳細については、 『Oracle RAC Performance Tuning』の第2章を参照してください。