pt工具的使用(8) pt-deadlock-logger的使用

  • Post author:
  • Post category:其他




一、简介

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 版权协议,转载请附上原文出处链接和本声明。