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 的报告分为三个主要部分:

  1. Overall:全局统计,包括总查询数、总耗时、唯一指纹数。
  2. Profile:按指纹聚合的排名表,包含占比、平均耗时、标准差等。
  3. Query report:每个指纹的详细分析,包含时间直方图、执行计划建议。
压测波动排查关键字段:
  • pct:该查询占总耗时的百分比,高占比是优化重点。
  • stddev:耗时标准差,值越大说明波动越剧烈,是尾延迟的潜在来源。
  • time histogram:时间分布直方图,直观展示“毛刺”出现在哪个耗时区间。

4.4 工具工作流程对比

mysqldumpslow 工作流程 原始慢查询日志 SQL 指纹归一化 按指标排序 文本摘要输出 Top N 慢查询列表 pt-query-digest 工作流程 原始慢查询日志 SQL 指纹归一化 多维排序与过滤 时间直方图生成 标准差与波动分析 JSON / 报告输出 尾延迟毛刺定位与归因

4.5 实战建议:压测波动场景下的工具选择

压测波动排查三步走:
  1. 快速扫描:使用 mysqldumpslow -s t -t 20 获取 Top 20 耗时查询,确认是否有明显异常。
  2. 深度分析:使用 pt-query-digest --order-by=Query_time:sum --limit=50 生成完整报告,关注 stddev 与直方图。
  3. 时间窗口对比:分别分析压测“正常时段”与“波动时段”的慢查询日志,对比指纹分布差异,定位新增或恶化的查询。
效率提升:将 pt-query-digest 的输出通过管道导入 grep / awk 提取关键指标,或使用 --output=json 配合 jq 进行自动化分析,适合集成到压测流水线中。