一个技术博客

Percona Toolkit 2.2工具集使用

本文由 Tim 于 2016-05-09 17:03:16 发表

percona-toolkit是一组高级命令行工具的集合,用来执行各种通过手工执行非常复杂和麻烦的MySQL和系统任务,这些任务包括:
检查master和slave数据的一致性(pt-table-checksum),并进行数据重新同步(pt-table-sync)
有效地对记录进行归档
查找重复的索引
对服务器信息进行汇总
分析来自日志和tcpdump的查询
当系统出问题的时候收集重要的系统信息

percona-toolkit 2.2工具集合中包含以下组件,官网文档

1、安装percona-toolkit   需要注意mysql版本需和系统版本(el6,el7等)对应,如果不对应会提示libmysqlclient错误导致安装不上,http://dev.mysql.com/downloads/repo/yum/   

首先安装依赖包

下载并安装

如有以下报错,还需要安装yum install -y perl-Digest-MD5

error: Failed dependencies:
perl(Digest::MD5) is needed by percona-toolkit-2.2.16-1.noarch

安装完成

可以看到/usr/bin/新增了许多文件

查看任意组件版本

如果只需要单个程序可以单独下载,例如pt-align

之后授权即可运行

 

2、percona-toolkit 2.2 使用和介绍

(1) pt-align   用于对文件格式进行格式化输出

align.txt 内容如下

pt-align  align.txt   后效果如下,每列都对齐首行了

Percona Toolkit 2.2工具集使用

(2) pt-archiver 清理、导出、转移数据

pt-archiver [OPTIONS] –source DSN –where WHERE

–purge 清理数据,直接删除源表里的数据,谨慎使用;
–where 指定删除条件,必须的条件,有字符串的,要用引号括起来
–limit 表示一次要删除多少行数据
–no-delete 表示不删除源表里的数据,默认是删除的
–file 指定数据要导出到哪个文件
–source 源数据库信息
–dest 指定远程数据库信息

test表内有如下数据

执行pt-archiver  –purge

执行完成,id<10的记录都被清除

导出数据到文件

博主实测最后一行无法导出,pt-archiver查询语句如下

可以看到最后一行WHERE (1=1) AND (id < ’12’) 导致id=12的记录查不出来,此处明显缺失=号,应该为id <= ’12’,因此需要注意 pt-archiver 2.2.6 有最后一行无法导出的bug

 迁移到远程数据库,依然会有最后一行的bug。

从查询日志中看出是边界值导致最后一行无法导出的bug,博主尝试将pt-archiver 第6247的$col <修改为$col<=

6244 ) {
6245 my $col = $q->quote($sel_stmt->{scols}->[0]);
6246 my ($val) = $dbh->selectrow_array(“SELECT MAX($col) FROM $src->{db_tbl}”);
6247 $first_sql .= ” AND ($col <= ” . $q->quote_val($val) . “)”;
6248 }
6249

之后再运行,此时查询日志变为

查询语句中原来为 AND (id < ’12’) 变为   AND (id <= ’12’) 变为 ,因为每行都有limit 1,因此这样修改应该是可行的,也得到了需要的数据

(3)pt-config-diff  比对.cnf 配置文件

(4)pt-deadlock-logger 

显示指定的DSN的死锁日志信息,他能够标准输出到屏幕也可以把信息写日志文件中(–log参数)甚至可以保留到指定的表中(–dest参数),该工具默认是永久执行,除非指定–run-time –iterations

用法:percona-toolkit 之 【pt-deadlock-logger】说明 

(5)pt-diskstats 打印磁盘io统计信息,类似iostat,但是这个工具是交互式并且比iostat更详细。可以分析从远程机器收集的数据。

(6)pt-duplicate-key-checker 查找重复的索引,并提供删除语句,显示索引总数

(7)pt-fifo-split 模拟切割文件并通过管道传递给先入先出队列而不用真正的切割文件

每次读取一百万行记录:

每次读取一百万行,指定fifo文件为/tmp/my-fifo,并使用load data命令导入到mysql中:

对大文件的数据导入数据库非常有用,具体的可以查看http://www.mysqlperformanceblog.com/2008/07/03/how-to-load-large-files-safely-into-innodb-with-load-data-infile/

(8)pt-find 找出表并执行命令,类似GNU find

找出创建于一天前MyISAM表,并打印出来

找出innodb引擎的表,并且把他们转换为myisam表:

找出没有记录的表并删除

找出大于5G的表

