DBAtlas · Atlas de operações de banco de dados

Analisar deadlocks do InnoDB e registrar todos eles

MySQLDesempenho

Comando

-- 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.

Abrir no DBAtlas →

Relacionados