pt工具

percona-toolkit简介
percona-toolkit是一组高级命令行工具的集合,用来执行各种通过手工执行非常复杂和麻烦的mysql任务和系统任务,这些任务包括:
 检查master和slave数据的一致性
 有效地对记录进行归档
 查找重复的索引
 对服务器信息进行汇总
 分析来自日志和tcpdump的查询
 当系统出问题的时候收集重要的系统信息
这些工具主要包括开发、性能、配置、监控、复制、系统、实用六大类,作为一个优秀的DBA,里面有的工具非常有用,如果能掌握并加以灵活应用,将能极大的提高工作效率。
 
percona-toolkit工具包安装
percona-toolkit-2.2.18-1.noarch.rpm
percona-toolkit-2.2.18.tar.gz
 
[root@mysql1 /]# yum install percona-toolkit-2.2.18-1.noarch.rpm

(一) 开发类工具
1.pt-duplicate-key-checker
功能介绍:
功能为从mysql表中找出重复的索引和外键,这个工具会将重复的索引和外键都列出来,并生成了删除重复索引的语句,非常方便
包含比较多的选项,具体的可以通过命令pt-duplicate-key-checker --help来查看具体支持那些选项
pt-duplicate-key-checker --host=localhost --user=system --password=123456 --databases=test
 
2.pt-online-schema-change
功能介绍:
功能为在alter操作更改表结构的时候不用锁定表,也就是说执行alter的时候不会阻塞写和读取操作,注意执行这个工具的时候必须做好备份,操作之前最好详细读一下官方文档
工作原理是创建一个和你要执行alter操作的表一样的空表结构,执行表结构修改,然后从原表中copy原始数据到表结构修改后的表,当数据copy完成以后就会将原表移走,用新表代替原表,
默认动作是将原表drop掉。在copy数据的过程中,任何在原表的更新操作都会更新到新表,因为这个工具在会在原表上创建触发器,触发器会将在原表上更新的内容更新到新表。如果表中已经定义了触发器这个工具就不能工作了。
大表添加字段
pt-online-schema-change --user=system --password=123456 --host=localhost --alter="ADD COLUMN domain_id INT" D=test,t=t --execute
pt-online-schema-change --host='10.10.100.119' --port=3306 --user='root' --password='aSv_y8c_Bup_UqF' --charset=utf8 --alter "add COLUMN retention_flag int(11)" D=tms_production,t=waybill --execute --alter-foreign-keys-method=rebuild_constraints
 
3.pt-show-grants
功能介绍:
规范化和打印mysql权限,让你在复制、比较mysql权限以及进行版本控制的时候更有效率!
查看指定mysql的所有用户权限:
pt-show-grants --host='localhost' --user='system' --password='123456'
查看指定数据库的权限:
pt-show-grants --host='localhost' --user='system' --password='123456' --database='test'
 
4.pt-upgrade
功能介绍:
在多台服务器上执行查询,并比较有什么不同!这在升级服务器的时候非常有用,可以先安装并导数据到新的服务器上,然后使用这个工具跑一下sql看看有什么不同,可以找出不同版本之间的差异。
pt-upgrade h='localhost' h=192.168.1.202 --user='system' --password='123456' --query="select * from mysql.user limit 5"

(二) 性能类工具
1.pt-index-usage
功能介绍:
从log文件中读取查询语句,并用explain分析他们是如何利用索引。完成分析之后会生成一份关于索引没有被查询使用过的报告。
pt-index-usage /data/mysqldata/3306/slow_query.log --host='localhost' --user='system' --password='123456'
 
2.pt-pmp
功能介绍:
为查询程序执行聚合的GDB堆栈跟踪,先进行堆栈跟踪,然后将跟踪信息汇总。
pt-pmp -p 21933
pt-pmp -b /usr/local/mysql/bin/mysqld_safe
 
3.pt-visual-explain
功能介绍:
格式化explain出来的执行计划按照tree方式输出,方便阅读。
pt-visual-explain a.txt
mysql -usystem -p123456 -e "explain select * from mysql.user" | pt-visual-explain

