Oracle
 sql >> Base de données >  >> RDS >> Oracle

GWFG dans Oracle RAC

J'ai un blocage signalé dans ma base de données Oracle RAC à 3 nœuds (version 11.2.0.4), comme on peut le voir dans le journal des alertes. Étant donné qu'il s'agit d'une base de données Oracle RAC, les ressources sont gérées globalement et le Lock Manager Daemon (LMD) est impliqué. Le message dans le journal des alertes m'a dirigé vers un fichier de trace LMD qui contenait ce 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

Remarque : Le code SQL réel et quelques autres détails peuvent avoir été modifiés pour protéger les innocents.

Donc là j'ai 3 séances impliquées dans l'impasse. Un chacun sur les ID d'instance 4, 5 et 6.

Je regardais le fichier de trace généré sur l'ID d'instance 4. Au-dessus du GWFG se trouvaient ces informations :

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

Ainsi, je peux voir des informations sur la machine, le programme et l'instruction SQL en cours d'exécution. L'identifiant de session utilisateur en rouge ci-dessus correspond à la valeur id dans le GWFG. Reprenons les deux premières lignes du 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

Ainsi, l'instruction SQL et les détails de la session correspondent à cette première ligne. Cette session est bloquée sur inst 4. Le bloqueur est sur inst6 et est identifié comme 0x5513ed318 . Eh bien, qui est-ce? Il n'y a pas d'autres détails dans ce GWFG pour nous aider avec le BLOQUEUR.

Pour en savoir plus sur le bloqueur, je suis allé à l'inst 6 et j'ai fait ceci :

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

Je viens donc de faire un grep sur la valeur d'identification de session et j'ai reçu un fichier de trace LMD. La recherche dans ce fichier de trace LMD sur l'autre instance me donne des détails sur la session de blocage.

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

Je peux voir que la session bloquée émettait une instruction INSERT sur une table et que le bloqueur émettait un DELETE sur la même table.

Une autre session est impliquée, mais à ce stade, il est élémentaire d'obtenir les détails de la session en suivant les mêmes étapes ci-dessus.

Espérons que cette entrée de blog a montré comment utiliser le GWFG pour diagnostiquer les instructions SQL et l'objet impliqué dans l'impasse globale. Je connais les instructions SQL exactes impliquées dans l'impasse et, par extension, les objets impliqués également. La résolution du problème n'est pas différente de la résolution des blocages dans les bases de données à instance unique.

Pour plus d'informations sur Oracle RAC Global Enqueue Services (GES), lisez le chapitre 2 de mon livre Oracle RAC Performance Tuning.