mysql审计日志轮转由audit_log_rotate和audit_log_max_size共同控制,按大小而非时间触发;audit_log_expire_logs_days控制历史文件留存天数,audit_log_rotations限制数量,需配合外部logrotate确保可靠清理。

audit_log_rotate 和 audit_log_max_size 控制单文件大小
MySQL 审计日志不会自动按时间切分,而是靠文件大小触发轮转。关键参数是 audit_log_rotate(是否启用轮转)和 audit_log_max_size(单个日志文件最大字节数)。这两个参数必须同时配置才有效。
-
audit_log_rotate = 1:启用轮转,设为 0 则不轮转,日志会一直追加到同一个文件 -
audit_log_max_size = 104857600(即 100MB):推荐设为 50–200MB 之间;太小会导致频繁新建文件、inode 消耗快;太大则单个文件难处理 - 轮转后旧文件名形如
audit.log.1、audit.log.2,默认最多保留audit_log_rotations个(默认 0,即不限数量)
audit_log_expire_logs_days 是唯一真正控制留存天数的参数
别被 audit_log_expire(单位秒)或 audit_log_expiration(旧版/第三方插件用)误导——官方 MySQL 8.0+ 内置审计插件只认 audit_log_expire_logs_days。它直接决定过期清理逻辑是否启动。
- 在
my.cnf的[mysqld]段中设置:audit_log_expire_logs_days = 30 - 值为 0 表示永不自动删除;设为正整数(如 30)后,MySQL 启动时或每小时检查一次,删除超过该天数的
.log.N文件 - 注意:该参数只作用于轮转产生的历史文件(
audit.log.1等),不清理当前正在写的audit.log
audit_log_rotations 限制历史文件数量,防 inode 耗尽
即使设置了 audit_log_expire_logs_days,若轮转频繁且磁盘 I/O 延迟高,仍可能出现大量 .log.N 文件堆积。这时 audit_log_rotations 是兜底手段。
-
audit_log_rotations = 10:表示最多保留 10 个历史轮转文件(含.log.1到.log.10) - 当达到上限,新轮转会覆盖最老的(如生成
.log.11时自动删掉.log.1) - 该参数与
audit_log_expire_logs_days是“与”关系:两个条件都满足才会删文件;任一不满足就跳过
必须配合外部 logrotate,否则 cleanup 不可靠
MySQL 自身的清理逻辑有缺陷:它只在 mysqld 启动或周期性检查时触发,且不保证原子性。如果 mysqld 长时间不重启,或某次清理失败,过期文件可能残留。
- 强烈建议在 Linux 上用
logrotate双保险,例如: - 配置
/etc/logrotate.d/mysql-audit:
/var/lib/mysql/audit.log {
daily
rotate 30
compress
missingok
notifempty
create 640 mysql mysql
sharedscripts
postrotate
systemctl reload mysql 2>/dev/null || true
endscript
}
这样既按天轮转又保留 30 天压缩归档,比纯依赖 MySQL 内置机制更稳。
真正容易被忽略的是:MySQL 审计日志的清理不走 SQL 接口,也不响应 FLUSH LOGS;所有参数修改后必须重启 mysqld 或执行 SET PERSIST(8.0.21+)才生效,且 audit_log_expire_logs_days 在运行时修改不会立即触发清理——得等下一次内部检查周期(约 1 小时后)。











