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
重启服务命令:
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 启动时无报错但日志不生成,需检查错误日志 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 慢查询分析开启方法等技术资料。