MySQL慢查询日志默认关闭,必须显式启用slow_query_log并配置long_query_time等参数;确认是否启用最可靠方式是执行SELECT @@global.slow_query_log,返回1表示已启用,0表示关闭。

MySQL慢查询日志默认是关闭的,必须显式启用并配置 slow_query_log、long_query_time 等参数才能生效;仅设置 slow_query_log_file 不会自动开启日志。
如何确认当前慢查询日志是否已启用
直接查全局变量最可靠,因为配置文件修改后可能未生效或被动态覆盖:
SELECT @@global.slow_query_log;
返回 1 表示已启用,0 表示关闭。同时检查路径和阈值:
SELECT @@global.slow_query_log_file, @@global.long_query_time;
-
@@global.slow_query_log_file默认可能是空字符串或指向/var/lib/mysql/hostname-slow.log,但路径不可写会导致日志静默失效 -
@@global.long_query_time默认是10.000000秒,对调试意义不大,建议调低到1或0.5 - 注意:该变量支持微秒级(如
0.1),但 MySQL 5.7+ 才真正精确到 100ms 级别;低于 0.1 可能被截断
启用 slow_query_log 的两种方式及优先级
运行时动态开启(立即生效,但重启丢失):
SET GLOBAL slow_query_log = ON;
永久生效需改配置文件(如 /etc/my.cnf 或 /etc/mysql/mysql.conf.d/mysqld.cnf),在 [mysqld] 段落下写:
slow_query_log = ON<br>slow_query_log_file = /var/log/mysql/mysql-slow.log<br>long_query_time = 1<br>log_queries_not_using_indexes = OFF
- 配置文件中
slow_query_log必须写成ON或1,写TRUE或空值无效 -
slow_query_log_file路径目录必须由mysql用户可写,否则启动时无报错但日志不生成 -
log_queries_not_using_indexes默认OFF,开启后会大量刷日志,建议仅临时排查索引缺失问题 - 动态 SET 的值优先级高于配置文件——如果配置文件写了
OFF但你 SET 成ON,那实际就是ON
常见失败现象和排查点
明明配置了却看不到慢查询记录?先盯住这几个地方:
- 执行
SELECT SLEEP(5);测试,但发现日志没更新 → 检查long_query_time是否被会话级变量覆盖:SELECT @@session.long_query_time;,它可能和全局不同 - 日志文件存在但大小始终为 0 → 查 MySQL 错误日志(
error.log),常见报错:Could not use /path/to/slow.log for logging (error 13),即权限问题 - 用
mysqld --verbose --help | grep "slow"确认编译时是否启用了慢日志支持(极少见,但 Percona Server 或某些精简版可能裁剪) - 从库默认继承主库配置,但
log_slow_slave_statements需单独开启(MySQL 5.6.11+),否则从库的慢查询不记录
最易忽略的一点:MySQL 8.0+ 默认使用 log_error_services 控制日志模块加载,如果该值里没包含 log_filter_internal 和 log_sink_internal,慢日志可能完全不写入文件——哪怕所有参数都设对了。


















