Mam zakleszczenie zgłaszane w mojej 3-węzłowej bazie danych Oracle RAC (wersja 11.2.0.4), jak widać w dzienniku alertów. Ponieważ jest to baza danych Oracle RAC, zasoby są zarządzane globalnie i zaangażowany jest demon menedżera blokady (LMD). Wiadomość w dzienniku alertów wskazała mi plik śledzenia LMD, który zawierał ten globalny wykres oczekiwania (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
Uwaga: Rzeczywisty kod SQL i kilka innych szczegółów mogło zostać zmienionych w celu ochrony niewinnych.
Więc mam 3 sesje w impasie. Po jednym na instancję o identyfikatorach 4, 5 i 6.
Patrzyłem na plik śledzenia wygenerowany na instancji id 4. Nad GWFG była ta informacja:
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
Widzę więc informacje o wykonywanej maszynie, programie i instrukcji SQL. Identyfikator sesji użytkownika w kolorze czerwonym powyżej odpowiada wartości identyfikatora w GWFG. Spójrzmy ponownie na pierwsze dwie linie GFWG.
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
Tak więc instrukcja SQL i szczegóły sesji pasują do pierwszego wiersza. Ta sesja jest zablokowana na inst 4. Bloker jest na inst6 i jest identyfikowany jako 0x5513ed318 . Cóż, kto to jest? W tym GWFG nie ma żadnych innych szczegółów, które mogłyby nam pomóc w blokowaniu.
Aby dowiedzieć się więcej o blokerze, wszedłem na inst 6 i zrobiłem to:
cd /u01/app/oracle/diag/rdbms/admin/orcl/orcl6/trace
grep 0x5513ed318 *
Więc właśnie zrobiłem grep na wartość identyfikującą sesję i otrzymałem plik śledzenia LMD. Przeglądanie tego pliku śledzenia LMD w drugiej instancji daje mi szczegółowe informacje o sesji blokowania.
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
Widzę, że zablokowana sesja wydała instrukcję INSERT na stole, a bloker wydał polecenie DELETE na tym samym stole.
Zaangażowana jest inna sesja, ale w tym momencie podstawowe jest uzyskanie szczegółów sesji, wykonując te same czynności, które opisano powyżej.
Mamy nadzieję, że ten wpis na blogu pokazał, jak używać GWFG do diagnozowania instrukcji SQL i obiektu biorącego udział w globalnym zakleszczeniu. Znam dokładnie instrukcje SQL związane z zakleszczeniem, a co za tym idzie, również zaangażowane obiekty. Rozwiązanie problemu nie różni się od rozwiązania zakleszczeń w bazach danych o jednym wystąpieniu.
Aby uzyskać więcej informacji na temat Oracle RAC Global Enqueue Services (GES), przeczytaj rozdział 2 mojej książki Oracle RAC Performance Tuning.