Oracle
 sql >> Database >  >> RDS >> Oracle

GWFG in Oracle RAC

È stato segnalato un deadlock nel mio database Oracle RAC a 3 nodi (versione 11.2.0.4) come si può vedere nel registro degli avvisi. Trattandosi di un database Oracle RAC, le risorse vengono gestite a livello globale e viene coinvolto il Lock Manager Daemon (LMD). Il messaggio nel registro degli avvisi mi ha indicato un file di traccia LMD che conteneva questo 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

Nota: l'SQL effettivo e alcuni altri dettagli potrebbero essere stati modificati per proteggere gli innocenti.

Quindi ho 3 sessioni coinvolte nello stallo. Uno ciascuno su ID istanza 4, 5 e 6.

Stavo guardando il file di traccia generato sull'ID istanza 4. Sopra il GWFG c'era questa informazione:

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

Quindi posso vedere le informazioni sulla macchina, sul programma e sull'istruzione SQL in esecuzione. L'identificatore della sessione utente in rosso sopra corrisponde al valore id nel GWFG. Diamo un'occhiata alle prime due righe del 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

Quindi l'istruzione SQL e i dettagli della sessione corrispondono a questa prima riga. Questa sessione è bloccata su inst 4. Il blocco è su inst6 ed è identificato come 0x5513ed318 . Bene, chi è questo? Non ci sono altri dettagli in questo GWFG per aiutarci con il BLOCCO.

Per saperne di più sul blocker, sono andato a inst 6 e ho fatto questo:

cd /u01/app/oracle/diag/rdbms/admin/orcl/orcl6/trace
grep 0x5513ed318 *

Quindi ho appena eseguito un grep sul valore di identificazione della sessione e mi è stato fornito un file di traccia LMD. Guardare in quel file di traccia LMD sull'altra istanza mi fornisce dettagli sulla sessione di blocco.

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

Vedo che la sessione bloccata stava emettendo un'istruzione INSERT su una tabella e il blocco stava emettendo un DELETE sulla stessa tabella.

È coinvolta un'altra sessione, ma a questo punto è elementare ottenere i dettagli della sessione utilizzando gli stessi passaggi precedenti.

Si spera che questo post di blog abbia mostrato come utilizzare GWFG per diagnosticare le istruzioni SQL e l'oggetto coinvolto nel deadlock globale. Conosco le esatte istruzioni SQL coinvolte nel deadlock e, per estensione, anche gli oggetti coinvolti. La risoluzione del problema non è diversa dalla risoluzione dei deadlock nei database a istanza singola.

Per ulteriori informazioni su Oracle RAC Global Enqueue Services (GES), leggi il capitolo 2 del mio libro Oracle RAC Performance Tuning.