相关文章推荐
英俊的大象  ·  Istio 报错503,upstream ...·  5 月前    · 
大气的芒果  ·  selenium ...·  1 年前    · 
愤怒的风衣  ·  js格式化iso ...·  1 年前    · 

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

binlog_expire_logs_seconds

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

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

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

  • 手工执行了 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服务重启后配置生效

    查询上述参数后发现在MySQL 8.0.12版本中默认开启binlog日志并设置为binlog_format=row,
    binlog失效日期参数为 binlog_expire_logs_seconds,默认30天过期。

    注释:
    在MySQL8.0 版本中新增参数binlog_expire_logs_seconds,可以精确到秒,而此前版本中expire_logs_days的单位为天,最小值为1,在MySQL8.0 GA中此参数标记为deprecated 。
    在MySQL 8.0 GA版本默认使用binlog_expire_logs_seconds,时间为2592000秒,30天。

    若在MySQL启动时inlog_expire_logs_seconds和expire_logs_days 都没设置值,则使用默认值的 binlog_expire_logs_seconds值,即30天;
    若在MySQL启动时binlog_expire_logs_seconds或者expire_logs_days其中一个设置为非0值则非0值的
    参数作为binlog日志失效期;
    若在启动时binlog_expire_logs_seconds和expire_logs_days参数都设置为非0值则使用binlog_expire_logs_seconds值,expire_logs_days值则失效并对其发出告警信息。

    若要关闭自动清除binlog文件的功能则需要显示指定binlog_expire_logs_seconds=0 并且不设置expire_logs_days的值。
    为了兼容早期版本若显示指定了expire_logs_days =0而没有指定binlog_expire_logs_seconds的值
    此时自动清理binlog日志则是 禁用 的,并且此时binlog_expire_logs_seconds的默认值不适用。

    该参数支持动态修改,并且支持持久话到配置文件:
    mysql> set global binlog_expire_logs_seconds=60*60*24;
    Query OK, 0 rows affected (0.00 sec)
    mysql> show variables like '%expire%';
    +--------------------------------+-------+
    | Variable_name | Value |
    +--------------------------------+-------+
    | binlog_expire_logs_seconds | 86400 |
    | disconnect_on_expired_password | ON |
    | expire_logs_days | 0 |
    +--------------------------------+-------+
    3 rows in set (0.00 sec)
    --持久化:
    mysql> set persist binlog_expire_logs_seconds=60*60*24;
    Query OK, 0 rows affected (0.00 sec)

    结论:
    在MySQL8.0版本对于binlog需要自定义设置的比较好,可以指定binlog文件的存储路径和binlog文件的
    命名,设置binlog文件的保留的时间,需要注意防止默认设置产生较多的binlog文件占用磁盘空间。
    推荐使用参数binlog_expire_logs_seconds,设置为7天,即
    binlog_expire_logs_seconds=604800

    原文链接:https://blog.csdn.net/vkingnew/article/details/81953350