mysql 8.0.28+ 必须使用 binlog_expire_logs_seconds(如604800秒)配置binlog过期时间,expire_logs_days已弃用;该参数为persist-only变量,需用set persist或写入my.cnf生效,且清理依赖flush logs、主从连接或重启等事件触发,非定时任务。

binlog_expire_logs_seconds 是 MySQL 8.0.28+ 的正确配置项
MySQL 8.0.28 之前用 expire_logs_days,之后官方已标记为 deprecated,新版本必须用 binlog_expire_logs_seconds。设成 0 表示永不过期(不推荐),设成 2592000 即保留 30 天(30 × 24 × 3600)。
常见错误是直接改 my.cnf 后重启,但没确认变量是否生效——因为该参数是动态的,可在线设置,且优先级高于配置文件中的旧参数。
- 在线设置(立即生效,重启后仍需写入配置文件才持久):
SET PERSIST binlog_expire_logs_seconds = 2592000;
- 写入配置文件(
/etc/my.cnf或/etc/mysql/mysql.conf.d/mysqld.cnf):[mysqld]<br>binlog_expire_logs_seconds = 2592000
- 检查是否生效:
SELECT @@binlog_expire_logs_seconds;
或SHOW VARIABLES LIKE 'binlog_expire_logs_seconds';
为什么 SET GLOBAL 不起作用?
SET GLOBAL binlog_expire_logs_seconds = ... 会报错:ERROR 1238 (HY000): Variable 'binlog_expire_logs_seconds' is a read only variable。这是因为它属于「persist-only」变量,只能用 SET PERSIST 或写配置文件方式修改。
旧版用 SET GLOBAL expire_logs_days = 7 是可行的,但 8.0.28+ 已禁用该写法;若配置文件中同时存在两个参数,binlog_expire_logs_seconds 会覆盖 expire_logs_days。
- 执行
SET PERSIST后,MySQL 会把值写入mysqld-auto.cnf(默认在数据目录下),重启自动加载 - 如果手动删了
mysqld-auto.cnf,或启用了--skip-grant-tables,PERSIST设置会失效 - 权限要求:需要
SYSTEM_VARIABLES_ADMIN+PERSIST_RO_VARIABLES_ADMIN权限
binlog 清理不是定时任务,而是由 Binlog Dump 线程或 FLUSH LOGS 触发
MySQL 不会每小时扫描一次过期 binlog 并删除。实际清理时机是:
- 每次执行
FLUSH BINARY LOGS时检查并清理 - 从库 IO 线程连接主库、发起 Binlog Dump 请求时,主库会顺带做一次清理
- MySQL 启动时也会检查并清理过期文件
这意味着即使设置了 30 天,如果实例长期没做日志轮转、也没从库连上来,过期 binlog 也不会立刻消失。可手动触发清理:
FLUSH BINARY LOGS;或
RESET MASTER;(慎用,会清空所有 binlog)。
磁盘空间告警却看不到大 binlog?可能被 purge 忽略了
有时 SHOW BINARY LOGS; 显示最老的 binlog 还是 10 天前的,但磁盘占满——这是因为 binlog_expire_logs_seconds 只控制「未被任何复制线程需要」的日志。如果从库延迟严重、或某个 GTID_EXECUTED 范围还依赖旧 binlog,MySQL 就不会删它。
排查方法:
- 查所有复制通道的
Retrieved_Gtid_Set和Executed_Gtid_Set:SELECT CHANNEL_NAME, RETRIEVED_GTID_SET, EXECUTED_GTID_SET FROM performance_schema.replication_connection_status;
- 对比
SELECT @@gtid_purged;,如果最老 binlog 的 filename 在gtid_purged对应范围内,则不能删 - 临时加快清理:先 stop slave,再
RESET SLAVE ALL(仅当确认不需要该从库数据时)
真正决定 binlog 是否能删的,不是时间,而是 GTID 或 file-position 是否还在被下游引用。时间只是兜底策略。











