自动清理 binlog 的核心配置项是 MySQL 8.0+ 推荐用 binlog_expire_logs_seconds,5.7 及更早版本用 expire_logs_days,二者控制过期时间但非定时任务,而是 mysqld 主动扫描清理,默认值为 0(永不过期),需显式设置并写入配置文件方可永久生效。

自动清理 binlog 的核心配置项是什么
MySQL 8.0+ 推荐用 binlog_expire_logs_seconds,5.7 及更早版本用 expire_logs_days。这两个参数控制 binlog 自动过期时间,**不是“定时任务”,而是 mysqld 在启动、日志轮转或每小时左右主动扫描并删除过期文件**。
常见错误是以为设了就“每天凌晨删”,其实它不依赖 crontab,也不保证精确到秒——只保证“过期后尽快清理”。默认值都是 0(永不过期),必须显式设置才生效。
-
set global expire_logs_days = 7—— 立即生效,但重启后丢失(除非写进配置) - 永久生效需编辑
/etc/my.cnf或/etc/mysql/mysql.conf.d/mysqld.cnf,在[mysqld]段下添加:expire_logs_days = 7
(5.7)或binlog_expire_logs_seconds = 604800
(8.0+,=7×24×3600) - 修改后无需重启 MySQL,但建议执行
flush binary logs触发一次日志轮转,加速清理判断
主从架构下误删 binlog 会直接中断同步
如果主库执行 PURGE BINARY LOGS 删除了从库还没读完的日志,从库 I/O 线程会报错停住,典型错误:The slave I/O thread stops because master and slave have equal MySQL server ids 或更常见的 Could not find first log file name in binary log index file。
安全操作顺序必须是:
- 先登录每个从库,运行
show slave status\G,记下Relay_Master_Log_File字段值(比如mysql-bin.000123) - 在所有从库中取该字段的「最早值」,比如三个从库分别是
.000123、.000125、.000120,那就以.000120为安全边界 - 主库执行:
PURGE BINARY LOGS TO 'mysql-bin.000120'—— 注意:这个命令**不删.000120本身**,只删它之前的 - 切勿在主从运行中执行
RESET MASTER,它会清空所有 binlog 并重置序列号,导致全部从库无法继续同步
手动清理比自动配置更灵活,但也更危险
自动配置适合长期稳定运行,手动清理则用于应急腾空间、迁移前清理、或配合备份窗口做精准截断。
两个常用语法的区别很关键:
-
PURGE BINARY LOGS TO 'mysql-bin.000150':删掉索引中排在.000150**之前的所有文件**(不含它自己),依赖文件名序号,要求你知道当前最大编号 -
PURGE BINARY LOGS BEFORE '2026-03-10 00:00:00':删掉最后修改时间早于该时刻的所有 binlog,**注意是文件系统 mtime,不是事件发生时间**,且对主从环境仍需先确认从库已同步到该时间点 - 执行前务必先查现状:
SHOW BINARY LOGS看现有文件及大小,SHOW VARIABLES LIKE '%expire%'确认当前自动策略是否冲突
磁盘快满时,别只盯着 binlog 清理
binlog 占用高往往只是表象,背后可能是慢 SQL 导致事务长时间未提交、大事务未拆分、或从库延迟严重卡住主库 binlog 释放。单纯删日志治标不治本。
快速排查建议:
- 运行
SHOW PROCESSLIST找出State为Writing to binlog或长时间Updating的连接 - 查从库延迟:
SHOW SLAVE STATUS\G中看Seconds_Behind_Master,若 > 0 且持续增长,说明从库追不上,主库 binlog 就不敢删 - 检查磁盘实际使用:
df -h /var/lib/mysql,再进目录ls -lh | grep mysql-bin确认是不是 binlog 真的占大头 - 临时缓解可先关 general_log(如果开着):
SET GLOBAL general_log = OFF,它比 binlog 增长还猛
自动清理配得再好,也挡不住一个卡死的从库持续 hold 住所有 binlog。真正要盯的,是那个迟迟不往前走的 Relay_Master_Log_File。


















