mysql 8.0 binlog 默认保留30天但实际可能因未配置binlog_expire_logs_seconds而禁用自动清理;需确认log_bin=on、binlog_expire_logs_seconds>0且binlog_expire_logs_auto_purge=on,优先使用秒级参数设置并验证清理效果。

MySQL 8.0 的 binlog 默认保留 30 天(2592000 秒),但若未显式配置 binlog_expire_logs_seconds,实际可能为 0 或未生效——磁盘爆满不是意外,是默认行为。
确认 binlog 是否启用且过期策略是否有效
先连上 MySQL,执行两组检查命令,避免“以为设了,其实没起作用”:
-
SHOW VARIABLES LIKE 'log_bin';—— 必须返回ON,否则后续所有策略都无效 -
SHOW VARIABLES LIKE 'binlog_expire_logs_seconds';—— 若值为0或空,表示禁用自动清理;3600是默认值(1 小时),远不够用 -
SHOW VARIABLES LIKE 'binlog_expire_logs_auto_purge';—— 必须为ON,否则即使binlog_expire_logs_seconds设对了,也不会触发清理
注意:expire_logs_days 在 8.0.23+ 已被弃用。如果它和 binlog_expire_logs_seconds 同时存在,MySQL 会报错 ERROR 3683 (HY000),直接拒绝启动或重载配置。
设置 binlog_expire_logs_seconds(8.0.23+ 唯一推荐方式)
必须用秒级参数,不能靠 expire_logs_days 蒙混过关。7 天 = 604800 秒,30 天 = 2592000 秒:
- 动态设置(立即生效,重启丢失):
SET GLOBAL binlog_expire_logs_seconds = 604800; - 持久化设置(推荐):编辑
/etc/my.cnf的[mysqld]段,添加:binlog_expire_logs_seconds = 604800
然后重启,或执行SET PERSIST binlog_expire_logs_seconds = 604800;(需有PERSIST权限)
该参数只控制“过期时间”,不控制文件大小。清理动作由后台线程每天凌晨触发,不是实时的。主从延迟严重时,正在被从库读取的 binlog 不会被删——所以得先确保 Seconds_Behind_Master 接近 0。
MySQL 9.6.0是面向Linux平台的2026年创新版本,核心架构迎来重大革新。其将外键约束与级联操作从InnoDB引擎层上移至SQL层,确保所有数据变更均被完整记录至Binlog,彻底解决了CDC(变更数据捕获)与主从复制中的数据不一致难题。此外,该版本引入container_aware启动选项以原生适配容器环境,并对审计日志进行了组件化重构,为追求极致数据一致性与云原生体验的开发者提供了全新选择。
配合 max_binlog_size 控制单文件体积
max_binlog_size 不解决总量问题,但影响运维体验和备份效率:
- 默认值是
1073741824(1GB),大事务可能突破该限制(因为事务不能跨文件) - 建议设为
536870912(512MB)或268435456(256MB),便于传输、压缩和快速定位问题 - 配置方式同上:
SET GLOBAL max_binlog_size = 536870912;或写入my.cnf
注意:它和过期策略完全正交。哪怕把 max_binlog_size 设成 1MB,若 binlog_expire_logs_seconds 是 0,照样攒满磁盘。
验证与手动触发清理(别等凌晨)
设完别信,要验证:
- 执行
SHOW BINARY LOGS;查看当前 binlog 列表及其创建时间 - 执行
FLUSH LOGS;强制轮转一次,生成新文件,让清理逻辑更快进入状态 - 等待约 1 分钟后再次
SHOW BINARY LOGS;,观察旧文件是否减少(前提是已过期且无复制依赖) - 如需立刻清空指定时间前的日志:
PURGE BINARY LOGS BEFORE '2026-06-08 00:00:00';
真正容易被忽略的是:清理不是按“文件数”或“磁盘占用”触发的,只认时间戳 + binlog_expire_logs_auto_purge = ON + 无活跃复制依赖。三者缺一,日志就卡在那里不动。










