Analisar deadlocks do InnoDB e registrar todos eles
MySQLDesempenhoComando
-- 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;O que faz
Mostra as duas transações do deadlock, o lock que cada uma detém e aguarda (índice, lock_mode, registro) e qual delas o InnoDB desfez com rollback; o contador acompanha a frequência e o error log guarda os deadlocks anteriores.
Quando usar
Quando a aplicação recebe o erro 1213 'Deadlock found when trying to get lock' ou os alertas de deadlock aumentam.
Atenção
LATEST DETECTED DEADLOCK guarda apenas o último evento e se perde no restart. O nome do índice e o lock_mode (X, S, gap, insert intention) nas linhas 'HOLDS THE LOCK(S)' / 'WAITING FOR THIS LOCK TO BE GRANTED' explicam a causa; 'WE ROLL BACK TRANSACTION (n)' mostra a vítima. No 1213 a aplicação precisa repetir a transação inteira. Correções definitivas: acessar as linhas em ordem consistente, manter as transações curtas, usar o índice certo para reduzir gap locks e READ COMMITTED quando apropriado. log_error_verbosity=3 também habilita todas as mensagens Note; acompanhe o crescimento do error log. A variável de status Innodb_deadlocks não existe no MySQL Community; use INNODB_METRICS para o contador.
Relacionados
- Encontrar as consultas mais caras (digest do performance_schema)
- O que está rodando agora: sessões ativas, latência, locks e transações (sys.session)
- Diagnosticar 'Waiting for table metadata lock' e encontrar o verdadeiro bloqueador
- Transações de longa duração e history list length (atraso do purge)
- Capturar um slow log completo curto e analisá-lo com pt-query-digest
- Depurar um plano ruim com EXPLAIN ANALYZE e o optimizer trace