MySQL慢查询日志是排查数据库性能瓶颈的核心工具,默认情况下日志会持续写入同一个文件,长期运行后文件体积会不断膨胀,既占用磁盘空间,也会增加日志分析的成本。要控制慢查询日志的文件大小并实现滚动策略,可以从MySQL自身配置和系统层面工具两个维度入手。

一、MySQL内置的慢查询日志大小控制
MySQL本身提供了部分日志相关的配置参数,可以初步限制日志的增长,但无法实现自动滚动,仅能控制单个日志文件的最大大小。
1. 核心配置参数
MySQL的max_binlog_size是针对二进制日志的大小限制,慢查询日志没有直接的单文件大小限制参数,不过可以通过log_error相关的配置结合日志输出方式调整,更常用的方式是配合flush logs命令手动刷新日志。
首先确认慢查询日志的开启状态和存储路径,执行以下SQL查看配置:
-- 查看慢查询日志是否开启 SHOW VARIABLES LIKE 'slow_query_log'; -- 查看慢查询日志存储路径 SHOW VARIABLES LIKE 'slow_query_log_file'; -- 查看慢查询阈值,单位秒 SHOW VARIABLES LIKE 'long_query_time';
2. 手动刷新日志实现简易滚动
执行FLUSH SLOW LOGS命令可以关闭当前的慢查询日志文件并重新打开,相当于手动触发一次日志滚动,之前的日志文件会被保留,新日志写入新的文件。可以结合定时任务定期执行该命令,但这种方式需要自行处理历史日志的清理,不够自动化。
-- 手动刷新慢查询日志,生成新的日志文件 FLUSH SLOW LOGS;
二、使用logrotate实现自动化日志滚动
logrotate是Linux系统自带的日志管理工具,支持按时间、文件大小等维度自动切割、压缩、删除历史日志,是管理MySQL慢查询日志的最佳方案,无需修改MySQL自身配置,适配所有MySQL版本。
1. 创建logrotate配置文件
在/etc/logrotate.d/目录下新建一个名为mysql-slow的配置文件,内容如下,需要根据实际的慢查询日志路径调整路径参数:
# MySQL慢查询日志路径,替换为实际路径
/var/lib/mysql/slow.log {
# 每天滚动一次
daily
# 日志文件大小超过100M时触发滚动,和daily取或关系
size 100M
# 保留最近7天的日志
rotate 7
# 滚动后创建新的日志文件,权限640,属主mysql,属组mysql
create 640 mysql mysql
# 对旧日志进行gzip压缩
compress
# 延迟压缩,本次滚动不压缩,下次滚动时再压缩上次的日志
delaycompress
# 滚动前将MySQL慢查询日志刷新,避免日志写入旧文件
prerotate
# 通过mysqladmin刷新慢查询日志,需要替换为实际的mysqladmin路径和账号密码
/usr/bin/mysqladmin -uroot -p'your_password' flush-slow-logs
endscript
# 滚动后重启MySQL或者再次刷新日志,确保新日志写入新文件
postrotate
# 部分版本MySQL刷新后需要重启生效,也可以再次执行flush命令
/usr/bin/mysqladmin -uroot -p'your_password' flush-slow-logs
endscript
# 如果日志文件不存在,不报错
missingok
# 不转储空文件
notifempty
}
2. 配置参数说明
上述配置中的核心参数含义如下:
- daily:按天执行滚动检查,结合size参数,满足任一条件就会触发滚动。
- size 100M:当日志文件大小超过100M时触发滚动,可根据实际磁盘情况调整。
- rotate 7:保留最近7个滚动后的日志文件,超过数量的旧日志会被自动删除。
- compress:对滚动后的旧日志进行gzip压缩,节省磁盘空间。
- create:滚动后创建新的日志文件,指定权限和属主,避免MySQL没有写入权限。
3. 测试配置是否生效
执行以下命令测试logrotate配置是否正确,不会实际执行滚动操作:
# 测试配置文件语法 logrotate -d /etc/logrotate.d/mysql-slow
如果没有报错,再执行强制滚动命令验证效果:
# 强制触发一次日志滚动 logrotate -f /etc/logrotate.d/mysql-slow
执行后查看慢查询日志所在目录,会出现类似slow.log.1、slow.log.2.gz的文件,说明滚动策略已经生效。
三、两种方案对比
以下是两种慢查询日志管理方案的对比,可根据实际需求选择:
| 方案 | 优势 | 不足 | 适用场景 |
|---|---|---|---|
| MySQL内置FLUSH命令 | 无需额外配置,原生支持 | 需手动或写脚本定时执行,无自动清理、压缩能力 | 临时测试、日志量极小的场景 |
| logrotate工具 | 全自动滚动、压缩、清理,配置灵活,系统原生支持 | 需要配置logrotate文件,依赖系统环境 | 生产环境、日志量大的场景 |
四、注意事项
在配置慢查询日志滚动时,需要注意以下几点:
- 刷新日志的账号需要有
RELOAD权限,否则无法执行flush-slow-logs命令。 - 新创建的日志文件权限和属主必须和MySQL运行用户一致,否则会出现日志无法写入的问题。
- 如果MySQL是容器化部署,需要将慢查询日志目录挂载到宿主机,再在宿主机配置logrotate规则。
- 不要将日志保留时间设置过长,避免占用过多磁盘空间,一般保留3-7天即可满足排查需求。