一、 pt-fk-error-logger
pt-fk-error-logger 是用于检测和记录数据库中插入违反外键约束的工具,一般使用比较少。
1. 常用参数
- --log 指定日志文件用来存储检测输出
- --daemonize 放到后台运行,守护进程模式
- --interval 每隔多少秒检测一次,默认30
- --run-time 运行时间
- --iterations 检测的次数
- --ask-pass 交互式输入密码
- --dest 将信息记录到数据库中
2. 使用示例
pt-fk-error-logger u=root,h=检测IP,P=3306 --ask-pass --interval=1 --daemonize --log=/tmp/pt-fk-error-logger.log
tailf /tmp/pt-fk-error-logger.log
模拟违反外键约束
create table repo_table(
repo_id char(13) not null primary key,
repo_name char(14) not null)
engine=innodb;
create table busi_table(
busi_id char(13) not null primary key,
busi_name char(13) not null,
repo_id char(13) not null,
foreign key(repo_id) references repo_table(repo_id))
engine=innodb;
insert into repo_table values("12","sz");
insert into repo_table values("13","cd");
insert into busi_table values("1003","cd", "13");
insert into busi_table values("1002","sz", "12");
insert into busi_table values("1001","gx", "11");
二、 pt-archiver
pt-archiver 从表中(必须有主键)归档数据到另外一个表或者文件中。默认情况下,pt-archiver操作结束后,不会对source、dest表执行analyze或optimize操作,因为这种操作费时间,并且需要你提前预估有足够的磁盘空间用于拷贝表。一般建议也是pt-archiver操作结束后,在业务低谷手动执行analyze table用以回收表空间。
1. 批量操作
- --where 'id<3000' 设置操作条件
- --limit 1000 每次取1000行数据用pt-archive处理
- --no-delete 表示不删除原来的数据,注意:如果不指定此参数,所有处理完成后,都会清理原表中的数据,和--bulk-delete 互斥
- --txn-size 1000 每1000行作为一个事务,提交一次
- --progress 5000 每处理5000行输出一次处理信息
- --statistics 输出执行过程及最后的操作统计(只要不加上--quiet,默认pt-archive都会输出执行过程)
- --charset=UTF8 指定字符集为UTF8
- --bulk-delete 1000 批量删除source上的旧数据(每次1000条),--no-delete 互斥
- --purge 删除source数据库的相关匹配记录
- --bulk-insert 批量插入数据到dest主机 (通过在dest主机上LOAD DATA LOCAL INFILE插入数据)
- --replace 将insert into 语句改成replace写入到dest库
- --sleep 120 每次归档了limit行后 休眠多长时间(单位为秒)
- --file '/tmp/test.sql'
- --header 输入列名称到首行(和--file一起使用)
- --no-check-charset 不指定字符集
- --check-columns 检验dest和source的表结构是否一致,不一致自动拒绝执行(不加这个参数也行。默认就是执行检查的)
- --no-check-columns 不检验dest和source的表结构是否一致,不一致也执行(会导致dest上的无法与source匹配的列值被置为null或者0)
- --analyze=ds 操作结束后,优化表空间(d表示dest,s表示source)
- --local 不把optimize或analyze操作写入到binlog里面(防止造成主从延迟)
- --retries 超时或者出现死锁的话,pt-archiver进行重试的间隔(默认1s)
- --ignore insert语句加入ignore。
- --no-safe-auto-increment 根据自增id进行归档的话,默认最大的id不会进行归档,需要添加参数:--no-safe-auto-increment 才能对最大id进行处理。
- --dry-run 不实际执行,只打印过程
- --replace 将insert into 语句改成replace写入到dest库
- --check-slave-lag + --max-lag 从库延迟大于max-lag指定秒数就暂停归档
- --no-version-check 目前为止,发现部分pt工具对阿里云RDS操作必须加这个参数
- --ignore或则--replace: 归档冲突记录跳过或则覆盖,批量插入的时候因为是load data,索引看不到主键冲突记录的报错。要是非批量插入,则需要添加。
- --why-quit: 打印退出的原因,归档数据正常完成的除外。
注意:批量操作和单条操作提交性能有近10倍的差距。
2. 使用案例
- 删除数据
pt-archiver --source h=IP,u=root,p='XXX',P=3306,D=test,t=employees \
--statistics --no-check-charset --where 'id>300000' --limit 10000 --txn-size 1000 --purge --progress=5000 --no-safe-auto-increment
- 复制数据到其他数据库(目标表需提前建立),保留源数据
pt-archiver \
--source h=IP1,u=root,p='XXX',P=3306,D=test,t=employees \
--dest h=IP2,u=root,p='XXX',P=3306,D=test,t=emp \
--no-check-charset \
--progress 5000 --where 'id>200000' \
--statistics --limit=10000 --txn-size 1000 --bulk-insert --no-delete --no-safe-auto-increment
- 复制数据到其他数据库(目标表需提前建立),删除源数据
pt-archiver \
--source h=IP1,u=root,p='XXX',P=3306,D=test,t=employees \
--dest h=IP2,u=root,p='XXX!',P=3306,D=test,t=emp \
--no-check-charset \
--progress 5000 --where 'id>200000' \
--statistics --limit=10000 --txn-size 1000 --bulk-insert --bulk-delete --no-safe-auto-increment
- 从库延迟大于1s就暂停归档
当从库延迟小于--max-lag设置的时间之后,继续归档。要是有多个从库的话,继续指定--check-slave-lag参数,该参数可以重复指定多个从库。
pt-archiver \
--source h=MASTER,u=root,p='XXX',P=3306,D=test,t=employees \
--dest h=10.13.2.68,u=root,p='XXX',P=3306,D=test,t=emp \
--no-check-charset \
--progress 5000 --where '1=1' \
--statistics --limit=10000 --txn-size 1000 --bulk-insert --no-delete --no-safe-auto-increment \
--max-lag=1 --check-slave-lag u=root,p='XXX',h=SLAVE,P=3306
- 导出数据到文件,导出数据的格式为LOAD
pt-archiver --source h=IP,u=root,p='xxx',P=3306,D=test,t=employees \
--file '/tmp/test.txt' \
--no-check-charset --where 'id>100000' --statistics --limit 10000 --txn-size 1000 --no-delete --progress=5000 --no-safe-auto-increment
- 导出数据到文件并删除数据库的相关行
pt-archiver --source h=IP,u=root,p='XXX',P=3306,D=test,t=employees \
--file '/tmp/test1.txt' \
--no-check-charset --where 'id>100000' --statistics --limit 10000 --txn-size 1000 --purge --progress=5000 --no-safe-auto-increment
三、 PT 其他工具
1. pt-mysql-summary
查看mysql汇总信息,快速了解一个数据库的方法,收集MySQL Server的基本信息。
包括:版本、数据目录、命令的统计、用户,数据库以及复制等信息还包括各个变量(status、variables)信息和各个变量的比例,还有配置文件等信息。
pt-mysql-summary --user=root --ask-pass --port=3306 --socket /var/lib/mysql/mysql.sock # 会调用mysql命令登录MySQL数据库
2. pt-config-diff
对比两个MySQL实例的配置文件,类似Linux的diff命令
pt-config-diff --ask-pass h=IP1,P=3306,u=root h=IP2,P=3306,u=root
3. pt-duplicate-key-checker
查找MySQL表中的重复索引和外键。
该程序检查MySQL表的 SHOW CREATE TABLE 输出:如果发现索引间以相同的次序覆盖相同的字段或者最左前缀部分字段,就打印出可疑的索引。默认情况下,索引必须是相同的类型。即有相同的索引字段,一个BTREE索引和一个FULLTEXT索引并不互相重合。也查找重复外键。重复外键间覆盖同一张表的相同字段,并引用相同的父表。
程序输出的结尾是一个简短的小结,包括以字节计的重复索引所占用的总空间大小的预估,计算方式为索引宽度乘以各个表中的记录数量。
pt-duplicate-key-checker -hIP -P3306 -uroot --ask-pass
pt-duplicate-key-checker h=IP,P=3306,u=uoot --ask-pass
4. pt-show-grants
提取、排序和打印MySQL 用户和权限信息。
- 从一台服务器上将权限复制到另一台机器上。可以很简单地从第一台服务器上抽取相关权限,然后直接导入第二台机器上。
- 将权限信息放在版本控制中。使用自动grant dump到版本控制中,可能会获得一些没有变化的授权。原因在于mysql按照看似随机的顺序打印授权信息。该脚本可以解决该问题,在GRANT和ON之间做排序。如果show grants结果存在多行的话,也会这些行进行排序。
1)原理
- 先查找所有用户和Host
- 然后逐个执行show grants
2)常用参数
- --flush 在输出后刷新权限,在输出最后一行加了如下一行命令:FLUSH PRIVILEGES;
- --drop Add DROP USER before each user in the output
- --revoke add REVOKE statements for each GRANT statement
- --separate List each GRANT or REVOKE separately
- --ask-pass
3)用法示例
pt-show-grants h=IP,P=3306,u=uoot --ask-pass > grant.sql
# 版本控制
pt-show-grants h=IP,P=3306,u=uoot --ask-pass | diff othergrants.sql -
四、 PT不常用的工具
- pt-table-usage 分析查询时如何使用表的,作用不大
- pt-summary 查看系统摘要报告。信息包括:CPU、内存、硬盘、网卡,文件系统、磁盘调度和队列大小、LVM、RAID、网络链接信息、netstat 的统计,以及前10的负载占用信息和vmstat信息
- pt-variable-advisor 通过该命令,分析MySQL的变量(my.cnf),并对可能存在的问题提出建议, 作用不大
pt-variable-advisor --user=root --ask-pass 192.168.1.1
- pt-visual-explain 格式化explain出来的执行计划,按照tree方式输出,方便阅读
mysql -uroot -proot -e "explain select * from sakila.film_actor join sakila.film using(film_id)" | pt-visual-explain
- pt-index-usage 从慢查询日志中读取查询并分析它们如何使用索引,用来查找不常使用索引
pt-index-usage -hIP -uroot -P3306 --ask-pass /data/mysqllog/slow.log
- pt-fingerprint 将SQL文本参数化
cat file.txt
SELECT name, password FROM user WHERE id='12823';
select name, password from user where id=5;
select name, password from user where id=6;
select name, password from user where id=7;
select name, password from user where id=8;
select name, password from user where id=9;
select name, password from user where id=10;
select name, password from user where id=11;
select name, password from user where id=12;
select name, password from user where id=13;
select name, password from user where id=11;
pt-fingerprint --match-embedded-numbers file.txt |sort|uniq -c
#输出
11 select name, password from user where id=?
- pt-slave-find 查找和打印所有mysql复制层级关系
pt-slave-find -hmaster-host -uroot -P3306 --ask-password
- pt-secure-collect 用途:收集、清理、打包和加密数据。默认情况下会收集以下命令的结果:pt-stalk,pt-summary,pt-mysql-summary
收集:pt-secure-collect collect
解密:pt-secure-collect decrypt
加密:pt-secure-collect encrypt
清理:pt-secure-collect sanitize
- pt-upgrade 用来测试新老版本数据库对sql的结果是否一致。没什么实际作用,生产库不建议。
- pt-find 在mysql实例中按条件查找表并执行命令
#查找一天前建立的MyISAM 引擎的表
pt-find --ctime +1 --engine MyISAM -h10.13.2.66 -uroot -P3306 --ask-pass
#将一天前创建的InnoDB 表都转化为MyISAM引擎的表
pt-find --engine InnoDB --exec "ALTER TABLE %D.%N ENGINE=MyISAM" -h10.13.2.66 -uroot -P3306 --ask-pass
#查找某些符合某个规则的表,并且执行删除操作
pt-find --connection-id '\D_\d+_(\d+)$' --server-id '\D_(\d+)_\d+$' --exec-plus "DROP TABLE %s" -h10.13.2.66 -uroot -P3306 --ask-pass
#找到open_api 数据库的空表执行删除操作:
pt-find --empty open_api -h10.13.2.66 -uroot -P3306 --ask-pass --exec-plus "DROP TABLE %s"
#查找某些大表,查找5G以上的表
pt-find --tablesize +5G -h10.13.2.66 -uroot -P3306 --ask-pass
#查找超过10000行以上的表
pt-find --rows +10000 -h10.13.2.66 -uroot -P3306 --ask-pass
参考
https://www.cnblogs.com/zhoujinyi/p/3384667.html
https://blog.csdn.net/sweeper_freedoman/article/details/79846260
https://blog.csdn.net/qianglei6077/article/details/105977587
https://blog.csdn.net/sweeper_freedoman/article/details/79939638
https://www.cndba.cn/leo1990/article/2790
https://www.fordba.com/percona-toolkit-pt-index-usage.html
http://www.mamicode.com/info-detail-1903758.html
https://www.percona.com/doc/percona-toolkit/LATEST/pt-archiver.html