pt-deadlock-logger 是 Percona Toolkit 中的死锁日志解析工具,不能实时监听或主动轮询,仅从 MySQL 错误日志(需 innodb_print_all_deadlocks=ON)中提取已发生的死锁事件并格式化输出,适用于事后归因和周期性巡检。

pt-deadlock-logger 是什么,它能直接监控死锁吗
pt-deadlock-logger 不是实时监听工具,也不会主动轮询或注入 hook 到 MySQL 内核。它本质是一个日志解析器 + 定时采集器:只从 MySQL 的错误日志(error_log)里提取已发生的死锁事件,并格式化输出。这意味着——
- 死锁必须已发生并被 MySQL 记录到
error_log中(需开启innodb_print_all_deadlocks = ON) - 如果错误日志被轮转、清空或权限不足,
pt-deadlock-logger就会漏掉记录 - 它不捕获未写入错误日志的“隐式死锁”(比如某些早期 MySQL 版本在
SHOW ENGINE INNODB STATUS里短暂存在但未落盘的情况)
所以别指望它做预警,它只适合事后归因和周期性巡检。
如何配置 MySQL 让 pt-deadlock-logger 能抓到死锁
确保以下三项同时生效,缺一不可:
-
innodb_print_all_deadlocks = ON(动态可设:SET GLOBAL innodb_print_all_deadlocks = ON;但建议写进my.cnf的[mysqld]段并重启) - MySQL 错误日志路径明确且
pt-deadlock-logger有读取权限(例如/var/log/mysql/error.log) - 错误日志格式为文本(非 syslog 或 JSON),且未被
log_error_verbosity过度压缩(MySQL 8.0.22+ 默认为 3,足够;低于该版本建议设为log_error_verbosity = 3)
常见踩坑点:
-log_error 指向管道或 systemd-journald(如 /dev/stderr),pt-deadlock-logger 无法读取
- 使用了 logrotate 但没配 copytruncate 或 create,导致日志句柄失效后新死锁不再写入原文件
- MySQL 启动时未加载配置,innodb_print_all_deadlocks 实际仍是 OFF(用 SELECT @@innodb_print_all_deadlocks; 确认)
怎么运行 pt-deadlock-logger 抓最近的死锁
最常用模式是「一次采集 + 输出到终端」,适合调试:
pt-deadlock-logger --user=root --password=xxx --socket=/var/run/mysqld/mysqld.sock --log=/var/log/mysql/error.log
关键参数说明:
---socket 或 --host+--port:指定 MySQL 连接方式(推荐 socket,避免网络开销)
- --log:必须指向 MySQL 的 error_log 文件路径(不是 slow log,也不是 general log)
- --run-time 和 --interval:用于守护模式(如每 30 秒扫一次日志),但注意高频率扫描可能增加 I/O 压力
- --dest D=percona,t=deadlocks:把结果存进数据库表(需提前建好),方便聚合分析
输出字段中重点关注:ts(时间)、thread(线程 ID)、txn_id(事务 ID)、query(阻塞 SQL)——这些是定位业务代码位置的关键线索。
为什么有时 pt-deadlock-logger 找不到死锁,但 SHOW ENGINE INNODB STATUS 里能看到
这是最常被忽略的差异点:
-
SHOW ENGINE INNODB STATUS显示的是最后一次死锁(覆盖式),且仅保留在内存中,MySQL 重启即丢失 -
pt-deadlock-logger依赖的是错误日志持久化内容,只要innodb_print_all_deadlocks = ON,每次死锁都会追加一行(含完整事务堆栈)
所以如果没看到,优先检查:
-tail -n 100 /var/log/mysql/error.log | grep -i deadlock —— 看日志里有没有真实记录
- mysql -e "SELECT @@innodb_print_all_deadlocks;" —— 确认变量值确实是 1
- ls -l /var/log/mysql/error.log* —— 确认当前正在写的日志文件名是否与 --log 参数一致(logrotate 后可能变成 error.log.1)
死锁信息一旦没落盘,就彻底不可追溯;而 pt-deadlock-logger 的价值,恰恰在于把那些稍纵即逝的现场,变成可查、可统计、可告警的文本行。


















