mysql 默认关闭慢查询日志,需通过配置文件或动态命令启用;检查状态用 select @@slow_query_log,设置 slow_query_log=on、指定可写 slow_query_log_file 路径及 long_query_time 阈值,重启或 set global 生效,最后用 select sleep(3) 验证日志写入。

确认 MySQL 是否已启用慢查询日志功能
MySQL 默认通常关闭慢查询日志,需手动开启。先登录 MySQL 执行:
SELECT @@slow_query_log;
返回 OFF 表示未启用。同时检查当前日志路径:
SELECT @@slow_query_log_file;
若为空或指向不可写路径(如 /var/lib/mysql/localhost-slow.log 但目录无写权限),后续会记录失败。
修改 my.cnf 配置并重启服务
在 my.cnf 的 [mysqld] 段落添加或修改以下参数:
-
slow_query_log = ON:必须显式设为ON(部分旧版本只认1,建议用字符串) -
slow_query_log_file = /var/log/mysql/mysql-slow.log:指定绝对路径,确保 MySQL 进程用户(如mysql)对该路径有写权限 -
long_query_time = 2.0:单位秒,设为0可记录所有查询(仅调试用,生产慎用) -
log_queries_not_using_indexes = OFF:默认不开启,开启后会额外记录未走索引的查询,可能显著增加日志量
配置完成后,重启服务:
sudo systemctl restart mysql
或
sudo service mysqld restart
。重启失败常见原因是 slow_query_log_file 路径父目录不存在或权限不足。
运行时动态开启(无需重启)
若无法重启 MySQL,可用 SQL 命令临时启用(但重启后失效):
SET GLOBAL slow_query_log = 'ON';<br>SET GLOBAL long_query_time = 2.0;<br>SET GLOBAL slow_query_log_file = '/tmp/mysql-slow.log';
注意:SET GLOBAL 不影响已存在的连接,新连接才会生效;且 slow_query_log_file 在某些版本(如 MySQL 5.7)中设为只读变量,此时只能靠配置文件方式修改。
验证日志是否正常写入
执行一条明显超时的查询触发日志,例如:
SELECT SLEEP(3);
然后检查日志文件是否新增内容:
tail -n 10 /var/log/mysql/mysql-slow.log
。若无输出,常见原因包括:
- MySQL 用户对日志路径无写权限(用
ls -ld /var/log/mysql检查) -
long_query_time值设得过大,实际查询未超过阈值 - 查询被缓存命中(如
query_cache_type=ON),不进入慢日志流程 - 使用了
SELECT SQL_NO_CACHE ...但未真正执行慢操作
慢查询日志本身不记录事务上下文、参数化值或错误堆栈,只记录原始 SQL 文本和执行时间——这意味着敏感信息可能明文落盘,生产环境要注意日志访问控制。