概述
pt-query-digest
是 Percona Toolkit 中的一个强大工具,用于分析 MySQL 慢查询日志(Slow Query Log)或其他类型的查询日志(如二进制日志、通用日志)。它能帮助开发者快速定位数据库性能瓶颈,优化 SQL 查询。以下是详细的使用教程- 文章已转换成电子书,感兴趣的朋友可以转存:
https://pan.quark.cn/s/f52968c518d3
1. 安装 Percona Toolkit
确保已安装 Percona Toolkit:
# Debian/Ubuntu
sudo apt-get install percona-toolkit
# CentOS/RHEL
sudo yum install percona-toolkit
2. 基本用法
2.1 分析慢查询日志文件
pt-query-digest /path/to/slow-query.log
• 默认会将分析结果输出到标准输出(终端)。
• 示例报告会按查询的“总耗时”排序,显示最耗时的查询。
2.2 生成报告文件
pt-query-digest /path/to/slow-query.log --output slow-report.txt
• 使用 --output
将结果保存到文件。
2.3 分析其他日志类型
• 分析二进制日志:
pt-query-digest --type=binlog /path/to/mysql-bin.000001
• 分析通用日志:
pt-query-digest --type=genlog /path/to/general.log
• 分析 TCP 抓包数据:
tcpdump -s 65535 -x -nn -q -tttt -i any -c 1000 port 3306 > mysql.tcp
pt-query-digest --type=tcpdump mysql.tcp
3. 常用选项
3.1 过滤和排序
• --filter
:过滤特定查询(支持 Perl 正则表达式):
pt-query-digest --filter '$event->{db} =~ /mydatabase/' slow-query.log
• --limit
:限制输出结果数量:
pt-query-digest --limit 10 slow-query.log # 显示前10个最慢查询
• --order-by
:按特定字段排序:
pt-query-digest --order-by Query_time:sum slow-query.log
3.2 时间范围过滤
• --since
和 --until
:分析特定时间段的日志:
pt-query-digest --since "2023-10-01" --until "2023-10-02" slow-query.log
3.3 保存结果到数据库
pt-query-digest slow-query.log --review h=localhost,D=test,t=query_review
• 需要提前创建表结构(参考 Percona 文档)。
4. 高级用法
4.1 定期分析并自动保存
结合 cron
实现定期分析:
# 每天分析一次慢查询日志
0 0 * * * pt-query-digest /var/log/mysql/slow.log --output /var/reports/slow-report-$(date +\%F).txt
4.2 实时分析慢查询
启用 MySQL 慢查询日志后,实时监控新产生的慢查询:
pt-query-digest --processlist h=localhost --interval 60 --print
• --interval 60
:每 60 秒分析一次当前进程列表。
4.3 比较两份报告
生成不同时间段的报告并比较差异:
pt-query-digest slow-query-20231001.log --output report1.txt
pt-query-digest slow-query-20231002.log --output report2.txt
diff report1.txt report2.txt
5. 分析报告解读
示例报告结构:
# 总体统计
# 590 total queries, 5 unique
# Time range: 2023-10-01 00:00:00 to 2023-10-02 00:00:00
# Attribute total min max avg 95% stddev median
# ============ ======= ======= ======= ======= ======= ======= =======
# Exec time 120s 100ms 5s 200ms 500ms 100ms 150ms
# Lock time 20s 1ms 200ms 30ms 100ms 10ms 20ms
# Query 1: 50% of total time
# Scores: Query_time=50, Rows_sent=100, Rows_examined=1000
# Time range: ...
# Attribute pct total min max avg 95% stddev median
# ========== ==== ======= ======= ======= ======= ======= ======= =======
# Count 50 295
# Exec time 50 60s 100ms 2s 200ms 500ms 100ms 150ms
# Query text: SELECT * FROM users WHERE id = ?
• 关键指标:
• Query_time:查询执行时间。
• Rows_sent:返回的行数。
• Rows_examined:扫描的行数。
• Lock_time:锁等待时间。
• 95%值:95%的查询在此时间内完成。
6. 最佳实践
- 定期分析:每天或每周分析慢查询日志,持续优化。
- 关注高频率/高延迟查询:优先优化执行次数多或单次耗时长的查询。
- 结合 EXPLAIN:对问题查询使用
EXPLAIN
查看执行计划。 - 监控趋势:使用
--review
表记录历史数据,观察优化效果。
7. 常见问题处理
• 权限问题:确保对日志文件和数据库有读取权限。
• 日志文件过大:使用 --limit
或 --filter
缩小分析范围。
• 分析远程数据库:通过 tcpdump
抓包后分析:
tcpdump -s 65535 -x -nn -q -tttt -i any -c 1000 port 3306 > mysql.tcp
pt-query-digest --type=tcpdump mysql.tcp
通过以上步骤,你可以快速掌握 pt-query-digest
的核心功能,并利用它优化数据库性能。