(三) 配置类工具
1.pt-config-diff
功能介绍:
比较mysql配置文件和服务器参数
pt-config-diff h=localhost h=192.168.1.202 --user='system' --password='123456'
 
2.pt-mysql-summary
功能介绍:
精细地对mysql的配置和status信息进行汇总
pt-mysql-summary --user='system' --password='123456' --host=localhost
 
3.pt-variable-advisor
功能介绍:
分析mysql的参数变量,并对可能存在的问题提出建议
有格式要求
pt-variable-advisor --user='system' --password='123456' --source-of-variables /data/mysqldata/3306/my.cnf

(四) 监控类工具
1.pt-deadlock-logger
功能介绍:
提取和记录mysql死锁的相关信息
pt-deadlock-logger --user='system' --password='123456' h=localhost –print
 
2.pt-fk-error-logger
功能介绍:
提取和记录mysql外键错误信息
 
3.pt-mext
功能介绍:
并行查看SHOW GLOBAL STATUS的多个样本的信息。
 
4.pt-query-digest
功能介绍:
分析查询执行日志,并产生一个查询报告
直接分析慢查询文件:
pt-query-digest  slow.log > slow_report.log
分析最近12小时内的查询:
pt-query-digest  --since=12h  slow.log > slow_report2.log
分析指定时间范围内的查询:
pt-query-digest slow.log --since '2017-01-07 09:30:00' --until '2017-01-07 10:00:00' > slow_report3.log
针对某个用户的慢查询
pt-query-digest --filter '($event->{user} || "") =~ m/^root/i' slow.log> slow_report5.log
查询所有所有的全表扫描或full join的慢查询
pt-query-digest --filter '(($event->{Full_scan} || "") eq "yes") ||(($event->{Full_join} || "") eq "yes")' slow.log> slow_report6.log
把查询保存到query_review表
pt-query-digest --user=root –password=abc123 --review  h=localhost,D=test,t=query_review--create-review-table  slow.log
把查询保存到query_history表
pt-query-digest  --user=root –password=abc123 --review  h=localhost,D=test,t=query_history--create-review-table  slow.log_0001
pt-query-digest  --user=root –password=abc123 --review  h=localhost,D=test,t=query_history--create-review-table  slow.log_0002
 
(五) 复制类工具
1.pt-heartbeat
功能介绍:
监控mysql复制延迟
 
2.pt-slave-delay
功能介绍:
设置从服务器落后于主服务器指定时间。
 
3.pt-slave-find
功能介绍:
查找和打印mysql所有从服务器复制层级关系
pt-slave-find -ubluewhale -p --host=10.9.97.224
bluewhale001
 
4.pt-slave-restart
功能介绍:
监视mysql复制错误,并尝试重启mysql复制当复制停止的时候
 
5.pt-table-checksum
功能介绍:
检查mysql复制一致性
 
6.pt-table-sync
功能介绍:
高效同步mysql表的数据
 
7.pt-table-usage
功能介绍:
分析如何使用mysql中的表

(六) 系统类工具
1.pt-diskstats
功能介绍:
是一个对GUN/LINUX的交互式监控工具

(七) 实用类工具
1.pt-archiver
功能介绍:
将mysql数据库中表的记录归档到另外一个表或者文件,也可以直接进行记录的删除操作。
 
2.pt-find
功能介绍:
查找mysql表并执行指定的命令,和gnu的find命令类似
 
3.pt-kill
功能介绍:
kill掉符合指定条件mysql语句
pt-kill --log-dsn D=test,t=kill_log --create-log-table --host=192.168.1.122 --user=root --password=msds007 --port=3306 --busy-time=10 --print --kill-query --match-info "SELECT|select"  --victims all
pt-kill --log-dsn D=test,t=kill_log --create-log-table --host=192.168.1.122 --user=root --password=msds007 --port=3306 --busy-time=10 --print --kill-query --match-info "SELECT|select"
pt-kill --log-dsn D=test,t=kill_log --create-log-table --host=192.168.1.122 --user=root --password=msds007 --port=3306 --busy-time=10 --print --kill --match-info "SELECT|select"

pt-kill --no-version-check --host 10.10.208.34 --port 3306 --user 'root' --password 'XtVha6_SdWYNxGdY' --charset utf8 --match-command Query --match-user us_rwx --busy-time 3 --kill --victims all --interval 10 --print
pt-kill --no-version-check --host 10.10.208.182 --port 3306 --user 'root' --password 'n4ut-A-b9YRkrOBg' --charset utf8 --match-command Query --match-user us_rwx --busy-time 3 --kill --victims all --interval 10 --print

pt-align 对文件格式进行格式化输出
pt-fifo-split 将文件分割成多个数据块(chunks),从而控制每次传输到mysql服务器的数据量大小
pt-fingerprint 用于生成查询指纹。主要将将sql查询生成queryID,pt-query-digest中的ID即是通过此工具来完成的。类似于Oracle中的SQL_ID,涉及绑定变量,字面量等
pt-ioprofile 用于分析查看mysql的真实IO情况
pt-stalk 出现问题的时候收集mysql的用于诊断的数据
pt-summary 打印出来的信息包括:CPU、内存、硬盘、网卡等信息,还包括文件系统、磁盘调度和队列大小、LVM、RAID、网络链接信息、netstat 的统计,以及前10的负载占用信息和vmstat信息。
 
 
利用percona-toolkit工具检查MySQL数据库主从一致性及修复
一、pt-table-checksum检查主从库数据的一致性
pt-table-checksum在MASTER上校验指定库、表,将结果存在一个库表里,复制进程将检验sql传递到slave上再执行一次。
通过比较M/S的检验值确定数据是否一致。利用主从复制做检验,不需要在检验期间对主从数据库同时锁表,可以控制校验的数据和速度,不影响到正常服务。
主库执行
(system@localhost) [(none)]> set global binlog_format=statement;
Query OK, 0 rows affected (0.00 sec)
 
[root@mysql1 ~]# pt-table-checksum --user='system' --password='123456' -S /data/mysqldata/3306/mysql.sock
主库
表要有主键
(system@localhost) [test]> select * from t;
+------+
| i    |
+------+
|   16 |
|   17 |
|   18 |
|   19 |
|   20 |
+------+
5 rows in set (0.00 sec)
 
从库1
(system@localhost) [test]> select * from t;
+------+
| i    |
+------+
|   16 |
|   19 |
|   20 |
+------+
3 rows in set (0.00 sec)
 
从库2
(system@localhost) [test]> select * from t;
+------+
| i    |
+------+
|   16 |
|   17 |
|   18 |
+------+
3 rows in set (0.00 sec)
 
#!/bin/bash
NUM=$(/usr/bin/pt-table-checksum --nocheck-replication-filters --no-check-binlog-format --replicate=huanqiu.checksums --databases=huanqiu  h=192.168.1.101,u=root,p=123456,P=3306|awk -F" " '{print $3}'|sed -n '2p')
if [ $NUM -eq 1 ];then
  /usr/bin/pt-table-sync --replicate=huanqiu.checksums h=192.168.1.101,u=root,p=123456 h=192.168.1.102,u=root,p=123456 --print
  /usr/bin/pt-table-sync --replicate=huanqiu.checksums h=192.168.1.101,u=root,p=123456 h=192.168.1.102,u=root,p=123456 --execute
else
  echo "data is ok"
fi
 
pt-table-checksum --recursion-method="processlist" --no-check-binlog-format --replicate=test.checksums --databases=huanqiu  h=192.168.1.101,u=root,p=123456,P=3306
 

二、pt-table-sync修复从库不一致的数据
主库执行
grant all on *.* to 'system'@'%' identified by '123456';
(system@localhost) [test]> create table user(id int primary key,name varchar(10));
(system@localhost) [test]> insert into user values (1,'abc');
(system@localhost) [test]> insert into user values (2,'def');
(system@localhost) [test]> insert into user values (3,'ghi');
 
