Analizar los deadlocks de InnoDB y registrarlos todos
MySQLRendimientoComando
-- Latest deadlock: LATEST DETECTED DEADLOCK section (only the most recent is kept)
SHOW ENGINE INNODB STATUS\G
-- Total deadlock counter
SELECT NAME, COUNT FROM information_schema.INNODB_METRICS WHERE NAME = 'lock_deadlocks';
-- Write every deadlock to the error log (logged at Note level, needs verbosity 3)
SET PERSIST innodb_print_all_deadlocks = ON;
SET PERSIST log_error_verbosity = 3;Qué hace
Muestra las dos transacciones del deadlock, el bloqueo que cada una mantiene y espera (índice, lock_mode, registro) y cuál revirtió InnoDB; el contador mide la frecuencia y el error log conserva los deadlocks pasados.
Cuándo usarlo
Cuando la aplicación recibe el error 1213 'Deadlock found when trying to get lock' o aumentan las alertas de deadlock.
Precaución
LATEST DETECTED DEADLOCK solo conserva el último evento y se pierde al reiniciar. El nombre del índice y el lock_mode (X, S, gap, insert intention) en las líneas 'HOLDS THE LOCK(S)' / 'WAITING FOR THIS LOCK TO BE GRANTED' explican la causa; 'WE ROLL BACK TRANSACTION (n)' muestra la víctima. Ante un 1213 la aplicación debe reintentar la transacción completa. Soluciones permanentes: acceder a las filas en un orden consistente, mantener las transacciones cortas, usar el índice adecuado para reducir los gap locks y READ COMMITTED donde corresponda. log_error_verbosity=3 también habilita todos los mensajes Note; vigile el crecimiento del error log. La variable de estado Innodb_deadlocks no existe en MySQL Community; use INNODB_METRICS para el contador.
Relacionado
- Encontrar las consultas más costosas (performance_schema digest)
- Qué se está ejecutando ahora: sesiones activas, latencia, bloqueos y transacciones (sys.session)
- Diagnosticar 'Waiting for table metadata lock' y encontrar el bloqueador real
- Transacciones de larga duración e history list length (retraso de purge)
- Capturar un slow log completo breve y analizarlo con pt-query-digest
- Depurar un mal plan con EXPLAIN ANALYZE y el optimizer trace