mysql 8.0原生不支持json格式慢查询日志,slow_query_log_format变量不存在;所谓json输出均来自pt-query-digest等工具对含log_slow_extra字段的结构化文本日志的解析转换。

MySQL 8.0 **原生不支持 JSON 格式的慢查询日志输出**,slow_query_log_format 这个变量根本不存在,官方从未提供 JSON 日志格式选项。所谓“JSON 慢日志”,是外部工具解析后的结果,不是 MySQL 自己写的。
为什么 mysqldumpslow 或 pt-query-digest 输出像 JSON?
它们只是把解析后的结构化字段(如 Query_time、Lock_time、Rows_examined)用 JSON 格式打印出来,底层日志仍是纯文本。MySQL 8.0 的慢日志默认就是带 # Rows_examined、# Lock_time 等 extra 字段的增强文本格式——它不是 JSON,但比老格式更结构化,方便工具提取。
- 你看到的 JSON 输出,100% 来自
pt-query-digest --format json或类似脚本转换,不是 MySQL 写的 -
mysqldumpslow完全不支持 JSON 输出,连--format参数都没有 - 试图在
my.cnf里写slow_query_log_format = JSON会静默忽略,MySQL 启动日志里可能报unknown variable
如何让慢日志内容足够丰富,供 JSON 工具解析?
关键不是“开启 JSON 格式”,而是确保日志含足够字段:MySQL 8.0 默认开启 log_slow_extra = ON,这会写出 # Rows_examined、# Lock_time、# Schema、# Thread_id 等行。这些才是 pt-query-digest 能生成准确 JSON 的基础。
- 确认已启用:
SELECT @@log_slow_extra;应返回ON - 若为
OFF,执行SET GLOBAL log_slow_extra = ON;(需 SUPER 权限) - 注意:该变量不能写入
my.cnf,只支持运行时设置;重启后需重新执行或加到启动脚本 - 搭配
log_output = 'FILE'和有效slow_query_log_file路径,否则字段再全也落不到磁盘
怎样用 pt-query-digest 生成真正可用的 JSON 分析结果?
pt-query-digest 是目前唯一能稳定处理 MySQL 8.0 慢日志并导出 JSON 的成熟工具,它能识别 microsecond 级时间、还原 prepared statement 占位符、聚合 digest 并保留原始 SQL 片段。
- 安装 Percona Toolkit(推荐 3.5+ 版本):
apt install percona-toolkit或从官网下载 - 基础解析命令:
pt-query-digest /var/log/mysql/mysql-slow.log --format json > report.json - 若日志量大,加
--limit 10只取 Top 10;加--filter '$event->{Bytes} > 1024'过滤大结果集语句 - 注意权限:确保
pt-query-digest有读取日志文件权限,且文件未被logrotate归档压缩(它不自动解压 .gz)
别踩坑:哪些“JSON 相关操作”根本没用?
很多搜索结果会误导你去折腾不存在的功能。以下操作全部无效或自欺欺人:
- 在
my.cnf中添加slow_query_log_format = JSON或log_output = 'JSON'—— MySQL 会启动失败或忽略 - 用
mysqldumpslow -s at /var/log/mysql/mysql-slow.log | jq试图强转 JSON —— 因不识别# Rows_examined行,整条记录被跳过,数据残缺 - 查
mysql.slow_log表然后SELECT JSON_OBJECT(...)拼接 —— 该表字段固定且缺失关键信息(如Rows_examined),且默认关闭、性能差、不存微秒级时间 - 以为
performance_schema.events_statements_summary_by_digest能替代 —— 它没有原始 SQL、无 Query_time 微秒值、摘要条数受performance_schema_digests_size限制(默认仅 2000)
真正要 JSON 化分析,就一条路:确保 MySQL 8.0 写出带 log_slow_extra 的文本日志,再用 pt-query-digest --format json 解析。中间任何想绕过这一步、让 MySQL 自己吐 JSON 的尝试,都会卡在第一步。











