Cuando dos sesiones se esperan una a la otra, Oracle deshace la sentencia de una de ellas, le devuelve el ORA-00060 y graba el trace del deadlock por sí solo, sin ningún trace activado. WaitScope lee ese archivo y muestra quién esperaba a quién, en qué fila y con qué sentencia.
Antes de empezar
- Acceso al sistema operativo del servidor de la base de datos, o alguien que copie el archivo por usted.
- La hora aproximada del error y la instancia, para encontrar la línea correcta en el alert log.
- Nada que activar: el archivo ya se grabó cuando ocurrió el error. Cópielo pronto, porque la limpieza del ADR borra los traces antiguos.
Encontrar el archivo por el alert log
- Encuentre la carpeta de trace de la instancia:
select value from v$diag_info where name = 'Diag Trace'; - En esa carpeta, busque el ORA-00060 en el alert log en texto, el archivo
alert_<SID>.log:grep -n 'ORA-00060' alert_ORCL1.log - Lea la línea del error: trae la ruta del archivo de trace con el deadlock, en la misma carpeta.
- Copie ese
.trc. El.trmdel mismo nombre no es necesario.
Resultado: un archivo con el bloque DEADLOCK DETECTED ( ORA-00060 ), seguido del grafo (Deadlock graph) y de la información de las sesiones involucradas.
Enviar el archivo
Envíe el .trc como cualquier trace, desde el navegador o desde la app de Android: WaitScope reconoce el tipo por el contenido. En el Historial, la columna Tiempo total del análisis muestra deadlock.
Un mismo archivo puede tener más de un deadlock, cuando el proceso recibió el error más de una vez: el informe muestra una tarjeta por cada bloque DEADLOCK DETECTED.
Qué muestra el informe
El trace solo de deadlock no tiene perfil de tiempo. El informe tiene tres partes:
- Resumen: cuántos deadlocks, Detectado el con la hora y la línea del trace, Sesiones involucradas con el ciclo de espera, y el diagnóstico por el tipo de lock.
- Diagnóstico: un hallazgo de gravedad alta por deadlock, con el tipo de lock y las sesiones, y el enlace Ver deadlock (el hallazgo de deadlock).
- Deadlocks: el ciclo de espera, el Grafo de espera con el recurso, el tipo y los modos de quien espera y de quien retiene, las Sesiones involucradas con el usuario, PDB, máquina, programa, módulo, acción, fila esperada y SQL de cada una, y la Pila PL/SQL de la sesión que recibió el error (sección Deadlocks).
El informe de ejemplo viene de un trace sin deadlock, por eso no tiene esa sección.
Deadlock dentro de un trace 10046
Si la sesión tenía el trace 10046 activado cuando recibió el error, el bloque del deadlock va al mismo archivo. El informe trae el perfil completo y además:
- la sección Deadlocks, igual a la del trace solo de deadlock;
- el tiempo esperando el lock en el perfil, en una espera como
enq: TX - row lock contention; - el ORA-00060 en la sección Errores, con la sentencia que recibió el error (sección Errores).
Así se ve cuánto del tiempo total perdió la sesión esperando antes del error (espera por bloqueo).
Problemas frecuentes
- El alert log no muestra el ORA-00060. En RAC, el error puede haber ocurrido en otra instancia: busque en el alert log de cada una.
- El archivo indicado ya no existe. La limpieza del ADR borró el trace. La próxima vez, copie el archivo justo después del error.
- Deadlock entre instancias de RAC. WaitScope lee el deadlock por el bloque
DEADLOCK DETECTED. El deadlock entre instancias lo detecta el proceso LMD (procesos en segundo plano de Oracle), y su trace, con_lmden el nombre, tiene otro formato, que WaitScope no lee: el análisis de ese archivo termina con error, porque no tiene las líneas del evento 10046. Para medir el tiempo perdido con el lock, active el 10046 en las sesiones de la operación: la espera aparece en el perfil y el ORA-00060, en la sección Errores.
Próximos pasos
- Lea la sección Deadlocks campo por campo.
- Vea causas y correcciones en deadlock.
- Para medir el tiempo perdido con el lock, active el 10046 en la sesión (activar el trace con DBMS_MONITOR).