菜单

Loen
发布于 2025-08-29 / 5 阅读
0
0

pt-query-digest 完全指南:从入门到高级实战

一、什么是 pt-query-digest?

pt-query-digest 是 Percona Toolkit 中的明星工具,用于分析 MySQL 慢查询日志。它能够将庞大的慢日志文件转化为易懂的性能分析报告,帮助DBA快速定位数据库性能瓶颈。

二、安装与配置

安装方法

# CentOS/RHEL
sudo yum install percona-toolkit

# Ubuntu/Debian
sudo apt-get install percona-toolkit

# 使用docker
docker run -it --rm -v $(pwd):/data percona/percona-toolkit pt-query-digest --version

启用MySQL慢查询日志

-- 在MySQL中执行
SET GLOBAL slow_query_log = 'ON';
SET GLOBAL long_query_time = 2;      -- 超过2秒的查询记录
SET GLOBAL slow_query_log_file = '/var/log/mysql/slow.log';
SET GLOBAL log_queries_not_using_indexes = 'ON';

三、基础使用

1. 基本分析

# 最简单的分析
pt-query-digest /var/log/mysql/slow.log

# 输出到文件
pt-query-digest slow.log > slow_report.txt

# 分析最近的文件
pt-query-digest /var/log/mysql/slow.log --since="24h"

2. 排序和限制

# 按执行时间排序,显示前10条
pt-query-digest slow.log --order-by=Query_time:sum --limit=10

# 按锁定时间排序
pt-query-digest slow.log --order-by=Lock_time:sum --limit=5

# 按执行次数排序
pt-query-digest slow.log --order-by=Count:sum --limit=10

3. 过滤特定查询

# 只分析SELECT语句
pt-query-digest slow.log --filter '$event->{arg} =~ m/^SELECT/i'

# 分析特定表的查询
pt-query-digest slow.log --filter '$event->{arg} =~ m/users/i'

# 排除特定用户
pt-query-digest slow.log --filter '$event->{user} !~ m/root/i'

四、中级应用

1. 生成不同类型的报告

# 生成HTML报告
pt-query-digest slow.log --report-format=html > report.html

# 生成JSON格式
pt-query-digest slow.log --report-format=json > report.json

# 详细查询报告
pt-query-digest slow.log --report-format=query_report

2. 时间范围分析

# 分析特定时间范围
pt-query-digest slow.log --since="2025-08-28 00:00:00" --until="2025-08-29 23:59:59"

# 分析最近12小时
pt-query-digest slow.log --since="12h"

# 分析特定时间段(每天9点到18点)
pt-query-digest slow.log --time-range="09:00-18:00"

3. 对比分析

# 两个时间段的对比
pt-query-digest slow.log --since="2025-08-20" --until="2025-08-25" > week1.txt
pt-query-digest slow.log --since="2025-08-26" --until="2025-08-29" > week2.txt

# 使用review模式存储历史数据
pt-query-digest slow.log --review h=localhost,D=monitor,t=query_review

五、高级实战技巧

1. 实时监控分析

# 实时分析当前进程
pt-query-digest --processlist h=localhost --interval 0.01 --print --no-stream

# 监控并只显示慢查询
pt-query-digest --processlist h=localhost --filter '$event->{Time} > 2' --interval 1

2. 高级过滤技巧

# 复合过滤:查询时间大于5秒且扫描行数大于10000
pt-query-digest slow.log --filter '$event->{Query_time} > 5 && $event->{Rows_examined} > 10000'

# 特定数据库和用户
pt-query-digest slow.log --filter '$event->{db} eq "mydb" && $event->{user} eq "app_user"'

# 错误查询分析
pt-query-digest slow.log --filter '$event->{Error} ne ""'

3. 生成可执行的优化建议

# 生成创建索引的建议
pt-query-digest slow.log --report-format=query_report --filter '$event->{Rows_examined} > 100000' | grep -A5 -B5 "SELECT\|UPDATE\|DELETE"

4. 与Explain结合分析

# 提取需要分析的SQL语句
pt-query-digest slow.log --order-by=Query_time:sum --limit=5 --output=slow_queries.sql

# 然后手动执行EXPLAIN分析
mysql -e "EXPLAIN SELECT * FROM users WHERE created_at > '2025-01-01';"

六、解读分析报告

报告关键指标解读

# Overall: 308.93k total, 300 unique, 0.03 QPS, 0.15x concurrency
# Time range: 2025-05-15T17:37:29 to 2025-08-29T09:19:39
# Attribute          total     min     max     avg     95%  stddev  median
# ============     ======= ======= ======= ======= ======= ======= =======
# Exec time        1384350s      3s   4979s      4s      6s     13s      4s
# Lock time           230s       0     14s   743us   144us    61ms   103us
# Rows sent         33.29M       0   2.37M  113.00  487.09   8.40k    0.99
# Rows examine     629.53G       0 259.56M   2.09M   2.26M   1.90M   1.95M
  • Exec time: 查询执行时间,关注max和95%值
  • Rows examine: 扫描行数,值过大说明索引问题
  • Rows sent: 返回行数,与扫描行数比值越小越好
  • Lock time: 锁等待时间,过高可能有锁竞争

七、实战案例

案例1:分析并优化慢查询

# 1. 找出最耗时的查询
pt-query-digest slow.log --order-by=Query_time:sum --limit=3

# 2. 查看具体查询的执行计划
pt-query-digest slow.log --filter '$event->{fingerprint} =~ m/SELECT.*users/' --output=explain_queries.sql

# 3. 生成优化建议

案例2:监控生产环境实时性能

#!/bin/bash
# realtime_monitor.sh

while true; do
    echo "=== $(date) ==="
    pt-query-digest --processlist h=localhost \
                    --filter '$event->{Time} > 2' \
                    --order-by=Time:max \
                    --limit=5
    sleep 30
done

案例3:每日性能报告

#!/bin/bash
# daily_report.sh

DATE=$(date +%Y%m%d)
REPORT_FILE="/tmp/mysql_report_$DATE.html"

pt-query-digest /var/log/mysql/slow.log \
                --since="24h" \
                --report-format=html \
                > $REPORT_FILE

# 发送邮件报告
mail -s "MySQL Daily Report $DATE" dba@company.com < $REPORT_FILE

八、常见问题排查

1. 内存不足处理

# 分析大文件时使用分段处理
pt-query-digest slow.log --memory-limit=1G --chunk-size=100000

2. 网络分析

# 分析远程数据库
pt-query-digest --processlist h=db-prod.example.com,u=monitor,p=password --interval=5

3. 批量处理多个文件

# 分析多个慢日志文件
pt-query-digest /var/log/mysql/slow.log*

九、最佳实践

  1. 定期分析:设置每天自动分析慢日志
  2. 建立基线:保存历史报告用于对比
  3. 重点关注:95%百分位的值比平均值更重要
  4. 结合监控:与Prometheus、Grafana等监控系统结合
  5. 团队协作:将报告分享给开发团队共同优化

十、总结

pt-query-digest 是MySQL性能优化不可或缺的工具。从简单的日志分析到复杂的性能监控,它都能提供有价值的见解。掌握这个工具,你就能:

  • ✅ 快速定位性能瓶颈
  • ✅ 识别缺失的索引
  • ✅ 优化低效的SQL查询
  • ✅ 监控数据库健康状态
  • ✅ 提升整体系统性能

开始使用 pt-query-digest,让你的数据库性能优化事半功倍!


评论