这篇“mysql8新特性binlog_expire_logs_seconds有什么作用”文章的知识点大部分人都不太理解,所以小编给大家总结了以下内容,内容详细,步骤清晰,具有一定的借鉴价值,希望大家阅读完这篇文章能有所收获,下面我们一起来看看这篇“mysql8新特性binlog_expire_logs_seconds有什么作用”文章吧。
在mysql 8.0版本中新增了binlog_expire_logs_seconds,该参数表示binlog的失效日期单位秒。
8.0之前的版本,binlog的失效日志用expire_logs_days来配置,单位是天。
当mysql启动时,参数文件中binlog_expire_logs_seconds和expire_logs_days都没配置的时候,mysql会使用binlog_expire_logs_seconds作为默认配置,并且默认值为2592000秒,即30天。
当mysql启动时,参数文件中binlog_expire_logs_seconds和expire_logs_days有一个设置为非0值则非0值的参数作为binlog日志的失效期。
在使用了binlog_expire_logs_seconds作为binlog的配置文件,此时在修改expire_logs_days会抛出错误,不允许同时使用binlog_expire_logs_seconds和expire_logs_days.
该参数支持动态修改,并且支持持久化到配置文件:
mysql> set global binlog_expire_logs_seconds=604800;</code>
<code>Query OK, 0 rows affected (0.00 sec)</code>
<code>mysql> show variables like '%expire_logs%';</code>
<code>+--------------------------------+-------+</code>
<code>| Variable_name | Value |</code>
<code>+--------------------------------+-------+</code>
<code>| binlog_expire_logs_seconds | 604800|</code>
<code>| expire_logs_days | 0 |</code>
<code>+--------------------------------+-------+</code>
<code>3 rows in set (0.00 sec)
--持久化:
mysql> set persist binlog_expire_logs_seconds=604800;</code>
<code>Query OK, 0 rows affected (0.00 sec)
也可以通过修改配置文件,将binlog_expire_logs_seconds=604800 加到[mysqld]下
总结
如果 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 就能够达到最大大小,自然的刷新可以正常触发自动删除。