mysql日志轮转需结合logrotate工具管理错误日志、通用日志和慢查询日志,通过配置daily轮转、保留7份备份并压缩,使用kill -USR1通知MySQL重载日志文件,而二进制日志由max_binlog_size和binlog_expire_logs_seconds等内部参数自动控制切换与清理,避免使用logrotate直接处理以保证一致性。

MySQL 本身不直接提供日志轮转(log rotation)功能,需要结合操作系统级别的工具(如 logrotate)来实现。常见的 MySQL 日志包括:错误日志(Error log)、通用查询日志(general log)、慢查询日志(slow query log)和二进制日志(binary log)。其中,错误日志、通用日志和慢查询日志可以通过 logrotate 进行管理,而二进制日志通常通过 MySQL 内部配置控制。
1. 配置 logrotate 管理 MySQL 日志文件
在 linux 系统中,logrotate 是最常用的日志轮转工具。你可以为 MySQL 创建一个专属的配置文件:
/etc/logrotate.d/mysql
添加以下内容(根据实际路径调整):
/var/log/mysql/error.log { daily missingok rotate 7 compress delaycompress notifempty create 640 mysql mysql postrotate test ! -f /var/run/mysqld/mysqld.pid || kill -USR1 `cat /var/run/mysqld/mysqld.pid` endscript }
说明:
- daily:每天轮转一次
- rotate 7:保留最近 7 个备份
- compress:轮转后压缩旧日志
- create 640 mysql mysql:创建新日志文件并设置权限和属主
- postrotate … endscript:执行命令通知 MySQL 重新打开日志文件。使用 kill -USR1 可让 MySQL 重新打开日志句柄(适用于错误日志)
注意:
如果启用了通用日志或慢查询日志,并且它们也写入文件,可以按相同方式添加到 logrotate 配置中,例如:
/var/log/mysql/general.log /var/log/mysql/slow.log { daily rotate 5 compress missingok notifempty create 640 mysql mysql postrotate test ! -f /var/run/mysqld/mysqld.pid || kill -USR1 `cat /var/run/mysqld/mysqld.pid` endscript }
2. MySQL 内部配置支持日志轮转
确保 MySQL 配置文件(通常是 /etc/mysql/my.cnf 或 /etc/my.cnf)中启用了相关日志并指定了文件路径:
[mysqld] # 错误日志 log_error = /var/log/mysql/error.log <h1>启用通用日志(可选)</h1><p>general_log = ON general_log_file = /var/log/mysql/general.log</p><h1>慢查询日志</h1><p>slow_query_log = ON slow_query_log_file = /var/log/mysql/slow.log long_query_time = 2</p><h1>二进制日志(自动按大小切换,不依赖 logrotate)</h1><p>log_bin = /var/log/mysql/mysql-bin.log max_binlog_size = 100M expire_logs_days = 7</p>
说明:
- log_bin 和 max_binlog_size 控制二进制日志的大小和自动切换
- expire_logs_days 已弃用,推荐使用 binlog_expire_logs_seconds(MySQL 8.0+)
- 二进制日志不要用 logrotate 直接处理,否则可能破坏一致性
3. 测试与验证
测试 logrotate 配置是否正确:
logrotate -d /etc/logrotate.d/mysql (dry-run 模式)
手动强制执行一次轮转:
logrotate /etc/logrotate.d/mysql
检查日志目录是否生成了 .1、.gz 文件,并确认新日志可写入。
查看 MySQL 是否正常继续写日志:
tail -f /var/log/mysql/error.log
基本上就这些。合理配置 logrotate + MySQL 内部参数,能有效防止日志文件无限增长。


