innodb_print_all_deadlocks默认为off,必须显式启用并确保log_error路径可写,否则死锁日志静默丢失;该参数不可动态持久化,需在my.cnf中配置并重启mysql。

因为 innodb_print_all_deadlocks 默认是 OFF,且 MySQL 错误日志路径权限或配置常被忽略——不是没能力记,而是开关关着、日志写不进去。
innodb_print_all_deadlocks 默认关闭是硬性事实
MySQL 8.0 启动后,innodb_print_all_deadlocks 的值始终为 OFF,哪怕 performance_schema 已启用、log_error 路径存在,死锁也绝不会自动落盘。这不是 bug,是官方默认策略:避免日志膨胀影响性能。
- 验证命令:
SHOW VARIABLES LIKE 'innodb_print_all_deadlocks';—— 几乎总是返回OFF - 临时开启(重启失效):
SET GLOBAL innodb_print_all_deadlocks = ON; - 永久生效必须改配置文件,在
[mysqld]段落下加:innodb_print_all_deadlocks = 1
log_error 路径存在 ≠ 日志能写入
即使开了 innodb_print_all_deadlocks,若 MySQL 进程对 log_error 指向的路径无写权限,死锁日志会静默丢弃,错误日志开头可能有 Could not open log file 提示。
MySQL 9.6.0是面向Linux平台的2026年创新版本,核心架构迎来重大革新。其将外键约束与级联操作从InnoDB引擎层上移至SQL层,确保所有数据变更均被完整记录至Binlog,彻底解决了CDC(变更数据捕获)与主从复制中的数据不一致难题。此外,该版本引入container_aware启动选项以原生适配容器环境,并对审计日志进行了组件化重构,为追求极致数据一致性与云原生体验的开发者提供了全新选择。
- 查当前路径:
SHOW VARIABLES LIKE 'log_error'; - 常见陷阱:Windows 下用
./data/mysql-error.log,但 phpEnv 的 MySQL 进程常以SYSTEM或当前用户身份运行,./data/目录可能不可写 - 安全做法:用绝对路径,如
C:\phpenv\mysql\data\mysql-error.log,并确认该文件或其父目录有写入权限
SHOW ENGINE INNODB STATUS 只保留最后一次死锁
很多人误以为执行 SHOW ENGINE INNODB STATUS\G 就算“监控到了”,其实它只缓存最近一次死锁快照,重启即清空,线上偶发死锁根本来不及捕获。
- 输出中真正要盯的是
LATEST DETECTED DEADLOCK区块,不是整段输出 - 该命令不依赖配置,适合应急排查,但不能替代
innodb_print_all_deadlocks+ 持久化错误日志 - 生产环境慎用:输出含原始 SQL,可能泄露敏感数据
phpEnv 环境下额外要注意配置文件位置和重启范围
phpEnv 自带的 MySQL 是精简版,my.ini 通常在 phpenv\mysql\my.ini(Windows)或 phpenv/mysql/my.cnf(macOS/Linux),改完必须单独重启 MySQL 服务,不是重启整个 phpEnv。
- 常见漏配项:
log_error = ./data/mysql-error.log路径中的./data/目录需手动创建,且确保 MySQL 进程可写 - 若 phpEnv 安装的是 MySQL 5.5,则
innodb_print_all_deadlocks不支持,只能靠脚本轮询SHOW ENGINE INNODB STATUS - 轮询脚本必须用
>>追加写入,不能用>覆盖,否则历史死锁全丢
真正容易被忽略的,是权限和路径的组合问题:开了开关、写了路径、却忘了让 MySQL 进程有权限往那个目录里写东西——日志就永远停留在“应该有”但“实际没有”的状态。










