MySQL: 你的binlog_expire_logs_seconds可能正在失效

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了MySQL: 你的binlog_expire_logs_seconds可能正在失效相关的知识,希望对你有一定的参考价值。

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

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

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

下面我们来看一个 binlog_expire_logs_seconds 失效的场景。

这是因为MySQL8.0为了解决备份时的全局锁问题,新引入了 LOCK INSTANCE FOR BACKUP 备份锁,而这把锁恰好导致了 binlog_expire_logs_seconds 的失效,下面两张图说明这个问题:

如果 MySQL 每天的数据修改很少,产生的 binlog 很小,而 max_binlog_size 设置很大。每次在达到单个 binlog 的最大大小前,执行定时任务调用 xtrabackup 备份,备份时加的备份锁 LOCK INSTANCE FOR BACKUP 和 FLUSH NO_WRITE_TO_BINLOG BINARY LOGS 会导致:binlog 刷新了,但是无法自动删除过期的 binlog。新的 binlog 写一天没有达到最大大小,又进行备份,每天循环这个逻辑,导致过期的 binlog 越来越多,一直无法被自动删除。

当然,如果你使用的是 MySQL5.7,那并不会有这个问题,虽然 MySQL5.7时备份时会加全局锁,但是并不影响过期 binlog 的自动删除。从这个角度看,这是个 bug,所以报给官方后很快被确认了: https://bugs.mysql.com/bug.php?id=104785

等待修复的过程是漫长的,如果你恰好遇见了这个冷门的 bug,可以把 max_binlog_size 调小,保证在备份前 binlog 就能够达到最大大小,自然的刷新可以正常触发自动删除。

通过查看mysql 配置参数状态来优化你的mysql

以上是关于MySQL: 你的binlog_expire_logs_seconds可能正在失效的主要内容,如果未能解决你的问题,请参考以下文章

mysql 通过查看mysql 配置参数状态来优化你的mysql

通过查看mysql 配置参数状态来优化你的mysql

你好,问一下你的mysql主从同步中show master stat

为你的mysql 创建索引

mysql.connector.errors.ProgrammingError: 1064 (4200): 你的 SQL 语法有错误;

Mysql性能优化:为什么你的count(*)这么慢?