直接执行show variables like 'slow_query_log%'确认状态:slow_query_log为on才启用,同时需检查slow_query_log_file路径权限和long_query_time阈值(默认10秒),动态设置set global slow_query_log=on仅临时生效,重启后失效。

如何确认当前MySQL是否已启用慢查询日志
直接查系统变量比翻配置文件更快:SHOW VARIABLES LIKE 'slow_query_log%';。重点关注 slow_query_log(ON/OFF)、slow_query_log_file(日志路径)、long_query_time(阈值,单位秒,默认10)。如果 slow_query_log 是 OFF,说明没开;哪怕配置文件写了,也可能被运行时命令覆盖。
动态开启慢查询日志(无需重启)
只要用户有 SUPER 权限(如 root),就能在线启用:
SET GLOBAL slow_query_log = ON;
但注意:这个设置在 MySQL 重启后会丢失。常见误操作是只执行这句就以为万事大吉,结果服务一重启日志又停了。必须同步写入配置文件才持久化。
-
SET GLOBAL long_query_time = 2;可临时调低阈值(注意:对已连接会话不生效,新连接才用新值) -
SET GLOBAL log_output = 'FILE';或'TABLE',决定日志写到文件还是mysql.slow_log表(后者需引擎支持,且默认关闭) - 若设为
'TABLE',记得FLUSH LOGS;才能立即看到新记录
配置文件中正确设置(my.cnf / my.ini)
在 [mysqld] 段落下添加或修改这几行,顺序无关,但必须都在同一节:
slow_query_log = ON<br>slow_query_log_file = /var/log/mysql/mysql-slow.log<br>long_query_time = 1.5<br>log_output = FILE
关键点:
- 路径
/var/log/mysql/mysql-slow.log必须由 MySQL 进程用户(如mysql)有写权限,否则启动失败或日志静默丢弃 -
long_query_time支持小数(如1.5),但低于 1 秒时要注意精度:MySQL 5.6+ 使用微秒级计时,旧版本可能截断为整秒 - 不要写
log-slow-queries(已废弃,5.6+ 不识别)
验证日志是否真在记录 & 常见失效原因
执行一条故意慢的语句测试:SELECT SLEEP(3);,然后检查日志文件末尾是否有对应条目。若没记录,优先排查:
- MySQL 用户对
slow_query_log_file路径无写权限(ls -l看属主,chown mysql:mysql /var/log/mysql) -
log_output被设成NONE(查变量确认) - 客户端连接时加了
--skip-extended-insert类参数?不影响慢日志,但容易干扰判断 - 查询被缓存命中(
query_cache_type=ON且命中),则不计入慢日志——这是设计行为,不是 bug
日志内容里不会显示参数化后的值(如 WHERE id = ?),而是原始 SQL 字符串,这点在分析 ORM 生成语句时要心里有数。











