MySQL慢查询日志启用需注意:slow_query_log(变量)与slow-query-log(配置项)拼写差异;必须同时设置slow_query_log=ON和绝对路径的slow_query_log_file;long_query_time在5.7.21+才支持毫秒精度。

慢查询日志开关和配置项名容易写错
MySQL 5.7+ 默认关闭慢查询日志,slow_query_log 是控制开关的系统变量,不是配置文件里的 slow-query-log(带连字符的是 my.cnf 里用的)。很多人在命令行执行 SET GLOBAL slow_query_log = ON 后发现没生效,其实是忘了同时配 slow_query_log_file —— 没指定文件路径,MySQL 会静默失败,日志根本不会写。
-
slow_query_log是布尔值,设为ON或1才启用 -
slow_query_log_file必须是 MySQL 进程有写权限的绝对路径,比如/var/lib/mysql/slow.log - 如果只改了
long_query_time却没开slow_query_log,日志完全不会产生 - 动态设置(
SET GLOBAL)只对新连接生效,已存在的连接不感知
long_query_time 的单位和精度陷阱
long_query_time 单位是秒,但支持小数,比如 0.5 表示 500ms。注意:MySQL 5.7.21+ 才支持毫秒级精度;旧版本即使设成 0.1,实际仍按秒向下取整(即变成 0 秒),导致所有查询都被记录——磁盘瞬间打满。
- 生产环境慎设低于
1.0,除非明确排查瞬时抖动 - 该值对事务内每个语句单独判断,不是整个事务耗时
- 若开启
log_queries_not_using_indexes,哪怕long_query_time很大,全表扫描也会被记入慢日志 - 时间判断基于语句执行完成时刻,不含网络传输或客户端解析耗时
my.cnf 里配置和运行时 SET 的优先级关系
配置文件(my.cnf)里的设置是启动时加载的“基线”,SET GLOBAL 修改的是运行时值。但有个关键例外:slow_query_log_file 一旦在配置文件里写死,运行时用 SET GLOBAL 修改会失败并报错 Variable 'slow_query_log_file' is a read-only variable。
- 推荐在
my.cnf中固定写入slow_query_log = ON和slow_query_log_file路径 -
long_query_time可以放心用SET GLOBAL动态调,适合临时压测或问题定位 - 修改后务必检查:执行
SELECT @@slow_query_log, @@long_query_time, @@slow_query_log_file - 重启 MySQL 会丢掉所有
SET GLOBAL的变更,仅保留配置文件内容
日志文件权限和轮转问题
MySQL 进程用户(通常是 mysql)必须对 slow_query_log_file 所在目录有写权限,且不能把日志直接写到 /tmp(某些系统会定期清空)或 NFS 挂载点(可能触发锁等待或写失败)。
- 日志不会自动轮转,得靠外部工具(如
logrotate)配合FLUSH LOGS命令 - 手动轮转前先执行
FLUSH SLOW LOGS(MySQL 8.0.23+)或FLUSH LOGS(通用),否则新日志仍写原文件 - 日志体积增长快,建议搭配
log_output = FILE(默认),避免写入表带来性能干扰 - 别用
tail -f实时看日志——MySQL 写入是缓冲的,可能延迟几秒才刷盘
slow_query_log_file 在配置文件里写死后不可动态改,这点最容易在调试中途突然失效。










