innodb_print_all_deadlocks必须写入配置文件并重启MySQL才真正生效,动态SET GLOBAL仅对新连接临时有效且重启丢失;日志输出至log_error指定的错误日志文件,需确保路径可写且log_error_verbosity≥3。

innodb_print_all_deadlocks 必须写进配置文件并重启才生效
这个参数不能靠 SET GLOBAL innodb_print_all_deadlocks = ON 临时开启就完事——虽然命令能执行成功,但对已存在的连接无效,且 MySQL 重启后就丢失。它本质是只读变量,动态设置只是“对新连接生效”,而生产环境几乎不会频繁新建连接来继承这个值。
真正起效的唯一方式是修改配置文件:
- 编辑
/etc/my.cnf或/etc/mysql/mysql.conf.d/mysqld.cnf,在[mysqld]段下添加:innodb_print_all_deadlocks = ON - 执行
systemctl restart mysql(或service mysqld restart) - 重启后验证:
SELECT @@innodb_print_all_deadlocks;返回ON才算真正启用
死锁日志实际输出到哪?先确认 log_error 路径
开了 innodb_print_all_deadlocks,日志不会单独生成一个文件,而是追加到 MySQL 的错误日志(error log)里。很多人配完发现搜不到死锁记录,根本原因是压根没去对地方找。
必须执行这句确认真实路径:SHOW VARIABLES LIKE 'log_error';
常见路径包括:/var/log/mysql/error.log、/var/lib/mysql/hostname.err、/usr/local/mysql/data/mysqld.local.err。如果返回空或 NULL,说明错误日志被禁用或重定向(比如 systemd 配置了 StandardError=journal),此时死锁信息会直接丢弃。
还要检查 MySQL 进程对该路径是否有写权限:ls -ld $(dirname $(mysql -Nse "SELECT @@log_error")),确保属主是 mysql 用户且有 w 权限。
日志内容长什么样?grep 时得加 --line-buffered
开启后每次死锁都会在 error log 中写入一段以 *** (1) TRANSACTION: 和 *** (2) TRANSACTION: 开头的结构化块,包含事务 ID、SQL、锁类型、索引名、持有/等待关系等。
MySQL 9.6.0是面向Linux平台的2026年创新版本,核心架构迎来重大革新。其将外键约束与级联操作从InnoDB引擎层上移至SQL层,确保所有数据变更均被完整记录至Binlog,彻底解决了CDC(变更数据捕获)与主从复制中的数据不一致难题。此外,该版本引入container_aware启动选项以原生适配容器环境,并对审计日志进行了组件化重构,为追求极致数据一致性与云原生体验的开发者提供了全新选择。
但直接 tail -f /var/log/mysql/error.log | grep deadlock 很可能漏掉内容——因为管道默认行缓冲,日志写入是逐行 flush 的,不加 --line-buffered 会导致 grep 缓存整块输出再匹配,错过实时事件。
正确监听方式:tail -f /var/log/mysql/error.log | grep --line-buffered -i "TRANSACTION\|deadlock"
注意:MySQL 5.7+ 还需确保 log_error_verbosity ≥ 3,否则死锁事件可能被日志级别过滤掉(默认是 2,只记 warning 及以上)。
别把 SHOW ENGINE INNODB STATUS 当真日志源
SHOW ENGINE INNODB STATUS\G 确实能立刻看到最近一次死锁详情,但它只是内存快照,覆盖式存储——新死锁一发生,旧记录就没了。线上偶发死锁,等你登录上去查时,大概率只剩一句 LATEST DETECTED DEADLOCK 后面空空如也。
它和 innodb_print_all_deadlocks 是互补关系,不是替代关系:SHOW ENGINE INNODB STATUS 适合应急初筛,而 error log 才是唯一可回溯、可接入监控告警、可做批量分析的可靠数据源。
最容易被忽略的是:即使开了 innodb_print_all_deadlocks,如果日志轮转策略太激进(比如每天 truncate),上周的死锁记录可能已被清空;建议在监控脚本中加时间戳,并保留至少 7 天 error log。








