必须同时设对slow_query_log、log_output和slow_query_log_file,否则日志根本不会落地;SHOW VARIABLES LIKE 'slow_query_log'返回ON但日志为空,最常见原因是log_output未包含FILE,需确认其值并显式配置log_output=FILE。

必须同时设对 slow_query_log、log_output 和 slow_query_log_file,否则日志根本不会落地——不是“没生效”,是压根没写。
为什么 SHOW VARIABLES LIKE 'slow_query_log' 返回 ON 但日志文件空?
最常见原因是 log_output 不是 FILE。MySQL 8.0 默认值虽为 FILE,但一旦被运行时 SET 修改过(比如临时切到 TABLE),再删配置不重置它,重启后就静默失效。
- 执行
SHOW VARIABLES LIKE 'log_output';,返回值必须包含FILE,不能只有TABLE或空 - 如果返回
TABLE,永久修复方式是在my.cnf的[mysqld]段显式加一行:log_output = FILE - 别信“默认就是 FILE”——升级后或被运维脚本改过,大概率不是
-
slow_query_log_file路径必须是绝对路径,且 MySQL 进程(通常是mysql用户)有写权限;用sudo -u mysql touch /path/to/slow.log测试是否可写
long_query_time 设成 1 就真按 1 秒记慢 SQL 吗?
不完全是。long_query_time 单位是秒,但 MySQL 8.0 内部以微秒精度统计,判断逻辑是「执行时间 ≥ 设置值(秒)」。更关键的是:该参数对已有连接无效。
- 执行
SET GLOBAL long_query_time = 1.0;后,**新建立的连接**才按 1 秒判断;所有已存在的连接仍用旧值(默认 10 秒) - 所以调低阈值后看不到预期日志,不是配置错,是连接太“老”了——需要重连或重启应用
- 建议初始设为
1.0(注意带小数点),避免某些客户端解析整数 1 出偏差;OLTP 场景可试0.5,但别设0(MySQL 5.7+ 对 0 有特殊行为) - 验证当前生效值:直接查
SELECT @@long_query_time;,别只看配置文件
log_queries_not_using_indexes 和 min_examined_row_limit 怎么配才不炸盘?
这两个参数一开就容易让日志量暴涨,尤其 log_queries_not_using_indexes 是线上大忌。
-
log_queries_not_using_indexes = ON会记录所有未走索引的查询,哪怕只查 1 行、耗时 1ms 也记——日志瞬间膨胀,真正耗时的慢 SQL 反而被淹没 - 如真要排查索引缺失,只在低峰期临时开启,并配合
min_examined_row_limit = 1000(只记扫描行数 ≥1000 的语句),能过滤掉大量无意义的小表全扫 - 生产环境推荐默认关:
log_queries_not_using_indexes = OFF,靠pt-query-digest分析Rows_examined字段更准 -
min_examined_row_limit是全局变量,动态设置即可:SET GLOBAL min_examined_row_limit = 1000;
日志格式变了,mysqldumpslow 解析失败怎么办?
MySQL 8.0 开启 log_slow_extra(默认开启)后,日志新增 # Rows_examined、# Lock_time 等键值对字段,老版本 mysqldumpslow(来自 5.x 工具包)直接跳过或报错。
- 先确认是否启用 extra 字段:
head -n 20 /var/log/mysql/slow.log | grep -E '^(# Time|Rows_examined)' - 若看到
# Rows_examined:,说明用了新格式;此时必须用 MySQL 8.0 自带的mysqldumpslow(路径通常为/usr/bin/mysqldumpslow),或换pt-query-digest - 不想换工具?可临时关 extra:
SET GLOBAL log_slow_extra = OFF;,但会丢失Rows_examined等关键指标,不推荐长期关 -
pt-query-digest是更优解:支持 microsecond 级时间、自动去重、聚合、还能加--explain补执行计划
最易忽略的一点:日志路径和错误日志共用磁盘时,慢查暴增可能卡住整个实例刷盘;slow_query_log_file 务必单独挂载,且剩余空间留够 20% 以上。


















