MySQL死锁排查核心是“定位—分析—验证”三步,需通过SHOW ENGINE INNODB STATUS获取最近死锁详情,启用innodb_print_all_deadlocks记录全量日志,并结合INNODB_TRX、INNODB_LOCK_WAITS等视图分析事务与锁等待关系,再结合业务SQL还原访问顺序、索引缺失、长事务及批量操作等成因。
MySQL死锁排查核心是“定位—分析—验证”三步,关键在于快速获取死锁现场信息,并结合事务行为与锁机制判断冲突根源。不需要重启服务,也不必依赖外部工具,原生命令就能完成大部分诊断。
执行 SHOW ENGINE INNODB STATUS\G,重点查找输出中以 ------------------------ LATEST DETECTED DEADLOCK ------------------------ 开头的区块。这部分包含:
B 总是回滚代价更小的那个)仅靠 SHOW ENGINE INNODB STATUS 只能看最后一次死锁,线上高频场景需长期留痕:
SHOW VARIABLES LIKE 'innodb_print_all_deadlocks';
SET GLOBAL innodb_print_all_deadlocks = ON;
log_error 参数指定,常见如 /var/lib/mysql/error.log 或 /usr/local/mysql/data/mysqld.local.err)当死锁频繁发生或想提前发现隐患时,主动扫描当前锁状态:
SELECT * FROM information_schema.INNODB_TRX;(关注 trx_state、trx_started、trx_query)SELECT * FROM INFORMATION_SCHEMA.INNODB_LOCKS;(MySQL 8.0.18+ 已弃用,建议用 performance_schema.data_locks 替代)SELECT * FROM INFORMATION_SCHEMA.INNODB_LOCK_WAITS;(可关联 trx 和 locks 表定位谁等谁)SHOW OPEN TABLES WHERE In_use > 0;
光有日志不够,要还原执行逻辑。典型模式包括: