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)
---------------------------------------------------------------------------------------------------------------------------------------------------
其它功能使用详情可查看官网