sql >> Database >  >> RDS >> Oracle

GWFG in Oracle RAC

Er wordt een deadlock gerapporteerd in mijn Oracle RAC-database met 3 knooppunten (versie 11.2.0.4), zoals te zien is in het waarschuwingslogboek. Omdat dit een Oracle RAC-database is, worden resources wereldwijd beheerd en wordt de Lock Manager Daemon (LMD) erbij betrokken. Het bericht in het waarschuwingslogboek wees me op een LMD-traceerbestand dat deze Global Wait-For-Graph (GWFG) bevatte.

*** 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

Opmerking: De eigenlijke SQL en een paar andere details zijn mogelijk gewijzigd om de onschuldigen te beschermen.

Dus daar heb ik 3 sessies betrokken bij de impasse. Elk één op instantie-ID 4, 5 en 6.

Ik keek naar het traceerbestand dat werd gegenereerd op instantie-ID 4. Boven de GWFG stond deze informatie:

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

Ik kan dus informatie zien over de machine, het programma en de SQL-instructie die wordt uitgevoerd. De gebruikerssessie-ID in rood hierboven komt overeen met de id-waarde in de GWFG. Laten we nog eens naar de eerste twee regels van de GFWG kijken.

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

Dus de SQL-instructie en sessiedetails komen overeen met deze eerste regel. Deze sessie is geblokkeerd op inst 4. De blocker staat op inst6 en wordt geïdentificeerd als 0x5513ed318 . Wel wie is dit? Er zijn geen andere details in deze GWFG om ons te helpen met de BLOCKER.

Voor meer informatie over de blokkering ging ik naar inst 6 en deed dit:

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

Dus ik deed gewoon een grep op de sessie-identificatiewaarde en kreeg een LMD-traceerbestand. Als ik in dat LMD-traceerbestand op de andere instantie kijk, krijg ik details over de blokkeringssessie.

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

Ik kan zien dat de geblokkeerde sessie een INSERT-instructie op een tafel uitgaf en de blocker een DELETE op dezelfde tafel uitgaf.

Er is nog een sessie bij betrokken, maar op dit moment is het essentieel om sessiedetails te krijgen met dezelfde stappen hierboven.

Hopelijk heeft dit blogbericht laten zien hoe je de GWFG kunt gebruiken om de SQL-instructies en het object te diagnosticeren die betrokken zijn bij de wereldwijde impasse. Ik ken de exacte SQL-instructies die betrokken zijn bij de impasse, en bij uitbreiding ook de betrokken objecten. De oplossing voor het probleem is niet anders dan de deadlock-oplossing in databases met één instantie.

Lees hoofdstuk 2 van mijn Oracle RAC Performance Tuning-boek voor meer informatie over Oracle RAC Global Enqueue Services (GES).


  1. Lijst met gegevenstypen in SQL Server 2017

  2. Meer SQL, minder code, met PostgreSQL

  3. Hoe SQLite Avg() werkt

  4. Is het mogelijk om een ​​op functies gebaseerde index in MySQL te hebben?