列出所有的表,包括表的总行数和索引的size,并按总数倒序排序(sort,pt-find本身没排序功能)

列出所有的表,并把输出信息保存到tablesize表里:

(9)pt-fingerprint  用于生成查询指纹。主要将将sql查询生成queryID,pt-query-digest中的ID即是通过此工具来完成的。

(10)pt-fk-error-logger 提取和记录mysql外键错误信息

创建测试表,并插入一行数据,使其报外键错误

在test数据库建表foreign_key_errors

找出外键错误并保存到foreign_key_errors表中

需要注意:如果没有外键错误,程序会一直在等待,需要Ctrl+C强制退出,或者加上–daemonize选项,后台运行。

(11)pt-heartbeat  用于检测主从延迟时间

在主库(Master)上开启守护进程来更新test.heartbeat表,第一次运行加入–create-table 选项会新建heartbeat表:

在从库(Slave)上运行,监控从的延迟情况:

更详细的文档:pt-heartbeat使用实践 – yayun

(12)pt-index-usage 从日志记录(log文件)中读取查询语句,并用explain分析他们是如何利用索引。完成分析之后会生成一份关于索引没有被查询使用过的报告。

分析查询会在slow.log里面并且打印报告:

不打印出来,而且对于后来的分析把结果存入percona数据库里面,使用–create-save-results-database会自动生成数据库和表来保存结果。

(13)pt-ioprofile  

如果提示如下报错,则需要安装strace,和lsof依赖包(yum -y install strace  lsof)

由于实现方式是使用strace注入到线程中,所以运行时需要root或sudo

博主在使用docker容器中运行pt-ioprofile时,有如下报错


暂未找到解决方法,不过可以在运行docker容器的宿主机上正常运行,pt-ioprofile -p 360 ,360为mysql进程在宿主机上的进程号。
生产环境中使用ioprofile时请谨慎使用。
官方也有如下提示,大意是使用strace注入,有可能影响到进程

pt-ioprofile should be considered an intrusive tool, and should not be used on production servers unless you understand and accept the risks.

更详细的文档:pt-ioprofile分析查看mysql的真实IO情况

(14)pt-kill kill MySQL连接的一个工具,此工具从show processlist 中获取满足条件的连接或者从包含show processlist的文件中读取满足条件的连接并打印或者杀掉或者执行其他操作

打印出运行时间超过60秒的线程,只打印不kill

每10秒执行一次,kill掉sleep线程

找出select超过10秒的线程并kill掉,记录到test.kill_log 表内,第一次运行可以加上–create-log-table选项会自动创建表

(15)pt-mext  用于记录固定时间间隔内status返回值的变化,类似 SHOW GLOBAL STATUS

计算 10 秒内的变化

(16)pt-mysql-summary 查看mysql统计信息

也可以用来监控:MySQL运行状态监控(pt-mysql-summary)

(17)pt-online-schema-change  InnoDB执行在线DDL的时候,修改过程中不会造成读写阻塞

详细文档:MySQL使用pt-online-change-schema实现在线加字段

DDL原理: 【MySQL】online ddl 工具之pt-online-schema-change

(18)pt-pmp   进行GDB跟踪调试,需要安装gdb( yum -y install gdb )

一个类似的穷人剖析器 http://poormansprofiler.org
博主测试无法在docker容器中正常运行,
在虚拟机中运行显示如下,不明觉厉,先Mark下

 

(19)pt-query-digest  用于分析mysql慢查询的一个工具,它可以分析log文件(binlog、general log、slowlog),也可以通过SHOWPROCESSLIST或者通过tcpdump抓取的MySQL协议数据来进行分析。

直接分析慢查询文件:

可配合pt-fingerprint生成id

更详细的文档:pt-query-digest查询日志分析工具

(20)pt-show-grants 提取、排序和打印MySQL 相关账户
pt-show-grants默认是只读,风险低。如果使用–flush,将执行flush privileges。
至今没有已知bug导致用户的损失。

从一台服务器上将权限复制到另一台机器上;可以很简单地从第一台服务器上抽取相关权限,然后直接导入第二台机器上;
将权限信息放在版本控制中。使用自动grant dump到版本控制中,可能会获得一些没有变化的授权。原因在于mysql按照看似随机的顺序打印授权信息。

可以看到如下信息

更详细的文档:pt-show-grants

(21)pt-sift 用于浏览pt-stalk生成的文件

(22)pt-slave-delay 延迟时间从Master上同步

