type
Post
status
Published
date
Feb 11, 2026
slug
xtrabackup-causes-binlog-not-purged
summary
tags
疑難雜症
category
MySQL
icon
password

症狀

MySQL 有一組單一 Source 雙 Replica 的拓樸下,只有其中一台 Replica 發生 disk 空間不足,被大量 binlog 刪除沒有正常 purge。

調查

首先這 3 台 MySQL 都有相同的 Binlog 相關變量,所以不是因為沒有設置 purge
接著發現在 error log 中會定期出現以下錯誤:
同時回顧 binlog 的最後修改時間和這條日誌訊息的時間點是一模一樣的,都是在每個小時的 7~8 分左右發生,進一步對應到這台 replica 每個小時都有進行 xtrabackup !

原因

剛剛我們定位到這台 Replica 唯一特別的地方就是有運行 xtrabackup,可是為什麼會因此造成 binlog 沒有被正常清理呢?

Binary log 自動清理的時機點

首先我們要了解 binlog 清理的時間點,根據官方文檔的原文:
Binary log files are automatically removed after the server's binary log expiration period. Removal of the files can take place at startup and when the binary log is flushed. MySQL :: MySQL 8.0 Reference Manual :: 15.4.1.1 PURGE BINARY LOGS Statement
說明 binlog 會在伺服器啟動,或 binary log flushed (也就是切換到新的 binary log 的時候)才會觸發自動清理。

Xtrabackup 為什麼引發 MY-014054?

根據這條日誌,我們可以在官方文檔中查到對應的原文:
PURGE BINARY LOGS should not be issued while a LOCK INSTANCE FOR BACKUP statement is in effect for the instance, because it contravenes the rules of the backup lock by removing files from the server. From MySQL 8.0.28, this is disallowed. MySQL :: MySQL 8.0 Reference Manual :: 15.3.5 LOCK INSTANCE FOR BACKUP and UNLOCK INSTANCE Statements
從 MySQL 8.0.28 開始,當 MySQL 持有 LOCK INSTANCE FOR BACKUP 鎖時,是不能運行 PURGE BINARY LOGS。
恰好 Xtrabackup 就會在備份期間執行 LOCK INSTANCE FOR BACKUP,並且還會運行 FLUSH NO_WRITE_TO_BINLOG BINARY LOGS 來刷新 Binary log,然後因為這個原因導致 log 中會出現以下錯誤:

小節

現在讓我們看一眼發生問題的 Replica Binary log 大小:
有沒有發現這些 Binary log 大小都沒有超過 max_binlog_size 的設置 1GB (這也預設值),所以這台 MySQL 的 Binary log 沒有自主因為過大而觸發 binlog 的切換!
反而他在每個小時都被 xtrabackup flush 的同時又因為有 LOCK INSTANCE FOR BACKUP 鎖,導致無法清除 binary log!
也就是說這一台 MySQL 的 Binary log 增長量不足,導致他自己本身不會觸發 Binary log flush,每一次 flush 都是 xtrabackup 觸發的然後又因為備份鎖刪不掉 Binary log。

解決方案

  1. 增加 binary log 寫入量,讓其在 xtrabackup 備份前超過 max_binlog_size 就可以了,雖然是開玩笑的但主要是想說明並不是每一台被 xtrabackup 備份的 MySQL 實例都會有這個問題
  1. 縮小max_binlog_size:讓 Binary logs 更頻繁的 flush,從而有機會在 xtrabackup 以外的時間點觸發 purge。
  1. 手動觸發 purge binary log

參考

MySQL :: MySQL 8.0 Reference Manual :: 15.3.5 LOCK INSTANCE FOR BACKUP and UNLOCK INSTANCE Statements
MySQL :: MySQL 8.0 Reference Manual :: 15.4.1.1 PURGE BINARY LOGS Statement
Percona Community ForumPercona Community ForumXtrabackup flushing binary logs while still locked
MySQL binlog超过binlog_expire_logs_seconds阈值没有删除案例 - 潇湘隐者 - 博客园