pt-config-diff的功能是diff(判断差异)不同的MySQL配置文件以及不同的服务器变量设置。即diff出MySQL实例之间的不同配置
pt-config-diff h=host1 h=host2
pt-config-diff /etc/my.cnf h=host1
pt-config-diff /etc/my-small.cnf /etc/my-large.cnf
pt-config-diff通过检查来自命令行中指定的两个或多个配置源的服务器系统变量的值来区分MySQL配置,配置源可以是DSN或mysql配置文件
对于每个DSN配置,pt-config-diff都连接到MySQL,并通过执行SHOW /!40103 GLOBAL/ VARIABLES 这是一个“活动配置”,因为它显示了MySQL当前运行的服务器值。
只有所有配置源拥有的变量才会被比较,因为如果一个变量不存在,那么我们就无法知道或安全地猜测它的值。
例如,如果您将一个选项文件(例如my.cnf)与一个活动配置(即显示DSN配置中的变量)进行比较,则选项文件可能只有几个变量,而活动配置则包含所有变量。只比较两个配置中出现的变量的值
如果没有差异就不会有输出。当存在差异时,pt-config-diff向STDOUT打印一个报告,该报告看起来类似于以下内容:
比较MySQL变量是困难的,因为在MySQL的许多版本和发行版中有许多变化和微妙之处。当比较失败时,该工具会向STDERR输出警告,如下所示:
如果没有差异,pt-config-diff退出状态为零,如果有差异,则为1。
选项
选项 | 功能 |
---|---|
- -ask-pass | 连接时询问密码 |
- -charset | 字符集 |
- -config | 配置文件 读取这个逗号分隔的配置文件列表;如果指定,这必须是命令行上的第一个选项 它等价于- -default -file |
- -database | 数据库名 |
- -defaults-file | 只读取给定文件中的mysql选项。您必须给出一个绝对路径名 |
- -help | 帮助 |
- -host | 主机名 |
- -[no]ignore-case | 默认yes 不区分大小写地比较变量。 |
- -ignore-variables | 不比较的变量 |
- -password | 连接密码 |
- -pid | pid文件 |
- -port | 连接端口号 |
- -report-width | 默认78 将报告行截断为这么多字符。由于一些变量值可能很长,或者在比较多个配置时,这可能有助于增加报表的宽度,这样就不会在可读性之外截断值。 |
- -set-vars | 设置变量 |
- -socket | 连接的socket文件 |
- -user | 连接用户 |
- -version | 显示版本并退出 |
–[no]version-check | 检查mysql、pt工具版本 |
pt-config-diff /tmp/my.cnf /data/mariadb/5000/my.cnf
pt-config-diff h=10.10.80.16,P=5001,u=root,p=123456 /data/mariadb/5000/my.cnf
Error getting SHOW ENGINE INNODB STATUS: Use of uninitialized value $ts in pattern match (m//) at /usr/bin/pt-deadlock-logger line 4873.
https://bugs.launchpad.net/percona-toolkit/+bug/1195034
pt-deadlock-logger - 记录mysql死锁
死锁:是指两个或则多个事务在同一个资源上相互占用,并请求锁定对方占用的资源,而导致恶性循环的现象;当启用死锁检测(默认值)并发生死锁时,InnoDB检测条件并回滚其中一个事务(受害者)。如果使用innodb_deadlock_detect 配置选项禁用死锁检测 ,则InnoDB依赖于 innodb_lock_wait_timeout设置在发生死锁时回滚事务。
在MySQL中innodb会出现死锁的情况,但是查看死锁却很不“智能”。只能通过 show engine innodb status 查看,但只保留最后一个死锁的信息,之前产生的死锁都被刷掉了。
“pt-deadlock-logger ”在给定的DSN上记录关于MySQL死锁的信息。信息被打印到STDOUT,也可以通过指定 --dest保存到表中。该工具将永远运行,除非指定–run-time 或者指定了–iterations。
例:
打印在host1上的死锁:
pt-deadlock-logger h=host1
打印在host1上的死锁一次,然后退出:
pt-deadlock-logger h=host1 --iterations 1
把host1的死锁信息记录到host2中的percona_schema.deadlocks
pt-deadlock-logger h=host1 --dest h=host2,D=percona_schema,t=deadlocks
“pt-deadlock-logger”通过轮询和解析“SHOW ENGINE INNODB STATUS”输出关于“MySQL”死锁的信息。当一个新的死锁发生时,它被打印为’ STDOUT ',如果指定了- -dest,则保存到- -dest指向的表。
只打印新的死锁。使用死锁的服务器、ts和线程值创建每个死锁的指纹(即使这些列不是由- -columns指定的)。如果死锁的指纹与上一个死锁的指纹不同,则打印死锁。
dest语句使用“INSERT IGNORE”来消除重复的死锁,因此每次迭代都会保存死锁
INNODB注意事项和细节
InnoDB的输出很难解析,有时无法正确地解析。
有时死锁信息中并不包含所有信息(例如用户名或IP地址)。既然如此,工具就没有任何东西可以放入这些列中。也有可能死锁输出太长(因为有很多锁),以至于全部输出都被截断了。
由于带空格的用户名没有被InnoDB引用,因此该工具通常会将这些用户名的第二个单词错误地报告为主机名。
参数 | 功能 |
---|---|
- -ask-pass | 连接数据库时询问密码 |
- -charset | 字符集 |
- -clear-deadlocks | 创建一个小的表 使用此表创建一个小死锁,表必须不存在 ① 创建表并导致小死锁之后,该工具将再次删除该表 |
- -columns | 显示出的列,类型列表,默认值 server, ts, thread, txn_id, txn_time, user, hostname, ip, db, tbl, idx, lock_type, lock_mode,wait_hold, victim, query ② |
- -config | 读取这个逗号分隔的配置文件列表;如果指定,这必须是命令行上的第一个选项。 |
- -create-dest-table | 创建由–dest指定的表。通常,-dest表应该已经存在。此选项会导致pt-deadlock-logger使用建议的表结构自动创建表。 |
- -daemonize | Fock到后台并从shell中分离。只有POSIX操作系统能使用 |
- -database | 连接到本数据库 |
–defaults-file | 只读取给定文件中的mysql选项。您必须给出一个绝对路径名。 |
- -dest | DSN用于存储死锁;指定至少一个数据库(D)和表(t)。 |
- -help | 帮助并退出 |
- -host | 连接主机 |
- -interval | 默认30 多久检查一次死锁,如果没指定–run-time 那么工具永远执行 默认30s执行一次 |
- -iterations | 检查多少次死锁发生情况,默认情况下,这个选项是未定义的,这意味着无限次迭代 |
- -log | 把输出写入日志文件 |
- -numeric-ip | 将IP地址表示为整数 |
- -password | 连接数据库密码 |
- -pid | 数据库pid文件 |
- -port | 数据库端口 |
- -quiet | 没有死锁;只打印错误和警告 。 |
- -run-time | 工具执行时间 默认永远 |
- -set-vars | 数据库变量设置 |
- -socket | 连接socket文件 |
- -tab | 使用制表符分隔列,而不是空格。 |
- -user | 连接用户 |
- -version | 检查版本并退出 |
- -[no]version-check | 查看数据库及工具版本 |
例如:
pt-deadlock-logger u=root,P=5000,h=10.10.80.16,p=123456,D=yanglun --create-dest-table --dest u=root,P=5000,h=10.10.80.16,p=123456,D=yanglun,t=qqqqq --clear-deadlocks=deadlockhouhouhou
上述命令将自动创建表如下:
CREATE TABLE qqqqq
(
server
char(20) NOT NULL,
ts
timestamp NOT NULL DEFAULT current_timestamp(),
thread
int(10) unsigned NOT NULL,
txn_id
bigint(20) unsigned NOT NULL,
txn_time
smallint(5) unsigned NOT NULL,
user
char(16) NOT NULL,
hostname
char(20) NOT NULL,
ip
char(15) 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(3) unsigned NOT NULL,
query
text NOT NULL,
PRIMARY KEY (server
,ts
,thread
)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
并把死锁数据插入到该表
①:
②:
server, 死锁发生的(源)服务器
ts, 上次发生死锁的时间
thread, mysql死锁线程id 同show processlist的连接id
txn_id, InnoDB事务ID,它表示为两个无符号整数。我把它们相乘得到一个数。
txn_time, 死锁持续时间
user, 连接用户
hostname,连接主机
ip, 连接ip
db, 发生死锁的数据库
tbl, 发生死锁的表
idx,发生死锁的索引
lock_type, 锁类型
lock_mode,锁模式
wait_hold, 事务是等待锁还是持有锁。通常你会看到两个等待的锁。
victim, 是否选择事务作为死锁受害者并回滚。
query,发生死锁的语句