在主从复制的架构中,正常情况下主上操作的记录也会在从上进行操作,虽说是异步复制,但操作会“实时”的同步到从。比如在主上不小心误操作了,还没等反应过来从上也会马上执行误操作,后期只有通过二进制或则备份恢复数据了,费时,又费力,没有任何回旋的余地,而且也会影响到网站的功能。而pt-slave-delay故意让主上的操作延迟制定的时间写入到从,这样就可以快速的处理上面说的问题了。

在Slave上执行

#–delay :从库延迟主库的时间,上面为1分钟。

#–interval :检查的间隔时间,上面为15s检查一次。(可选),不选则1分钟检查一次。
#–run-time :该命令运行时间,上面为该命令运行10分钟关闭。(可选),不选则永远运行。
#–daemonize :后台运行
其他的为链接数据库的账号信息,账号要有PROCESS, REPLICATION CLIENT, and SUPER权限

注意:延迟的时间实际为 delay+interval,即该命令的让从延迟主75s。

更详细的文档: percona-toolkit 之 【pt-slave-delay】说明

(23)pt-slave-find 连接mysql主服务器并查找其所有的从,然后打印出所有从服务器的层级关系

会显示如下信息

(24)pt-slave-restart  监视mysql复制错误,并尝试重启mysql复制当复制停止的时候

详细文档: MySQL Slave异常关机的处理 (pt-slave-restart)

类似sql_slave_skip_counter,sql_slave_skip_counter操作能够暂时让主从恢复工作,但多半数据一致性已经被破坏的更严重了,早晚有一天被掩盖的问题会再次爆发出来。建议使用pt-table-checksum和pt-table-sync彻底解决 MySQL主从服务器数据一致性的核对与修复

(25)pt-stalk 收集数据,供MySQL故障时分析

在MySQL服务器出现短暂(5~30秒)的性能波动的时候,一般的性能监控工具都很难抓住故障现场,也就很难收集对应较细粒度的诊断信息。另外,如果这种波动出现的频率很低,例如几天才一次,我们也很难人为的抓住现场,收集数据。这正是pt-stalk所解决的问题。

上面的命令表示,让pt-stalk后台运行(–daemonize),并监视SHOW GLOBAL STATUS中的Threads_connected状态值,如果该值超过2500,则触发收集主机和MySQL的性能、状态信息。pt-stalk会每隔一秒检查一次状态值,如果连续5次满足触发条件,则开始收集。

详细文档:使用pt-stalk诊断MySQL问题Percona Toolkit by example – pt-stalk

使用pt-stalk分析MySQL的性能波动

(26)pt-summary 查看系统摘要报告,打印出来的信息包括:CPU、内存、硬盘、网卡等信息,还包括文件系统、磁盘调度和队列大小、LVM、RAID、网络链接信息、netstat 的统计,以及前10的负载占用信息和vmstat信息。

(27)pt-table-checksum  找出(M-S)主从不同步的数据

Master上执行,如下检查test库中的test表,会自动创建percona.checksums 表

Slave上执行SQL语句

可以看到行数不一样,下面使用pt-table-sync进行同步消除差异。

(28)pt-table-sync 修复(M-S)主从不同步的数据

Master上执行,打印修复语句,只打印不执行,如需执行将–print替换为–execute

得到如下

将SQL语句到Slave上执行即可,执行完成后,

再次在Master上使用pt-table-checksum进行检查

然后在Slave上查询,为空即同步完成

pt-table-checksum原理:用pt-table-checksum校验数据一致性

用pt-table-sync修复不一致的数据

(29)pt-table-usage 分析查询如何使用表

使用报错,网上相关文档甚少。

(30)pt-upgrade 用来检查在新版本中运行的SQL是否与老版本一样,返回相同的结果,最好的应用场景就是数据迁移的时候。

(31)pt-variable-advisor 分析MySQL变量并且就可能问题提出建议。

(32)pt-visual-explain 树状显示explain

 

总结:percona-toolkit是一个非常强大的工具集合,这些工具主要包括开发、性能、配置、监控、复制、系统、实用六大类,里面有的工具对DBA非常有用,如果能掌握并加以灵活应用,将能极大的提高工作效率。

其中pt-table-checksum和pt-table-sync (找出主从不同步数据并修复),pt-duplicate-key-checker(找出重复索引),pt-online-schema-change(在线DDL) 比较重要

 

欢迎转载,转载请注明出处!Tim » Percona Toolkit 2.2工具集使用

点赞 (0)or拍砖 (0)
分享到:更多 ()