pt-deadlock-logger需正确配置才能持续运行:dsn须指定socket路径,mysql账户需select和process权限,且必须开启innodb_print_all_deadlocks=on以捕获全部死锁,日志写入错误日志而非慢查询日志。

pt-deadlock-logger 本身不“持续”——它靠轮询 + 正确配置才真正可用,否则要么漏日志、要么挂掉就停。
为什么直接运行 pt-deadlock-logger 没输出?
常见现象是命令执行后终端卡住、日志文件为空、或报 Access denied。这不是工具坏了,而是连不上或没权限。
-
DSN写错:宝塔默认走 socket,只写h=127.0.0.1会失败;必须显式指定S=/www/server/data/mysql.sock(路径以宝塔面板【数据库】→【MySQL】页显示为准) - MySQL 账户缺权限:
SELECT(读INFORMATION_SCHEMA.INNODB_TRX等视图)、PROCESS(看线程状态),如果用--dest写表,还必须有目标库表的INSERT - 宝塔里 root 密码 ≠ 系统 root 密码,是面板【数据库】→【MySQL】设置页里显示的那个;忘了就去面板重置,再同步更新脚本里的
p=xxx
怎样让死锁日志不丢?关键在 MySQL 服务端配置
pt-deadlock-logger 轮询的是 SHOW ENGINE INNODB STATUS,而这个命令默认只保留最后一次死锁。想捕获“所有”,必须改 MySQL 配置,不是工具能解决的。
- 临时生效(重启失效):
SET GLOBAL innodb_print_all_deadlocks = ON; - 永久生效:编辑宝塔中 MySQL 配置(【软件商店】→ MySQL → 【设置】→ 【配置修改】),在
[mysqld]段落下加一行:innodb_print_all_deadlocks = 1,然后【重启】服务 - 验证是否生效:
SHOW VARIABLES LIKE 'innodb_print_all_deadlocks';返回ON即可 - 注意:死锁详情会追加到 MySQL 错误日志(如
/www/server/data/mysql-error.log),不是慢查询日志
如何真正“持续后台运行”且自动恢复?
前台执行会阻塞终端,MySQL 重启或网络抖动会导致进程退出。生产环境不能只靠 --daemonize。
- 基础后台命令示例(每 5 秒查一次,跑 24 小时):
pt-deadlock-logger --log=/var/log/deadlock.log --daemonize --run-time=86400 --interval=5 h=localhost,S=/www/server/data/mysql.sock,u=root,p='your_pass' -
--interval建议 ≥3 秒:太小会加重 MySQL 负载(每次轮询都触发SHOW ENGINE INNODB STATUS) - 更可靠做法:用 systemd 或宝塔计划任务包装成守护脚本,每次启动前检查
pgrep -f "pt-deadlock-logger",不存在就拉起 - 如果写入中心表(
--dest),记得提前建好deadlocks表,字段要对齐工具默认输出列,否则会报错退出
最易被忽略的一点:innodb_print_all_deadlocks = ON 开启后,错误日志会快速增长,尤其在高并发死锁场景下。得配合 logrotate 或定期清理,否则磁盘可能被打满——监控本身成了故障源。











