MySQL 如何开启慢查询日志 slow_query_log 并设置长期记录

文章导读
开启 MySQL 慢查询日志并实现长期记录,必须修改配置文件 my.cnf 或 my.ini 将 slow_query_log 设为 ON,同时配合操作系统层面的日志轮转工具防止磁盘写满。
📋 目录
  1. A 命令速用版
  2. B 为什么会这样
  3. C 分步处理
  4. D 怎么验证是否生效
  5. E 常见坑
  6. F 常见问题
  7. G 参考来源
A A

开启 MySQL 慢查询日志并实现长期记录,必须修改配置文件 my.cnf 或 my.ini 将 slow_query_log 设为 ON,同时配合操作系统层面的日志轮转工具防止磁盘写满。

先说结论:仅通过 SQL 命令开启慢查询日志在重启后会失效,长期记录必须修改配置文件并管理日志文件大小。

  • 适合:生产环境性能排查、长期SQL 质量监控场景
  • 先准备:确认磁盘空间充足、备份现有配置文件
  • 验收:重启后检查变量状态、确认日志文件持续写入

命令速用版

临时开启慢查询日志可使用 SQL 命令,但永久生效需编辑配置文件。

# 临时开启(重启失效)
SET GLOBAL slow_query_log = 'ON';
SET GLOBAL long_query_time = 1;

# 配置文件 /etc/my.cnf 或 /etc/mysql/my.cnf 添加以下内容
[mysqld]
slow_query_log = 1
slow_query_log_file = /var/lib/mysql/slow.log
long_query_time = 1
log_queries_not_using_indexes = 1

为什么会这样

MySQL 慢查询日志记录执行时间超过 long_query_time 阈值的语句,配置文件的修改是持久化的唯一方式。

变量 slow_query_log 支持动态修改,但重启 MySQL 服务后会恢复为配置文件中的值或默认值。长期记录意味着日志文件会持续增长,MySQL 自身不具备自动轮转(rotate)和删除旧日志的功能,需依赖外部机制管理文件大小。

分步处理

第一步是定位配置文件路径,不同操作系统和安装方式路径不同。

1. 查找配置文件位置:执行命令 mysql `--help` | grep my.cnf 或查看进程启动参数。

2. 编辑配置文件:使用 vim 或 nano 打开 my.cnf,在 [mysqld] 段落下添加慢查询相关参数。

MySQL 如何开启慢查询日志 slow_query_log 并设置长期记录

3. 设置日志路径:确保 slow_query_log_file 指定的目录存在且 mysql 用户有写入权限。

4. 重启服务:执行 systemctl restart mysqldservice mysql restart 使配置生效。

5. 配置日志轮转:在 Linux 系统配置 /etc/logrotate.d/mysql 以防止日志占满磁盘。

怎么验证是否生效

验证分为变量状态检查和日志文件写入检查两部分。

1. 登录 MySQL 执行 SHOW VARIABLES LIKE 'slow_query_log';,确认 Value 为 ON。

2. 执行 SHOW VARIABLES LIKE 'slow_query_log_file'; 确认日志文件路径。

3. 执行一条故意慢的查询(如 sleep(2)),然后检查日志文件是否有新内容追加。

MySQL 如何开启慢查询日志 slow_query_log 并设置长期记录

4. 检查磁盘空间:df -h 确认日志分区未满载。

常见坑

高并发下开启慢查询日志可能增加磁盘 I/O 负担,且日志文件无限增长会导致磁盘空间耗尽。

1. 磁盘空间:未配置 logrotate 时,slow.log 可能增长至数十 GB,导致服务器无法写入。

2. 权限问题:日志文件路径若属于 root 用户,MySQL 进程无法写入,需 chown 给 mysql 用户。

3. 性能影响:记录所有慢查询会消耗额外 I/O,高负载时期建议调大 long_query_time 阈值。

4. 云数据库限制:部分云厂商托管的 MySQL 实例不允许直接修改配置文件,需在控制台操作。

常见问题

慢查询日志会影响数据库性能吗?

会有轻微影响,主要是额外的磁盘写入开销。

MySQL 如何开启慢查询日志 slow_query_log 并设置长期记录

公开资料中没有看到可靠的量化数据表明具体百分比,但在高并发写入场景下建议评估 I/O 负载。

如何自动清理旧的慢查询日志?

MySQL 不自带清理功能,需使用 Linux 的 logrotate 工具配置定期切割和删除。

配置保留天数或文件大小限制,避免手动删除正在写入的日志文件。

long_query_time 设置多少合适?

取决于业务容忍度,通常生产环境建议设置为 1 秒或 2 秒。

开发环境可设置为 0 记录所有查询,但生产环境不建议设置为 0。

参考来源

MySQL 8.0 Reference Manual - The Slow Query Log

URL: https://dev.mysql.com/doc/refman/8.0/en/slow-query-log.html