Jag har ett dödläge som rapporteras i min 3-nods Oracle RAC-databas (version 11.2.0.4) som kan ses i varningsloggen. Eftersom detta är en Oracle RAC-databas, hanteras resurser globalt och Lock Manager Daemon (LMD) involveras. Meddelandet i varningsloggen pekade mig på en LMD-spårningsfil som innehöll denna Global Wait-For-Graph (GWFG).
*** 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
Obs! Den faktiska SQL-koden och några andra detaljer kan ha ändrats för att skydda de oskyldiga.
Så där har jag 3 sessioner inblandade i dödläget. En vardera på instans-id 4, 5 och 6.
Jag tittade på spårningsfilen som genererades på instans id 4. Ovanför GWFG fanns denna information:
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
Så jag kan se information om maskinen, programmet och SQL-satsen som körs. Användarsessionsidentifieraren i rött ovan motsvarar id-värdet i GWFG. Låt oss titta på de två första raderna i GFWG igen.
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
Så SQL-satsen och sessionsdetaljerna matchar denna första rad. Denna session är blockerad på inst 4. Blockeraren är på inst6 och identifieras som 0x5513ed318 . Vem är det här? Det finns inga andra detaljer i denna GWFG som hjälper oss med BLOCKER.
För att lära mig mer om blockeraren gick jag till inst 6 och gjorde så här:
cd /u01/app/oracle/diag/rdbms/admin/orcl/orcl6/trace
grep 0x5513ed318 *
Så jag gjorde bara en grep på sessionsidentifieringsvärdet och fick en LMD-spårningsfil. Att titta i den LMD-spårningsfilen på den andra instansen ger mig detaljer om blockeringssessionen.
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
Jag kan se att den blockerade sessionen utfärdade en INSERT-sats på en tabell och blockeraren utfärdade en DELETE på samma tabell.
Det finns en annan session inblandad men vid denna tidpunkt är det grundläggande att få sessionsinformation med samma steg ovan.
Förhoppningsvis har det här blogginlägget visat hur man använder GWFG för att diagnostisera SQL-satserna och objektet som är involverat i det globala dödläget. Jag vet att de exakta SQL-satserna är involverade i dödläget, och i förlängningen även de inblandade objekten. Lösningen på problemet är inte annorlunda än dödlägeslösning i databaser med en instans.
För mer information om Oracle RAC Global Enqueue Services (GES), läs kapitel 2 i min Oracle RAC Performance Tuning-bok.