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

GWFG i Oracle RAC

Jeg har et dødvande, der bliver rapporteret i min 3-node Oracle RAC-database (version 11.2.0.4), som det kan ses i advarselsloggen. Da dette er en Oracle RAC-database, administreres ressourcer globalt, og Lock Manager Daemon (LMD) bliver involveret. Meddelelsen i advarselsloggen pegede mig på en LMD-sporingsfil, som indeholdt denne 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

Bemærk: Den faktiske SQL og et par andre detaljer kan være blevet ændret for at beskytte de uskyldige.

Så der har jeg 3 sessioner involveret i dødvandet. Én hver på instans-id 4, 5 og 6.

Jeg kiggede på sporingsfilen, der blev genereret på instans id 4. Over GWFG var denne information:

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

Så jeg kan se oplysninger om maskinen, programmet og SQL-sætningen, der udføres. Brugersessionsidentifikatoren i rødt ovenfor svarer til id-værdien i GWFG. Lad os se på de første to linjer i GFWG igen.

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

Så SQL-sætningen og sessionsdetaljerne matcher denne første linje. Denne session er blokeret på inst 4. Blokeren er på inst6 og er identificeret som 0x5513ed318 . Jamen hvem er det her? Der er ingen andre detaljer i denne GWFG til at hjælpe os med BLOCKER.

For at lære mere om blokeringen gik jeg til inst 6 og gjorde dette:

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

Så jeg lavede lige et grep på sessionsidentifikationsværdien og fik en LMD-sporingsfil. At kigge i den LMD-sporingsfil på den anden instans giver mig detaljer om blokeringssessionen.

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

Jeg kan se, at den blokerede session udsendte en INSERT-sætning på en tabel, og blokeren udsendte en DELETE på den samme tabel.

Der er en anden session involveret, men på dette tidspunkt er det elementært at få sessionsdetaljer ved at bruge de samme trin ovenfor.

Forhåbentlig har dette blogindlæg vist, hvordan man bruger GWFG til at diagnosticere SQL-sætningerne og objektet involveret i den globale dødvande. Jeg kender de nøjagtige SQL-sætninger, der er involveret i dødvandet, og i forlængelse heraf også de involverede objekter. Løsningen på problemet er ikke anderledes end deadlock-løsning i enkeltinstansdatabaser.

For mere information om Oracle RAC Global Enqueue Services (GES), læs kapitel 2 i min Oracle RAC Performance Tuning-bog.


  1. How to_date() virker i PostgreSQL

  2. Hvordan indstiller jeg ORDER BY-parametre ved hjælp af forberedt PDO-erklæring?

  3. Sådan installeres SQL Server på Ubuntu 18.04

  4. MariaDB Cluster Offline Installation til CentOS