mysql8.0设置binlog保存时间,并清除过期日志释放空间

发布时间 2023-03-28 15:27:49作者: 人生苦短,知足常乐!

如果你正在使用 MySQL8.0 ,并且在使用物理热备工具,那么 binlog_expire_logs_seconds 可能不会如你预想的那样生效。

binlog_expire_logs_seconds

为了防止 binlog 文件过大导致无可用的磁盘空间,MySQL 提供了一个系统变量用来配置过期时间,MySQL5.7 时变量名为 expire_logs_days ,精确度为天;MySQL8.0 使用 binlog_expire_logs_seconds 来控制,其效果和名字的变化一样,精确度由天变成了秒。超过这个时间的 binlog 会被自动清理,自动清理的触发时机为(注意:并不是以每秒这样的固定频率检查是否有过期日志):

  1. MySQL 启动时;
  2. binlog 刷新时。

MySQL 启动不用多说,binlog 刷新又分两种情况:

  1. 当前的 binlog 大小达到max_binlog_size,写完当前事务的日志后,就会生成一个新的 binlog;

  2. 手工执行了 flush [binary] logs ; 命令后,也会生成一个新的 binlog。

binlog具体设置

mysql> show variables like '%expire%';

注意:mysql8.0以下版本binlog保存时效 以天为单位,参数为expire_logs_days,默认0为永不过期。mysql8.0以上版本binlog保存时效 以秒为单位,参数为binlog_expire_logs_seconds,默认的binlog过期时间为2592000秒,也就是30天。

示例设置过期日期为1天(1d=86400s):

mysql> set global binlog_expire_logs_seconds=86400;

清除日志
1.手动刷新清理过期日志

mysql> flush logs;

2.清除某个日志:

mysql> purge binary logs to 'binlog.000011';

3.清除某日前的日志:

mysql> purge binary logs before '2020-12-20';

注意:不要轻易手动去删除binlog,会导致binlog.index和真实存在的binlog不匹配,而导致expire_logs_day失效。

二.修改配置,重启生效
在配置文件 my.cnf 中修改参数如下:

[mysqld]
expire_logs_days=1 #日志过期时间为1天,若expire_logs_days=0,则为永不过期哦
max_binlog_size=500M #日志最多存放500M,超过500M后会被清除

mysql服务重启后配置生效