MySQL慢查询日志分析工具:pt-query-digest

概述

  • 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. 最佳实践

  1. 定期分析:每天或每周分析慢查询日志,持续优化。
  2. 关注高频率/高延迟查询:优先优化执行次数多或单次耗时长的查询。
  3. 结合 EXPLAIN:对问题查询使用 EXPLAIN 查看执行计划。
  4. 监控趋势:使用 --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 的核心功能,并利用它优化数据库性能。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值