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 BACKUPFLUSH 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 就能夠達到最大大小,自然的刷新可以正常觸發自動刪除。

到此這篇關於mysql8新特性之binlog_expire_logs_seconds的文章就介紹到這瞭,更多相關mysql8新特性binlog_expire_logs_seconds內容請搜索WalkonNet以前的文章或繼續瀏覽下面的相關文章希望大傢以後多多支持WalkonNet!

推薦閱讀: