percona-toolkit是一组高级命令行工具的集合,用来执行各种通过手工执行非常复杂和麻烦的 mysql 任务和系统任务,这些任务包括:

1.检查master合salve数据的一致性

2.有效的对记录进行归档

3.查找重复的索引

4.对服务器信息进行汇总

5.分析来自日志和tcpdump的查询

6.当系统出问题时候收集重要的系统信息

等等.....

官网文档:https://docs.percona.com/percona-toolkit/

常用功能:

pt-align: 将其他工具的输出与列对齐

pt-archiver: 用于对MySQL表数据进行归档和清除工具

pt-config-diff: 用于my.cnf配置文件和show global variables系统变量之间的对比

pt-deadlock-logger: 通过定时拉取和解析show engine innodb status相关信息,并将死锁信息打印在屏幕 或 写到日志文件 或 写到表,从而实现将所有发生的死锁信息都保存下来

pt-diskstats: 磁盘性能分析

pt-duplicate-key-checker:通过SHOW CREATE TABLE检查每一张表,找出其中重复/冗余的索引

pt-fifo-split:对大文件进行切割

pt-find:通过SHOW TABLE STATUS方式,查找特定的表并执行一些SQL语句

pt-fingerprint:将SQL语句格式化为抽象化形式,可以用于数据脱敏等场景

pt-fk-error-logger:通过定时拉取和解析show engine innodb status相关信息,并将错误信息打印在屏幕 或 写到日志文件 或 写到表,从而实现将所有发生的违反外键约束错误都保存下来

pt-heartbeat:监控工具,第一部分是定期连接上主库,更新心跳表的时间戳;第二部分是定期连接上从库,获取心跳表的时间戳,并与操作系统时间对比计算时间差,从而得出主从延迟大小。

pt-index-usage:多余索引检测利器

pt-ioprofile:数据文件IO监控利器

pt-k8s-debug-collector

pt-kill:杀会话利器

pt-mext:监控MySQL状态的利器

pt-mysql-summary:汇总出MySQL数据库服务器的状态和配置

pt-online-schema-change:用于修改表而不会造成读锁或者写锁

pt-pmp:获取堆栈信息利器

pt-query-digest:用于分析mysql慢查询的一个工具

pt-secure-collect:收集、清理、打包和加密数据

pt-show-grants:格式化打印输出MySQL上的赋权

pt-sift

pt-slave-delay:主从复制延迟

pt-slave-find:查看主从环境的复制层次结构图

pt-slave-restart:监控从库进程状态,如果遇到错误导致进程异常,会尝试重启进程。

pt-stalk:当MySQL发生故障时收集

pt-summary:获取操作系统概要信息。

pt-table-checksum:一个检查主从复制数据库数据一致性的工具,通过在主库上执行检查语句可以在线检查MySQL主从数据库数据的一致性

pt-table-sync:用于表数据的高效同步

pt-table-usage:通过读取日志(例如:慢查询日志)中的查询语句,然后分析语句是如何使用表的,即:表之间的数据流向。

pt-upgrade:在多个服务器上执行查询,并比较不同

pt-variable-advisor:分析MySQL系统变量配置然后对潜在问题提出建议

pt-visual-explain:格式化explain出来的执行计划按照tree方式输出,方便阅读

一.安装

下载https://www.percona.com/downloads rpm包,例如:percona-toolkit-3.5.3-1.el8.x86_64.rpm

有时候可能会报错缺少某些依赖包,可根据提示安装下面对应依赖:

yum -y install perl-DBI perl-DBD-MySQL perl-Time-HiRes perl-IO-Socket-SSL perl-Digest-MD5

执行安装:rpm -ivh percona-toolkit-3.5.3-1.el8.x86_64.rpm

二.实际使用示例

2.1 .pt-online-schema-change,在不锁表的情况下,在线改表,当然,使用也是有限制的,例如必须要有主键或者唯一索引

pt-online-schema-change \

--host=192.168.0.104 \

--port=3306 \

--user=root \

--password=123456 \

--charset=utf8 \

D=testDB,t=table1 \

--alter="add column test1 VARCHAR(64)" \

--execute

2.2 .pt-archiver数据归档,同上,条件有主见或唯一索引,一般采用批量归档

pt-archiver --source h=192.168.0.104,P=3306,u=root,p=123456,D=testDB,t=table1 --dest h=192.168.0.103,P=3306,u=root,p=123456,D=testDB2,t=table2 --where "1=1" --bulk-delete --limit 1000 --commit-each --bulk-insert --progress 1000

where “1=1”代表归档全表,也可以使用其它条件,如时间,地区等等,注意:若这边的条件是 where 1=1,或者正常大于小于,则源表中id最大的一行的值不会被写入目标表,除非加上--no-safe-auto-increment

bulk-delete:批量删除。

limit:每批归档的记录数。

ommit-each:对于每一批记录,只会 COMMIT 一次。

bulk-insert:归档数据以 LOAD DATA INFILE 的方式导入到归档库中。

--progress :每处理多少行输出一次处理信息

--local:不把optimize或analyze操作写入到binlog里面(防止造成主从延迟巨大)

--analyze=ds: 操作结束后,优化表空间(d表示dest,s表示source)

默认情况下,pt-archiver操作结束后,不会对source、dest表执行analyze或optimize操作,