pt-table-sync: 高效的同步MySQL表之间的数据,他可以做单向和双向同步的表数据。他可以同步单个表,也可以同步整个库。它不同步表结构、索引、或任何其他模式对象。所以在修复一致性之前需要保证他们表存在。
从库执行,没有不一致的数据
pt-table-sync --print --sync-to-master h=192.168.1.202,u=system,p=123456,P=3306,D=test,t=user
pt-table-sync --print --sync-to-master h=192.168.1.203,u=system,p=123456,P=3306,D=test,t=user
 
mysql2添加一条记录
(system@localhost) [test]> insert into user values (4,'jkl');
mysql3删除一条记录
(system@localhost) [test]> delete from user where id=2;
 
从库执行,将不一致的数据打印出来
pt-table-sync --print --sync-to-master h=192.168.1.202,u=system,p=123456,P=3306,D=test,t=user --charset=utf8
pt-table-sync --print --sync-to-master h=192.168.1.203,u=system,p=123456,P=3306,D=test,t=user --charset=utf8
 
从库执行,修复不一致的数据
pt-table-sync --execute --sync-to-master h=192.168.1.202,u=system,p=123456,P=3306,D=test,t=user --charset=utf8
pt-table-sync --execute --sync-to-master h=192.168.1.203,u=system,p=123456,P=3306,D=test,t=user --charset=utf8
 
从库执行,没有不一致的数据
pt-table-sync --print --sync-to-master h=192.168.1.202,u=system,p=123456,P=3306,D=test,t=user --charset=utf8
pt-table-sync --print --sync-to-master h=192.168.1.203,u=system,p=123456,P=3306,D=test,t=user --charset=utf8
pt-table-sync --print --sync-to-master h=192.168.1.202,u=system,p=123456,P=3306 --databases test --charset=utf8
pt-table-sync --print --sync-to-master h=192.168.1.203,u=system,p=123456,P=3306 --databases test --charset=utf8
 
主库执行,添加表
pt-heartbeat --user='system' --password='123456' -S /data/mysqldata/3306/mysql.sock -D test --master-server-id=201 --create-table --update
在后台持续更新主库上的heartbeat
pt-heartbeat --user='system' --password='123456' -S /data/mysqldata/3306/mysql.sock -D test --master-server-id=201 --update &
 
持续查看从库上的延迟情况
pt-heartbeat --user='system' --password='123456' -S /data/mysqldata/3306/mysql.sock -D test --master-server-id=201 --monitor --print-master-server-id
单次查看从库上的延迟情况
pt-heartbeat --user='system' --password='123456' -S /data/mysqldata/3306/mysql.sock -D test --master-server-id=201 --check
 
使用守护进程监控从库并输出日志
pt-heartbeat --user='system' --password='123456' -S /data/mysqldata/3306/mysql.sock -D test --master-server-id=201 --monitor --print-master-server-id --daemonize --log=/tmp/slave-lag.log
 
#下面是定期过滤--log文件中最大值的脚本,加入监控调用即可:
#!/bin/bash
cat /tmp/b.txt > /tmp/b_tmp.txt
echo > /tmp/b.txt
max_time=`cat /tmp/b_tmp.txt |grep -v '^$' |awk '{print $1}' |sort -k1nr |head -1`
echo "$max_time"

停止主库上的pt-heartbeat守护进程
pt-heartbeat --stop
 

打印MySQL复制的层次结构
pt-slave-find -h 192.168.1.201 -u system -p 123456 -P 3306

分析慢查询日志
pt-query-digest --user='system' --password='123456' /data/mysqldata/3306/slow_query.log

分析慢查询中索引和表使用情况
pt-index-usage --h localhost --user='system' --password='123456' -S /data/mysqldata/3306/mysql.sock /data/mysqldata/3306/slow_query.log
pt-table-usage --h localhost --user='system' --password='123456' -S /data/mysqldata/3306/mysql.sock /data/mysqldata/3306/slow_query.log
 
posted @ 2019-08-12 12:00  AllenHU320  阅读(2334)  评论(0编辑  收藏  举报