slow_query_log 必须显式设为 ON 才生效,仅配置文件设置或路径权限正确但变量为 OFF 仍无效;需用 SHOW VARIABLES 确认变量值、检查路径权限、测试写入,并区分动态设置(重启失效)与永久配置(需重启)。

slow_query_log 必须显式开启,否则日志永远不会写入——哪怕配置文件写了、路径也存在、权限也给了,只要变量仍是 OFF,就等于没开。
确认当前是否真正启用
很多问题卡在「以为开了,其实没生效」。最直接的办法是查变量:
-
SHOW VARIABLES LIKE 'slow_query_log';—— 必须返回ON,不是1或空值 -
SHOW VARIABLES LIKE 'slow_query_log_file';—— 看路径是否存在,MySQL 进程(通常是mysql用户)是否有写权限 -
SHOW VARIABLES LIKE 'long_query_time';—— 注意它是浮点数,SET GLOBAL long_query_time = 1;和= 1.0等效,但设为0会记录所有查询,不推荐
常见错误:配置文件写了 slow_query_log = 1,但忘记重启 MySQL;或执行了 SET GLOBAL 却没验证变量是否真变;或路径目录没创建、权限没给,导致日志文件创建失败(MySQL 不报错,只静默丢弃)。
动态设置路径与阈值(重启失效)
适合调试或临时开启,无需重启服务,但 MySQL 重启后还原:
-
SET GLOBAL slow_query_log = 'ON';—— 必须用字符串'ON',部分版本不认数字1 -
SET GLOBAL slow_query_log_file = '/var/log/mysql/slow.log';—— 路径需提前mkdir -p /var/log/mysql,并chown mysql:mysql /var/log/mysql -
SET GLOBAL long_query_time = 2;—— 对**新建立的连接**生效;已有连接仍用旧值 -
SET GLOBAL log_queries_not_using_indexes = 'ON';—— 调试阶段建议打开,能暴露缺失索引的隐患
执行完立刻用 SELECT SLEEP(3); 测试,再 tail -f /var/log/mysql/slow.log 看是否落盘。
永久生效:改配置文件 + 重启
Linux 常见配置文件路径:/etc/my.cnf、/etc/mysql/my.cnf 或 /usr/local/mysql/etc/my.cnf;Windows 是安装目录下的 my.ini。在 [mysqld] 段下添加:
[mysqld] slow_query_log = 1 slow_query_log_file = /var/log/mysql/slow.log long_query_time = 1 log_queries_not_using_indexes = 1 log_output = FILE
注意:
-
slow_query_log = 1和= ON效果一致,但某些旧版本只认1 -
log_output默认就是FILE,设成TABLE会写入mysql.slow_log表,但表需手动创建且性能开销略高,生产环境慎用 - 改完必须重启:Ubuntu/Debian 用
sudo systemctl restart mysql,CentOS/RHEL 用sudo systemctl restart mysqld
路径权限和日志轮转容易被忽略
路径写对了 ≠ 能写进去。MySQL 进程以 mysql 用户运行,所以:
- 确保父目录存在:
mkdir -p /var/log/mysql - 赋权:
chown mysql:mysql /var/log/mysql,chmod 755 /var/log/mysql - 日志文件本身不能预先 touch 创建——MySQL 启动时会自动创建,若手动创建且属主不对,会导致写失败
- 长期运行必须配
logrotate,否则单个日志可能达 GB 级;不要依赖 MySQL 自带的轮转(它不压缩、不归档)
最麻烦的不是设参数,而是路径不可写、权限不对、目录不存在——这些错误 MySQL 几乎不报错,只沉默丢弃日志。


















