MySQL作为常用的关系型数据库,在高并发场景下很容易出现死锁问题,死锁会导致事务阻塞甚至回滚,影响业务正常运行。使用Percona Toolkit中的pt_deadlock_logger工具可以实时监视MySQL的死锁情况,记录死锁发生的详细信息,方便后续排查问题。

Percona Toolkit安装
首先需要在服务器上安装Percona Toolkit,不同系统的安装方式略有区别,以下是常见系统的安装步骤。
CentOS系统安装
先配置Percona的yum源,然后直接通过yum安装:
# 安装Percona yum源 yum install -y https://repo.percona.com/yum/percona-release-latest.noarch.rpm # 启用Percona Toolkit仓库 percona-release enable tools # 安装Percona Toolkit yum install -y percona-toolkit
Ubuntu系统安装
通过apt包管理器安装,先添加Percona的仓库源:
# 安装依赖工具 apt-get install -y gnupg2 # 添加Percona仓库密钥 wget -O - https://repo.percona.com/apt/percona-release_latest.generic.gpg | apt-key add - # 添加仓库源 echo "deb http://repo.percona.com/apt $(lsb_release -cs) main" > /etc/apt/sources.list.d/percona.list # 更新仓库并安装 apt-get update apt-get install -y percona-toolkit
pt_deadlock_logger工具使用
安装完成后就可以使用pt_deadlock_logger工具监视MySQL死锁,该工具会持续连接MySQL实例,捕获出现的死锁信息并输出。
基础使用命令
最简单的使用方式是直接指定MySQL的连接信息,命令格式如下:
# 基本用法,指定MySQL连接参数 pt-deadlock-logger --host=127.0.0.1 --port=3306 --user=root --password=你的密码
命令执行后会一直运行,当有死锁发生时,就会输出对应的死锁信息,默认输出到标准输出,也可以指定输出到文件或者数据库表中。
常用参数说明
pt_deadlock_logger有很多可选参数,以下是常用的参数说明:
| 参数 | 说明 |
|---|---|
| --host | MySQL实例的IP地址,默认是127.0.0.1 |
| --port | MySQL实例的端口,默认是3306 |
| --user | 连接MySQL的用户名 |
| --password | 连接MySQL的密码 |
| --socket | 如果使用本地socket连接,指定socket文件路径 |
| --dest | 指定死锁信息的存储位置,可以是文件路径或者数据库表 |
| --interval | 检查死锁的时间间隔,单位是秒,默认是30秒 |
| --run-time | 工具运行的总时长,不指定则一直运行 |
输出到文件示例
如果需要将死锁信息保存到文件,方便后续查看,可以使用如下命令:
# 将死锁信息输出到指定文件,每隔10秒检查一次,运行1小时 pt-deadlock-logger --host=127.0.0.1 --port=3306 --user=root --password=你的密码 --interval=10 --run-time=3600 --dest=/var/log/mysql_deadlock.log
死锁日志解读
当捕获到死锁时,输出的日志包含很多关键信息,以下是典型的死锁日志内容示例:
# 2024-05-20T10:30:00 Deadlock detected server: 127.0.0.1:3306 deadlock_id: 123 time: 2024-05-20 10:30:00 *** (1) TRANSACTION: TRANSACTION 12345, ACTIVE 2 sec mysql tables in use 1, locked 1 LOCK WAIT 2 lock struct(s), heap size 1136, 1 row lock(s) MySQL thread id 100, OS thread handle 140123456789, query id 987 localhost root updating update user set balance=balance-100 where id=1 *** (1) WAITING FOR: RECORD LOCKS space id 123 page no 45 n bits 72 index PRIMARY of table `test`.`user` trx id 12345 lock_mode X waiting *** (2) TRANSACTION: TRANSACTION 12346, ACTIVE 1 sec mysql tables in use 1, locked 1 2 lock struct(s), heap size 1136, 1 row lock(s) MySQL thread id 101, OS thread handle 140123456790, query id 988 localhost root updating update user set balance=balance+100 where id=2 *** (2) HOLDS THE LOCK(S): RECORD LOCKS space id 123 page no 45 n bits 72 index PRIMARY of table `test`.`user` trx id 12346 lock_mode X *** (2) WAITING FOR: RECORD LOCKS space id 123 page no 45 n bits 72 index PRIMARY of table `test`.`user` trx id 12346 lock_mode X waiting *** WE ROLL BACK TRANSACTION (2)
日志中主要需要关注几个部分:
- 事务ID:每个事务的唯一标识,用来区分不同的事务
- 正在执行的SQL:可以看到死锁发生时两个事务正在执行的SQL语句,定位问题SQL
- 锁等待信息:可以看到事务持有和等待的锁类型、锁对应的表和资源
- 回滚的事务:MySQL会自动回滚其中一个事务来解除死锁,日志中会说明回滚了哪个事务
注意事项
使用pt_deadlock_logger监视死锁时需要注意以下几点:
- 连接MySQL的用户需要有PROCESS权限,否则无法获取死锁相关信息
- 工具运行时会持续占用一个数据库连接,需要注意连接数限制
- 如果MySQL实例开启了多源复制,需要指定对应的复制通道参数
- 捕获到的死锁信息需要结合业务逻辑分析,才能找到死锁的根本原因,比如调整事务顺序、缩小事务范围等
通过Percona Toolkit的pt_deadlock_logger工具,可以很方便地实现对MySQL死锁的实时监视,快速获取死锁的详细信息,帮助开发和运维人员及时解决死锁问题,保障数据库的稳定运行。
MySQLPercona_Toolkit死锁监视pt_deadlock_logger修改时间:2026-06-06 23:55:58