Oracle
 sql >> Baza danych >  >> RDS >> Oracle

GWFG w Oracle RAC

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.


  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Korzystanie z Oracle JDeveloper 12c z bazą danych Oracle, część 1

  2. Uruchom procedurę składowaną w programie SQL Developer?

  3. EBS 12.2.5 i nowsze:Niewspółosiowość przycisku strony logowania

  4. ROWID (wyrocznia) – czy to ma zastosowanie?

  5. Czy istnieje funkcja do dzielenia ciągu w PL/SQL?