Oracle
 sql >> Base de Dados >  >> RDS >> Oracle

GWFG no Oracle RAC


Eu tenho um deadlock sendo relatado em meu banco de dados Oracle RAC de 3 nós (versão 11.2.0.4) como pode ser visto no Alert Log. Sendo este um banco de dados Oracle RAC, os recursos são gerenciados globalmente e o Lock Manager Daemon (LMD) se envolve. A mensagem no log de alerta me apontou para um arquivo de rastreamento LMD que continha este 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



Observação: o SQL real e alguns outros detalhes podem ter sido alterados para proteger os inocentes.

Então aí eu tenho 3 sessões envolvidas no impasse. Um em cada ID de instância 4, 5 e 6.



Eu estava olhando para o arquivo de rastreamento gerado no id de instância 4. Acima do GWFG estava esta informação:


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



Assim, posso ver informações sobre a máquina, o programa e a instrução SQL que está sendo executada. O identificador de sessão do usuário em vermelho acima corresponde ao valor de id no GWFG. Vejamos novamente as duas primeiras linhas do 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

Portanto, a instrução SQL e os detalhes da sessão correspondem a essa primeira linha. Esta sessão está bloqueada no inst 4. O bloqueador está no inst6 e é identificado como 0x5513ed318 . Bem, quem é este? Não há outros detalhes neste GWFG para nos ajudar com o BLOQUEADOR.

Para saber mais sobre o blocker, fui no inst 6 e fiz isso:
cd /u01/app/oracle/diag/rdbms/admin/orcl/orcl6/trace
grep 0x5513ed318 *

Então, eu apenas fiz um grep no valor de identificação da sessão e recebi um arquivo de rastreamento LMD. Observar esse arquivo de rastreamento LMD na outra instância me fornece detalhes sobre a sessão de bloqueio.
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

Eu posso ver que a sessão bloqueada estava emitindo uma instrução INSERT em uma tabela e o bloqueador estava emitindo um DELETE na mesma tabela.

Há outra sessão envolvida, mas, neste ponto, é elementar obter os detalhes da sessão usando as mesmas etapas acima.



Felizmente, esta entrada de blog mostrou como usar o GWFG para diagnosticar as instruções SQL e o objeto envolvido no impasse global. Eu sei conhecer as instruções SQL exatas envolvidas no impasse e, por extensão, os objetos envolvidos também. A resolução do problema não é diferente da resolução de deadlock em bancos de dados de instância única.



Para obter mais informações sobre o Oracle RAC Global Enqueue Services (GES), leia o Capítulo 2 do meu livro Oracle RAC Performance Tuning.