Tengo un interbloqueo informado en mi base de datos Oracle RAC de 3 nodos (versión 11.2.0.4) como se puede ver en el registro de alertas. Dado que se trata de una base de datos Oracle RAC, los recursos se gestionan de forma global y se involucra el Lock Manager Daemon (LMD). El mensaje en el registro de alertas me indicó un archivo de rastreo LMD que contenía este gráfico de espera global (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: Es posible que se hayan cambiado el SQL real y algunos otros detalles para proteger a los inocentes.
Así que tengo 3 sesiones involucradas en el interbloqueo. Uno para cada uno de los ID de instancia 4, 5 y 6.
Estaba mirando el archivo de rastreo generado en la instancia id 4. Sobre el GWFG estaba esta información:
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
Entonces puedo ver información sobre la máquina, el programa y la declaración SQL que se está ejecutando. El identificador de sesión de usuario en rojo arriba corresponde al valor de identificación en el GWFG. Veamos de nuevo las dos primeras líneas 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
Entonces, la instrucción SQL y los detalles de la sesión coinciden con esta primera línea. Esta sesión está bloqueada en la instancia 4. El bloqueador está en la instancia 6 y se identifica como 0x5513ed318 . Bueno, ¿quién es este? No hay otros detalles en este GWFG que nos ayuden con el BLOQUEADOR.
Para obtener más información sobre el bloqueador, fui a la instancia 6 e hice esto:
cd /u01/app/oracle/diag/rdbms/admin/orcl/orcl6/trace
grep 0x5513ed318 *
Así que acabo de hacer un grep en el valor de identificación de la sesión y me dieron un archivo de rastreo LMD. Buscar en ese archivo de rastreo LMD en la otra instancia me da detalles sobre la sesión de bloqueo.
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
Puedo ver que la sesión bloqueada emitía una instrucción INSERT en una tabla y el bloqueador emitía una ELIMINACIÓN en la misma tabla.
Hay otra sesión involucrada, pero en este punto, es elemental obtener los detalles de la sesión siguiendo los mismos pasos anteriores.
Con suerte, esta entrada de blog ha mostrado cómo usar el GWFG para diagnosticar las declaraciones SQL y el objeto involucrado en el interbloqueo global. Sé las declaraciones SQL exactas involucradas en el interbloqueo y, por extensión, también los objetos involucrados. La resolución del problema no es diferente a la resolución de puntos muertos en bases de datos de instancia única.
Para obtener más información sobre Oracle RAC Global Enqueue Services (GES), lea el Capítulo 2 de mi libro Oracle RAC Performance Tuning.