MySQL错误日志需靠logrotate配合mysqladmin flush-logs实现安全轮转:先确认log_error路径及权限,配置中必须用postrotate调用mysqladmin flush-logs,禁用copytruncate和kill -USR1,设置rotate 7、compress、create 640 mysql adm,并通过logrotate -d和-f测试验证。

MySQL错误日志不会自动轮转,必须靠 logrotate 配合 mysqladmin flush-logs 才能安全切文件、释放磁盘空间。
确认错误日志路径和权限
先查清楚 MySQL 正在写哪个文件,别配错路径白忙活:
- 运行
mysql -e "SHOW VARIABLES LIKE 'log_error';",输出类似/var/log/mysql/error.log - 检查该路径归属:用
ls -l /var/log/mysql/error.log确认属主是mysql:mysql,否则logrotate创建新文件时可能权限不对 - 确保
/var/log/mysql/目录可写,且mysql用户能创建文件(常见坑:目录属主是root:adm但没给组写权限)
logrotate 配置必须带 postrotate 调用 mysqladmin
只移动或压缩文件,MySQL 还会继续往旧文件描述符里写——空间不释放,归档也失效。关键动作是通知 mysqld 换新文件:
-
postrotate块里必须执行mysqladmin -u flush-logs@localhost -p'xxx' flush-logs(推荐用专用账号,仅授RELOAD权限) - 不能用
copytruncate:5.7+ 版本对截断后句柄处理不稳定,容易丢日志 - 别用
kill -USR1:不同 MySQL 版本信号支持不一致,mysqladmin flush-logs兼容性更好 - 路径要跟
log_error完全一致,包括结尾是否带 .log,否则flush-logs不生效
设置保留策略防 inode 和磁盘双爆
光轮转不够,还得控制存多久、存几个:
-
daily或weekly触发频率,别用size—— MySQL 错误日志写入不规律,按大小切容易漏切或频繁切 -
rotate 7:最多保留 7 个归档,防止 inode 耗尽(尤其小文件多的场景) -
compress:加这一行,不然压缩得手动写脚本 -
create 640 mysql adm:新建日志权限设对,否则 MySQL 写不进去
测试配置并验证是否真生效
配完不测等于没配,重点看两件事:
- 用
sudo logrotate -d /etc/logrotate.d/mysql检查语法和模拟流程,确认没报error或skipping - 手动触发一次:
sudo logrotate -f /etc/logrotate.d/mysql,然后立刻查:ls -lt /var/log/mysql/error*—— 应看到error.log变成空文件,新增error.log.1 - 再等几秒,
tail -f /var/log/mysql/error.log看是否有新日志进来;同时lsof -p $(pgrep mysqld) | grep error确认 mysqld 打开的是新文件
最容易被忽略的是:MySQL 自身不管理错误日志生命周期,所有清理逻辑都在 logrotate 配置里,而且 postrotate 失败会导致后续轮转全部卡住——所以那个 mysqladmin 命令的账号密码、网络(如果是远程)、权限,一个都不能错。


















