开启 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] 段落下添加慢查询相关参数。
3. 设置日志路径:确保 slow_query_log_file 指定的目录存在且 mysql 用户有写入权限。
4. 重启服务:执行 systemctl restart mysqld 或 service 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)),然后检查日志文件是否有新内容追加。
4. 检查磁盘空间:df -h 确认日志分区未满载。
常见坑
高并发下开启慢查询日志可能增加磁盘 I/O 负担,且日志文件无限增长会导致磁盘空间耗尽。
1. 磁盘空间:未配置 logrotate 时,slow.log 可能增长至数十 GB,导致服务器无法写入。
2. 权限问题:日志文件路径若属于 root 用户,MySQL 进程无法写入,需 chown 给 mysql 用户。
3. 性能影响:记录所有慢查询会消耗额外 I/O,高负载时期建议调大 long_query_time 阈值。
4. 云数据库限制:部分云厂商托管的 MySQL 实例不允许直接修改配置文件,需在控制台操作。
常见问题
慢查询日志会影响数据库性能吗?
会有轻微影响,主要是额外的磁盘写入开销。
公开资料中没有看到可靠的量化数据表明具体百分比,但在高并发写入场景下建议评估 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