1Percona Toolkit 概览
Percona Toolkit 是 Percona 公司开源的一套 MySQL/MongoDB 运维工具集,包含 30+ 个命令行工具。
核心工具分类:
查询分析类:
• pt-query-digest — 慢查询日志分析(最常用)
• pt-fingerprint — SQL 指纹提取
• pt-visual-explain — 可视化执行计划
Schema 变更类:
• pt-online-schema-change — 在线表结构变更
• pt-archiver — 数据归档
复制检查类:
• pt-table-checksum — 主从数据一致性校验
• pt-table-sync — 主从数据同步修复
• pt-heartbeat — 复制延迟监控
其他实用工具:
• pt-stalk — 在问题发生时自动收集诊断信息
• pt-kill — 按规则自动 kill 查询
• pt-diskstats — 磁盘 IO 统计
• pt-deadlock-logger — 死锁日志记录
2安装方法
方法一:通过 Percona 仓库安装(推荐)
# CentOS/RHEL
yum install https://repo.percona.com/yum/percona-release-latest.noarch.rpm
yum install percona-toolkit
# Debian/Ubuntu
wget https://repo.percona.com/apt/percona-release_latest.generic_all.deb
dpkg -i percona-release_latest.generic_all.deb
apt-get update && apt-get install percona-toolkit
方法二:源码安装
wget https://downloads.percona.com/downloads/percona-toolkit/LATEST/source/tarball/percona-toolkit-latest.tar.gz
tar xzf percona-toolkit-latest.tar.gz
cd percona-toolkit-*
perl Makefile.PL && make && make install
验证安装:
pt-query-digest --version
依赖说明:
• Perl 5.8+(通常系统自带)
• DBI 和 DBD::mysql 模块
• 部分工具需要 mysqldump、mysqlbinlog
3pt-query-digest 慢查询分析
pt-query-digest 是分析 MySQL 慢查询日志最强大的工具。
基本用法:
# 分析慢查询日志
pt-query-digest /var/log/mysql/slow.log
# 分析最近 1 小时的慢查询
pt-query-digest --since '1h' /var/log/mysql/slow.log
# 分析并输出到文件
pt-query-digest /var/log/mysql/slow.log --output=report > /tmp/slow_report.txt
# 分析 General Log
pt-query-digest --type genlog /var/log/mysql/general.log
# 分析 Binary Log
mysqlbinlog mysql-bin.000001 | pt-query-digest --type binlog
输出报告解读:
报告分为三部分:
1. Overall — 总体统计(总查询数、时间范围、吞吐量)
2. Profile — 按查询指纹排序的 Top N(最耗时的查询类型)
3. Query Detail — 每个查询指纹的详细分析
Profile 中的关键指标:
• Rank — 排名(按总耗时)
• Response time — 总耗时和占比
• Calls — 调用次数
• R/Call — 平均每次耗时
• V/M — 方差/均值比(越大越不稳定)
• Item — 查询指纹
高级用法:
# 只看 TOP 20
pt-query-digest --limit 20 /var/log/mysql/slow.log
# 按数据库过滤
pt-query-digest --filter '$event->{db} eq "production"' slow.log
# 保存结果到数据库(方便趋势分析)
pt-query-digest --review h=127.0.0.1,D=percona,t=query_review slow.log
4pt-online-schema-change 在线 DDL
pt-online-schema-change(简称 pt-osc)用于大表在线表结构变更,不阻塞读写。
工作原理:
1. 创建一张与原表结构相同的空表(_new 表)
2. 在新表上执行 ALTER 操作
3. 在原表上创建 3 个触发器(INSERT/UPDATE/DELETE)
4. 分批将原表数据 copy 到新表
5. 数据 copy 完成后,RENAME TABLE 原子切换
6. 删除触发器和旧表
基本用法:
# 添加索引
pt-online-schema-change --alter "ADD INDEX idx_name (column_name)" \
D=mydb,t=mytable --execute
# 添加列
pt-online-schema-change --alter "ADD COLUMN status TINYINT DEFAULT 0" \
D=mydb,t=mytable --execute
# 修改列类型
pt-online-schema-change --alter "MODIFY COLUMN name VARCHAR(200)" \
D=mydb,t=mytable --execute
关键参数:
--chunk-size=1000 每批处理行数
--max-lag=1s 从库延迟超过此值暂停
--max-load="Threads_running=25" 负载阈值
--critical-load="Threads_running=50" 紧急负载阈值(暂停)
--dry-run 仅模拟,不实际执行
--execute 实际执行
--no-drop-old-table 不删除旧表
--recursion-method=processlist 从库发现方式
生产注意事项:
• 表必须有主键或唯一索引
• 不能有已存在的触发器
• 建议在低峰期执行
• 百万级以上大表建议先 --dry-run 确认无误
5pt-table-checksum 主从一致性校验
pt-table-checksum 用于检查主从数据库之间的数据一致性。
工作原理:
1. 在主库上对每张表按 chunk 计算 CRC32 校验和
2. 校验 SQL 通过复制同步到从库执行
3. 对比主从的 checksum 结果
4. 不一致的 chunk 记录到 checksum 表
基本用法:
# 校验所有数据库(排除系统库)
pt-table-checksum --host=master-host --user=root --password=xxx \
--no-check-replication-filters --recursion-method=processlist
# 指定数据库
pt-table-checksum --databases=mydb --host=master-host \
--user=root --password=xxx
# 指定表
pt-table-checksum --tables=mydb.users,mydb.orders \
--host=master-host --user=root --password=xxx
输出解读:
TS ERRORS DIFFS ROWS DIFF_ROWS CHUNKS SKIPPED TABLE
06-01T10:00 0 0 1000000 0 100 0 mydb.users
06-01T10:01 0 2 5000000 1523 500 0 mydb.orders
DIFFS > 0 表示该表存在主从不一致。
修复不一致:使用 pt-table-sync
# 打印修复 SQL(不执行)
pt-table-sync --print --replicate=percona.checksums master-host
# 实际修复
pt-table-sync --execute --replicate=percona.checksums master-host
注意事项:
• 执行时会增加主库负载(建议低峰期)
• --chunk-size 控制每批校验行数
• 对于 ROW 格式复制的集群完全适用
6其他实用工具
pt-heartbeat — 精确测量复制延迟
# 在主库启动写入
pt-heartbeat --update --database percona --create-table --daemonize
# 在从库监控延迟
pt-heartbeat --monitor --database percona --master-server-id=1
输出:0.02s, 0.01s, 0.03s(每秒输出当前延迟)
pt-kill — 自动 kill 长查询
# kill 运行超过 60 秒的查询
pt-kill --busy-time 60 --kill --print --interval 5 \
--host=127.0.0.1 --user=root --password=xxx
# 只 kill 特定用户的查询
pt-kill --busy-time 60 --kill --match-user='app_user' \
--host=127.0.0.1 --user=root --password=xxx
pt-stalk — 问题自动诊断
# 当 Threads_running > 20 时自动收集诊断信息
pt-stalk --function=status --variable=Threads_running --threshold=20 \
--collect --dest=/var/lib/pt-stalk
pt-archiver — 数据归档
# 归档 90 天前的订单到归档表
pt-archiver --source h=localhost,D=mydb,t=orders \
--dest h=localhost,D=mydb_archive,t=orders \
--where "created_at < DATE_SUB(NOW(), INTERVAL 90 DAY)" \
--limit 1000 --commit-each --progress 5000
7最佳实践总结
日常运维中的最佳实践:
1. 慢查询治理(每周)
• 每天定时收集慢查询日志
• 每周用 pt-query-digest 生成分析报告
• TOP 10 慢查询分配给开发优化
• 优化后验证效果(对比前后 R/Call)
2. 主从一致性(每月)
• 每月用 pt-table-checksum 全量校验
• 发现不一致后先分析原因(是否有非复制写入)
• 确认安全后用 pt-table-sync 修复
3. 大表 DDL 规范
• 100 万行以下:直接 ALTER(MySQL 5.7+ InnoDB 支持 Online DDL)
• 100 万 - 1000 万行:pt-osc 或 gh-ost
• 1000 万行以上:gh-ost(更安全,无触发器)
• 所有 DDL 变更通过 Archery 工单流程
4. 复制延迟监控
• 部署 pt-heartbeat 获取亚秒级延迟数据
• 配合 Prometheus + Grafana 可视化
• 设置告警:延迟 > 5s 告警,> 30s 紧急
5. 自动化集成
• pt-kill 守护进程:自动 kill 超长查询
• pt-stalk:问题发生时自动抓取现场
• 所有工具配合 cron 实现无人值守