innodb_print_all_deadlocks=on 可使 innodb 在每次死锁时自动将完整事务、sql、锁信息等写入错误日志;需在配置文件中启用并重启 mysql,该变量不可动态设置,且依赖错误日志正常开启与可写权限。

注意:innodb_print_all_deadlocks 是 MySQL 5.6.2+ 引入的配置项,但仅对 InnoDB 存储引擎有效,且仅在死锁发生时由 InnoDB 自动触发写入错误日志(error log),它本身不是 SQL 命令,也不能“主动调用”或“实时打印”。
要让 MySQL 将每次死锁的完整细节(包括事务、SQL、锁等待关系、堆栈等)全部输出到错误日志,需正确配置并确保环境满足条件:
1. 开启 innodb_print_all_deadlocks 参数
该参数默认为 OFF,必须显式启用:
- 在 MySQL 配置文件(如
my.cnf或my.ini)的[mysqld]段中添加:
innodb_print_all_deadlocks = ON
- 修改后需重启 MySQL 服务(动态 SET 不生效):
SET GLOBAL innodb_print_all_deadlocks = ON; -- ❌ 无效!该变量是只读的
验证是否生效(重启后执行):
SHOW VARIABLES LIKE 'innodb_print_all_deadlocks'; -- 应返回 'ON'
2. 确保错误日志已启用且路径可写
死锁信息会追加到 MySQL 的错误日志(error log),不是慢查询日志或 general log。
- 确认错误日志已开启(MySQL 5.7+ 默认开启;旧版本需检查
log_error配置):
SHOW VARIABLES LIKE 'log_error';
- 输出路径应有 MySQL 进程(如
mysql用户)的写权限;否则死锁信息会静默丢失。 - 若使用 systemd 管理 MySQL,还需检查
StandardError=journal是否重定向了错误流(可能导致日志不落盘),建议显式配置log_error到文件。
3. 死锁发生时,日志中会自动记录完整上下文
一旦发生死锁,InnoDB 会在 error log 中输出类似以下结构的详细块(含时间戳、事务ID、SQL语句、锁类型、等待/持有关系等):
2024-05-20T10:23:45.123456Z 0 [Note] InnoDB: Transactions deadlock detected, dumping detailed information. *** (1) TRANSACTION: TRANSACTION 123456789, ACTIVE 2 sec starting index read mysql tables in use 1, locked 1 LOCK WAIT 3 lock struct(s), heap size 1136, 2 row lock(s) MySQL thread id 10, OS thread handle 140234567890123, query id 200 localhost root updating UPDATE accounts SET balance = balance - 100 WHERE id = 1; *** (1) WAITING FOR THIS LOCK TO BE GRANTED: RECORD LOCKS space id 108 page no 3 n bits 72 index PRIMARY of table `test`.`accounts` trx id 123456789 lock_mode X locks rec but not gap waiting *** (2) TRANSACTION: TRANSACTION 123456790, ACTIVE 1 sec starting index read ... *** WE ROLL BACK TRANSACTION (1)
✅ 这就是 `innodb_print_all_deadlocks = ON` 的效果 —— 每次死锁都完整记录,无需手动触发。
4. 补充建议:提升死锁诊断效率
- 配合 slow_query_log + long_query_time=0(谨慎)可捕获所有慢事务 SQL,辅助定位高风险语句。
-
定期分析 error log:可用
grep -A 20 "Transactions deadlock detected" /var/log/mysql/error.log快速提取死锁段。 - 应用层捕获死锁异常(如 MySQL Error 1213),记录业务上下文(用户ID、操作流水号、输入参数),与 error log 时间戳对齐分析。
- 避免长事务、按固定顺序访问表、减少事务内 SQL 复杂度,从源头降低死锁概率。
不复杂但容易忽略











