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 --user='system' --password='123456' /data/mysqldata/3306/slow-query.log 
  
 
 
  
(五) 复制类工具 
  
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