确认 slow_query_log 是否启用需查系统变量 show variables like 'slow_query_log',返回 on 才算真开启;若为 off 则未启用,即使配置文件已设也无效。

如何确认 slow_query_log 是否已启用
直接查 MySQL 系统变量最可靠,SHOW VARIABLES LIKE 'slow_query_log' 返回 ON 才算真开启。很多人只改了配置文件却没重启或没执行 SET GLOBAL,结果日志根本没写。
- 如果返回
OFF,说明当前运行实例未启用,即使 my.cnf 里写了也无效 -
slow_query_log_file的值要一并检查,它可能指向一个不可写的路径(比如 /var/log/mysql/ 但 mysqld 用户没权限) - 在 Docker 或云数据库(如阿里云 RDS)里,
slow_query_log可能被禁用或只能通过控制台开关,SET GLOBAL会报错
为什么 SET GLOBAL slow_query_log=ON 不生效
因为该变量是只读(read-only)的——MySQL 8.0+ 默认如此,尤其当它由配置文件加载时,运行时无法动态修改。强行执行会报错:ERROR 1238 (HY000): Variable 'slow_query_log' is a read only variable。
- 必须修改配置文件(
my.cnf或mysqld.cnf),在[mysqld]段落下添加slow_query_log = ON - 改完必须重启 MySQL:不重启,
systemctl restart mysql或service mysqld restart - 某些版本支持
SET PERSIST slow_query_log = ON(需有 SYSTEM_VARIABLES_ADMIN 权限),但依然依赖持久化机制是否启用
slow_query_log_file 路径写错的典型表现
日志“看起来开了”,但文件始终为空,或者 MySQL 启动失败、错误日志里反复出现 Can't open log file —— 大概率是路径问题。
- 路径必须由
mysqld进程用户(通常是mysql)可写,不能是 root 写权限的目录 - 避免使用相对路径,比如
slow_query_log_file = slow.log,它会落在 datadir 下,但位置难追踪;推荐绝对路径:/var/lib/mysql/slow.log - 如果路径父目录不存在(如
/var/log/mysql/目录没创建),MySQL 不会自动建目录,直接静默失败
long_query_time 设为 0 会怎样
它会让所有查询都进慢日志,包括毫秒级的 SELECT 1,极易撑爆磁盘,且完全失去“慢”的筛选意义。
- 生产环境慎用
long_query_time = 0;调试阶段临时开可以,但必须配log_queries_not_using_indexes = OFF防雪崩 - 注意单位是秒,支持小数:
long_query_time = 0.5表示记录 >500ms 的查询 - 该值可动态设(
SET GLOBAL long_query_time = 1),但对已连接线程不生效,新连接才继承
slow_query_log 是 ON、slow_query_log_file 路径存在且可写、long_query_time 设置合理——这三个点漏掉任何一个,日志就等于没开。











