MySQL 8.0 如何开启慢查询日志 slow_query_log 配置步骤?

文章导读
MySQL 8.0 慢查询日志默认处于关闭状态,必须修改配置文件 my.cnf 或 my.ini 中的 slow_query_log 参数并重启 MySQL 服务才能永久生效。临时通过 SQL 命令开启会在服务重启后失效,且默认阈值 long_query_time 为 10 秒,需根据业务场景调整。
📋 目录
  1. 命令速用版
  2. 为什么会这样
  3. 分步处理
  4. 怎么验证是否生效
  5. 常见坑
  6. 常见问题
  7. 参考来源
A A

MySQL 8.0 慢查询日志默认处于关闭状态,必须修改配置文件 my.cnf 或 my.ini 中的 slow_query_log 参数并重启 MySQL 服务才能永久生效。临时通过 SQL 命令开启会在服务重启后失效,且默认阈值 long_query_time 为 10 秒,需根据业务场景调整。

先说结论:配置文件中启用并重启服务是唯一永久生效方式,临时命令仅用于调试。

  • 适合:生产环境性能排查、SQL 优化前期诊断。
  • 先准备:确认配置文件路径、日志目录写入权限。
  • 验收:执行 SELECT SLEEP(2) 后检查日志文件是否有记录。

命令速用版

检查当前状态使用 SQL 命令,永久配置需编辑配置文件。

查看变量状态:

SHOW VARIABLES LIKE 'slow_query_log';
SHOW VARIABLES LIKE 'long_query_time';

配置文件片段(/etc/my.cnf 或 /etc/mysql/my.cnf):

[mysqld]
slow_query_log = 1
slow_query_log_file = /var/log/mysql/mysql-slow.log
long_query_time = 1

重启服务命令:

MySQL 8.0 如何开启慢查询日志 slow_query_log 配置步骤?
systemctl restart mysqld

为什么会这样

MySQL 默认关闭慢查询日志是为了避免磁盘 I/O 开销影响数据库性能。默认 long_query_time 阈值为 10 秒,对于高并发业务而言过高,导致大部分慢查询未被记录。配置文件中 slow_query_log 参数支持动态设置,但 SET GLOBAL 命令修改的值仅在当前运行周期有效,服务重启后会恢复为配置文件中的值或默认值。

分步处理

第一步:确认配置文件路径。执行 mysqld `--help` `--verbose` | grep my.cnf 查看 MySQL 实际加载的配置文件顺序,通常位于 /etc/my.cnf 或 /etc/mysql/mysql.conf.d/mysqld.cnf。

第二步:编辑配置文件。在 [mysqld] 段落下添加或修改 slow_query_log = 1,确保参数值为 1 或 ON,写 TRUE 或空值可能无效。指定 slow_query_log_file 绝对路径,确保该目录存在且 mysql 用户有写权限。

第三步:设置阈值。修改 long_query_time 参数,单位秒,支持小数。生产环境建议设置为 1 或 0.5,避免日志文件膨胀过快。

第四步:重启服务。执行 systemctl restart mysqld 或 service mysql restart 使配置永久生效,仅 reload 无效。

怎么验证是否生效

重启后登录 MySQL 执行 SHOW VARIABLES LIKE 'slow_query_log';,返回值 ON 表示已启用。执行 SELECT SLEEP(2); 模拟慢查询,随后检查日志文件 tail -n 5 /var/log/mysql/mysql-slow.log。若看到包含 Query_time 和 SQL 语句的记录,说明配置生效。

MySQL 8.0 如何开启慢查询日志 slow_query_log 配置步骤?

常见坑

日志文件权限不足会导致日志静默失效,MySQL 启动时无报错但日志不生成,需检查错误日志 error.log 确认是否有 Can't open log file 报错。默认情况下 INSERT、UPDATE 等 DML 语句即使超时也不会写入慢日志,除非开启 log_slow_admin_statements。动态 SET GLOBAL 设置的值优先级高于配置文件,若之前动态开启过,需确认是否被覆盖。

常见问题

动态设置 slow_query_log 重启后还在吗

不在。SET GLOBAL 命令修改的参数仅在当前运行周期有效,服务重启后会丢失,必须写入配置文件。

为什么开启了慢日志却看不到 INSERT 记录

默认只记录 SELECT 查询语句。DML 语句(INSERT、UPDATE、DELETE)即使执行超时也不会写进慢日志,这是默认行为。

long_query_time 默认值是多少

默认值是 10.0 秒。对于调试意义不大,建议根据业务 SLA 调低到 1 秒或 0.5 秒。

参考来源

MySQL 配置相关技术文档及社区实践记录,包括如何配置 MySQL 8.0 的慢查询日志环境、如何开启 MySQL 慢查询日志功能_配置 slow_query_log 相关参数、mysql 如何配置慢查询日志_mysql 慢查询分析开启方法等技术资料。