因为这种操作费时间,并且需要你提前预估有足够的磁盘空间用于拷贝表。

一般建议也是pt-archiver操作结束后,在业务低谷手动执行analyze table用以分析表

--file '/tmp/%Y-%m-%d.sql' 归档到文件

如果要执行 LOAD DATA LOCAL INFILE 操作,需将目标库的 local_infile 参数设置为 ON。

如果不指定 --bulk-insert 且没指定 --commit-each,则目标库的插入是逐行提交,销量大大降低,非常耗时

如果不指定 --commit-each,即使表中的 100条记录是通过一条 DELETE 命令删除的,但因为涉及了 100条记录,pt-archiver 会执行 COMMIT 操作 100次。目标库同样如此。

在使用 --bulk-insert 归档时要注意,如果导入的过程中出现问题,譬如主键冲突,pt-archiver 是不会提示任何错误的。

如何避免主从延迟

无论是数据归档还是删除,对于源库,都需要执行 DELETE 操作。

很多人担心,如果删除的记录数太多,会造成主从延迟。

事实上,pt-archiver 本身就具备了基于主从延迟来自动调节归档(删除)操作的能力。

如果从库的延迟超过 1s(由 --max-lag 指定)或复制状态不正常,则会暂停归档(删除)操作,直到从库恢复。

默认情况下,pt-archiver 不会检查从库的延迟情况。

如果要检查,需通过 --check-slave-lag 显式设置从库的地址,譬如,

pt-archiver --source h=192.168.0.104,P=3306,u=root,p=123456,D=testDB,t=table1 --where "1=1" --bulk-delete --limit 1000 --commit-each --primary-key-only --purge --check-slave-lag h=192.168.0.105,P=3306,u=root,p=123456

这里只会检查 192.168.0.105 的延迟情况。

从数据安全的角度出发,最推荐的归档方式是:

先归档,但不删除源库的数据。

比对源库和归档库的数据是否一致。

如果比对结果一致,再删除源库的归档数据。

其中,第一步和第三步可通过 pt-archiver 搞定,第二步可通过 pt-table-sync 搞定。

相对于边归档边删除的这种方式,虽然麻烦不少,但相对来说,更安全。

2.3. pt-table-checksum,检测主从数据库是否一致

pt-table-checksum --nocheck-replication-filters --databases=test --replicate=test.checksums --host=192.168.0.104 --user=checksums --password=123456 --port=3306 --no-check-binlog-format --nocheck-replication-filters --nocreate-replicate-table;

–nocheck-binlog-format:不检查全部数据库的binlog_format是否一致,请在确认全部数据库的binlog_format一致的状况下,使用该参数

–nocreate-replicate-table:不建立--replicate指定的database和table。

--nocheck-replication-filters:不检查复制过滤器,建议启用。后面可以用–databases来指定需要检查的数据库

2.4. pt-table-sync,pt-table-checksum检测主从数据库是否一致,pt-table-sync,修复数据不一致

pt-table-sync h=192.168.0.104,P=3306,u=root,p=123456--charset=utf8 --databases=test --tables=table1,table2 --check-slave --sync-to-master --transaction --verbose --dry-run

--check-slave:检查目标服务器是否为从服务器

--sync-to-master:将指定的服务器视为从服务器,检查show slave status,连接到服务器的master,并将master视为源,将slave视为目标

--transaction:如果--transaction指定,则不锁表,而是通过开始和提交事务来实现锁定和解锁

--verbose:打印同步操作的结果

2.5. pt-kill,是一个查杀mysql线程和查询的工具,主要是为了防止一些大/复杂/长时间查询占用数据库及系统资源,而对线上业务造成影响的情况

pt-kill --busy-time=10 --victims all --print --kill-query(查杀运行时间超过10s的SQL语句但保留线程)
pt-kill --match-host "192.168.0.104"--print --victims all --busy-time=20s(查某IP来源且运行时间超过20s的会话)
pt-kill --match-command Sleep --victims all --interval 10 --kill --print(每10s检查一次,状态为sleep的进程就干掉)
pt-kill --match-info "select|Select|SELECT" --print --victims all --busy-time 20s(查杀select大于20s的会话)
pt-kill --match-command Sleep --victims all --idle-time=1h --print(查杀状态为sleep且超过1小时的进程)
pt-kill --match-user "test" --victims all --print --kill(查杀某用户的会话)

2.6. pt-query-digest,分析查询执行日志,并产生一个查询报告,为mysql,postgresql,memcached过滤,重放或者转换语句,常用于分析mysql慢查询

pt-query-digest --since=12h /var/lib/mysql/log/mysql-slow.log(分析12小时内的慢查询日志)

---------------------------------------------------------------------------------------------------------------------------------------------------

pt-query-digest /var/lib/mysql/log/mysql-slow.log --since '2023-09-07 09:30:00' --until '2023-09-07 10:00:00'(分析某个时间段内的慢查询)

---------------------------------------------------------------------------------------------------------------------------------------------------

mysqlbinlog mysql-bin.000093 > mysql-bin000093.sql

pt-query-digest --type=binlog  mysql-bin000093.sql > slow_report10.log(分析bin)

---------------------------------------------------------------------------------------------------------------------------------------------------

其它功能使用详情可查看官网