DBAtlas · Атлас эксплуатации баз данных

Анализ взаимоблокировок InnoDB и запись всех их в журнал

MySQLПроизводительность

Команда

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

Что делает

Показывает две транзакции во взаимоблокировке, блокировку, которую каждая удерживает и ждёт (индекс, lock_mode, запись), и какую из них InnoDB откатил; счётчик отражает частоту, а журнал ошибок хранит прошлые взаимоблокировки.

Когда использовать

Когда приложение получает ошибку 1213 'Deadlock found when trying to get lock' или растёт число оповещений о взаимоблокировках.

Внимание

LATEST DETECTED DEADLOCK хранит только последнее событие и теряется при перезапуске. Имя индекса и lock_mode (X, S, gap, insert intention) в строках 'HOLDS THE LOCK(S)' / 'WAITING FOR THIS LOCK TO BE GRANTED' объясняют причину; 'WE ROLL BACK TRANSACTION (n)' указывает жертву. При 1213 приложение должно повторить всю транзакцию целиком. Постоянные решения: обращаться к строкам в одном порядке, делать транзакции короткими, использовать правильный индекс для уменьшения gap-блокировок и READ COMMITTED там, где это уместно. log_error_verbosity=3 включает также все сообщения Note; следите за ростом журнала ошибок. Переменной состояния Innodb_deadlocks в MySQL Community нет; для счётчика используйте INNODB_METRICS.

Открыть в DBAtlas →

Связанные материалы