一、简介
pt-deadlock-logger 记录有关给定 DSN 上的 MySQL 死锁的信息。 信息打印到 STDOUT,也可以通过指定 –dest 将其保存到表中。
pt-deadlock-logger 通过轮询和解析 SHOW ENGINE INNODB STATUS 打印有关 MySQL 死锁的信息。 当一个新的死锁发生时,它被打印到 STDOUT,如果指定 –dest,可以保存到对应的表中。
仅打印新的死锁。 每个死锁的指纹是使用死锁的服务器、ts 和线程值创建的(即使这些列未由 –columns 指定)。 如果死锁的指纹与上一个死锁的指纹不同,则打印死锁。
–dest 语句使用 INSERT IGNORE 来消除重复的死锁,因此每次 –iterations 都会保存每个死锁。详细介绍请看
官方文档
二、参数
1.参数
参数 | 意义 |
---|---|
–clear-deadlocks |
利用这张表创建一个小的死锁,利用新产生的这个死锁刷新engine InnoDB status中的死锁信息,间接达到清除engine InnoDB status中大的死锁信息的结果,表名为percona_schema.clear_deadlocks,这个表一定不能存在,脚本会自动创建表并在生成死锁后删除表,建表语句 CREATE TABLE percona_schema.clear_deadlocks (a INT PRIMARY KEY) ENGINE=InnoDB |
–columns | 结果集字段 |
–config | 指定配置文件,必须是命令行的第一个选项 |
–reate-dest-table | 创建 –dest 指定的表。 |
–daemonize | 后台运行 |
–dest | 用DSN的格式写存储死锁的位置,至少要指定库和表 |
–interval | 检测死锁的频率,默认值30s,如果未指定 –run-time则一直运行 |
–iterations | 检查死锁的次数。 默认情况下,如果没指定,则为无限次数,退出的时间由–run-time来限制 |
–log | 守护进程时将所有输出打印到此文件。 |
–numeric-ip | 将ip地址表示为整数 |
2.存储死锁信息的表
-- 可以根据--columns的字段进行调整
CREATE TABLE deadlocks (
server char(20) NOT NULL,
ts timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP,
thread int unsigned NOT NULL,
txn_id bigint unsigned NOT NULL,
txn_time smallint unsigned NOT NULL,
user char(16) NOT NULL,
hostname char(20) NOT NULL,
ip char(15) NOT NULL, -- alternatively, ip int unsigned NOT NULL
db char(64) NOT NULL,
tbl char(64) NOT NULL,
idx char(64) NOT NULL,
lock_type char(16) NOT NULL,
lock_mode char(1) NOT NULL,
wait_hold char(1) NOT NULL,
victim tinyint unsigned NOT NULL,
query text NOT NULL,
PRIMARY KEY (server,ts,thread)
) ENGINE=InnoDB
3.columns的详细信息
字段 | 意义 |
---|---|
server | 发生死锁的(源)服务器。 |
ts | 上次检测到死锁的日期和时间 |
thread | mysql线程编号,和show full processlist中的ID一致 |
txn_id | InnoDB事务ID |
txn_time | 发生死锁时事务处于活动状态的时间 |
user | 连接的数据库用户名 |
hostname | 连接的主机 |
ip | 连接的 IP 地址。如果指定–numeric-ip, ,则将转换为无符号整数 |
db | 发生死锁的库 |
tbl | 发生死锁的表 |
idx | 发生死锁的索引 |
lock_type | 导致死锁的锁上持有的事务的类型 |
lock_mode | 导致死锁的锁的锁定模式 |
wait_hold | 事务是在等待锁还是持有锁 |
victim | 事务是否被选为死可回滚的事务并进行回滚 |
query | 导致死锁的查询。 |
三、使用示例
./pt-deadlock-logger --ask-pass --host host --port 3306 --user test_pt --dest h=host,P=port,u=user,D=test_db,t=deadlocks
# 用dns的方式指定
./pt-deadlock-logger h=host,P=port,u=user,p=passwd --dest D=test_db,t=deadlocks
# 指定间隔时间和运行时间
./pt-deadlock-logger h=host,P=port,u=user --ask-pass --dest D=test_db,t=deadlocks --run-time 1m --interval 10
版权声明:本文为line_on_database原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。