确认 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 文本和执行时间——这意味着敏感信息可能明文落盘,生产环境要注意日志访问控制。
