mysql的二进制日志(binlog)用于记录数据库的变更操作,是数据恢复和主从复制的重要依据,但长期不清理会持续占用磁盘空间,配置expire_logs_days可以让mysql自动删除过期的binlog文件,无需手动干预。

expire_logs_days参数说明
expire_logs_days是mysql中控制binlog自动过期时长的参数,单位为天,默认值为0,代表不自动清理过期binlog。当该参数设置为大于0的数值时,mysql会在以下场景触发过期日志清理:
- mysql服务重启时
- 执行
FLUSH LOGS命令时 - binlog文件大小达到
max_binlog_size设置的上限,生成新的binlog文件时
需要注意的是,该参数仅对binlog生效,不会影响错误日志、慢查询日志等其他类型的日志。
临时配置expire_logs_days
临时配置方式不需要重启mysql服务,修改后立即生效,但mysql服务重启后会恢复为原来的配置值,适合临时调整日志保留策略的场景。
首先可以查看当前expire_logs_days的配置值:
-- 查看expire_logs_days当前值 SHOW VARIABLES LIKE 'expire_logs_days';
如果需要设置自动清理7天前的binlog,执行以下命令:
-- 设置过期时长为7天,临时生效 SET GLOBAL expire_logs_days = 7;
设置完成后可以再次执行查看命令确认参数是否生效,此时新的过期策略会立即应用到后续的binlog清理逻辑中。
永久配置expire_logs_days
永久配置需要修改mysql的配置文件,修改后重启服务生效,之后每次服务启动都会加载该配置,适合长期固定日志保留策略的场景。
首先找到mysql的配置文件,linux系统通常是/etc/my.cnf或者/etc/mysql/my.cnf,windows系统通常是my.ini,在[mysqld]配置段中添加或修改以下配置:
[mysqld] # 设置binlog自动清理过期时长,单位天 expire_logs_days = 7
修改完成后保存配置文件,重启mysql服务即可生效。linux系统重启命令参考:
# 重启mysql服务,不同系统命令可能有差异 systemctl restart mysqld # 或者 service mysql restart
配置注意事项
保留时长设置原则
expire_logs_days的取值需要根据实际业务需求设置,不能过小也不能过大:
- 如果数据库有主从复制架构,该值需要大于主从复制的最大延迟时间,避免从库还没同步的binlog被提前删除,导致主从复制中断
- 如果需要通过binlog做数据恢复,需要保留足够时长的binlog,覆盖可能的恢复时间窗口,比如定期一周做一次全量备份,那么expire_logs_days至少设置为7天
- 如果磁盘空间充足且没有特殊恢复需求,可以适当调大该值,一般建议设置在7到30天之间
手动清理binlog的方式
如果需要手动清理binlog,除了等待自动清理触发,还可以使用以下命令:
-- 删除所有binlog,重新生成新的binlog,相当于重置binlog RESET MASTER; -- 删除指定时间之前的binlog,比如删除2024-05-01 00:00:00之前的binlog PURGE BINARY LOGS BEFORE '2024-05-01 00:00:00'; -- 删除指定日志文件之前的所有binlog,比如删除mysql-bin.000010之前的所有binlog PURGE BINARY LOGS TO 'mysql-bin.000010';
注意RESET MASTER会清空所有binlog,主从架构下执行该命令会导致从库同步失败,需要谨慎使用。
其他相关参数
除了expire_logs_days,mysql 8.0及以上版本还引入了binlog_expire_logs_seconds参数,支持以秒为单位设置binlog过期时长,精度更高,两个参数同时存在时,binlog_expire_logs_seconds的优先级更高,如果设置了该参数,expire_logs_days会自动失效。
查看binlog_expire_logs_seconds配置的命令如下:
-- 查看秒级binlog过期参数 SHOW VARIABLES LIKE 'binlog_expire_logs_seconds';
验证配置效果
配置完成后可以通过以下方式验证自动清理是否生效:
首先查看当前binlog文件列表:
-- 查看所有binlog文件信息 SHOW BINARY LOGS;
可以记录当前binlog文件的生成时间,等待超过设置的过期时长后,再次执行该命令,确认过期时间之前的binlog文件已经被自动删除。
mysqlexpire_logs_daysbinlog过期日志清理日志配置修改时间:2026-06-14 10:45:35