4. 慢查询日志采集工具:mysqldumpslow、pt-query-digest 的安装与基本使用
在生产环境中,MySQL 慢查询日志是定位搜索服务尾延迟压测波动的第一手数据源。原始日志文件行数多、格式杂乱,必须借助专业工具进行聚合、排序与统计。本章介绍两款最常用的采集工具:MySQL 官方自带的 mysqldumpslow 与 Percona 生态的 pt-query-digest,涵盖安装、基本使用与输出解读。
4.1 工具定位与对比
| 对比维度 | mysqldumpslow | pt-query-digest |
|---|---|---|
| 来源 | MySQL 官方(随 Server 分发) | Percona Toolkit 独立包 |
| 安装复杂度 | 零安装,直接调用 | 需安装 perl 依赖与 Toolkit 包 |
| 聚合能力 | 按 SQL 指纹聚合,支持排序 | 按指纹聚合,支持多维排序、过滤、直方图 |
| 输出格式 | 文本摘要 | 文本 / JSON / 报告模式 |
| 适用场景 | 快速查看 Top N 慢查询 | 深度分析、压测波动归因、长期监控 |
选型建议:日常巡检用
mysqldumpslow 即可;压测波动排查、尾延迟归因必须使用 pt-query-digest,其直方图与时间分布分析能直接定位“毛刺”来源。
4.2 mysqldumpslow 安装与基本使用
4.2.1 安装确认
mysqldumpslow 是 MySQL 安装包的一部分,无需单独安装。确认方式:
# 查找工具路径
which mysqldumpslow
# 通常位于 MySQL 安装目录的 bin/ 下
/usr/local/mysql/bin/mysqldumpslow --help
4.2.2 常用参数
| 参数 | 说明 | 示例 |
|---|---|---|
-s c |
按查询次数排序 | -s c |
-s t |
按查询总耗时排序 | -s t |
-s at |
按平均耗时排序 | -s at |
-t N |
只显示前 N 条 | -t 10 |
-g pattern |
正则过滤 SQL 文本 | -g "SELECT.*user" |
4.2.3 基本使用示例
# 查看耗时最长的前 10 条慢查询
mysqldumpslow -s t -t 10 /var/log/mysql/slow-query.log
# 按平均耗时排序,显示前 5 条
mysqldumpslow -s at -t 5 /var/log/mysql/slow-query.log
# 过滤包含特定表的慢查询
mysqldumpslow -g "search_index" /var/log/mysql/slow-query.log
4.2.4 输出解读
Count: 123 Time=2.34s (288s) Lock=0.01s (1s) Rows=1000.0 (123000)
SELECT * FROM search_doc WHERE status = N AND create_time < N ORDER BY id DESC
- Count:该 SQL 指纹被记录 123 次。
- Time=2.34s (288s):平均耗时 2.34 秒,总耗时 288 秒。
- Lock:平均锁等待时间。
- Rows:平均返回行数与总行数。
注意:mysqldumpslow 会将 SQL 中的具体数字替换为
N,字符串替换为 'S',便于指纹聚合。但这也意味着无法直接看到具体参数值,排查时需要结合原始日志。
4.3 pt-query-digest 安装与基本使用
4.3.1 安装步骤
# 1. 安装 Percona Toolkit(以 CentOS 为例)
yum install -y percona-toolkit
# 2. 验证安装
pt-query-digest --version
# 输出示例:pt-query-digest 3.5.0
若使用源码安装:
# 下载最新版
wget https://downloads.percona.com/downloads/percona-toolkit/3.5.0/tarball/percona-toolkit-3.5.0.tar.gz
tar -xzf percona-toolkit-3.5.0.tar.gz
cd percona-toolkit-3.5.0
perl Makefile.PL
make && make install
4.3.2 核心参数
| 参数 | 说明 | 示例 |
|---|---|---|
--limit |
限制输出行数 | --limit=20 |
--order-by |
排序字段(Query_time:sum 等) | --order-by=Query_time:sum |
--filter |
Perl 表达式过滤 | --filter '$event->{db} eq "search"' |
--since / --until |
时间范围过滤 | --since '2025-04-01 10:00:00' |
--output |
输出格式(report/json/dsn) | --output=json |
4.3.3 基本使用示例
# 分析慢查询日志,按总耗时排序,显示前 10 条
pt-query-digest --order-by=Query_time:sum --limit=10 /var/log/mysql/slow-query.log
# 只分析 search 数据库的慢查询
pt-query-digest --filter '$event->{db} eq "search"' /var/log/mysql/slow-query.log
# 输出 JSON 格式,便于程序化处理
pt-query-digest --output=json /var/log/mysql/slow-query.log > slow_report.json
# 分析指定时间窗口内的慢查询
pt-query-digest --since '2025-04-01 10:00:00' --until '2025-04-01 11:00:00' /var/log/mysql/slow-query.log
4.3.4 输出结构解读
pt-query-digest 的报告分为三个主要部分:
- Overall:全局统计,包括总查询数、总耗时、唯一指纹数。
- Profile:按指纹聚合的排名表,包含占比、平均耗时、标准差等。
- Query report:每个指纹的详细分析,包含时间直方图、执行计划建议。
压测波动排查关键字段:
- pct:该查询占总耗时的百分比,高占比是优化重点。
- stddev:耗时标准差,值越大说明波动越剧烈,是尾延迟的潜在来源。
- time histogram:时间分布直方图,直观展示“毛刺”出现在哪个耗时区间。
4.4 工具工作流程对比
4.5 实战建议:压测波动场景下的工具选择
压测波动排查三步走:
- 快速扫描:使用
mysqldumpslow -s t -t 20获取 Top 20 耗时查询,确认是否有明显异常。 - 深度分析:使用
pt-query-digest --order-by=Query_time:sum --limit=50生成完整报告,关注 stddev 与直方图。 - 时间窗口对比:分别分析压测“正常时段”与“波动时段”的慢查询日志,对比指纹分布差异,定位新增或恶化的查询。
效率提升:将
pt-query-digest 的输出通过管道导入 grep / awk 提取关键指标,或使用 --output=json 配合 jq 进行自动化分析,适合集成到压测流水线中。