首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫

MySQL 手動清理 Binlog 日誌:PURGE 語法、自動過期與最佳實踐

     編輯:MySQL 資料庫相關知識

MySQL 二進制日誌(Binlog)記錄所有數據變更,是主從複製、時間點恢復(PITR)的核心依賴。但若不加控制,Binlog 會無限增長佔滿磁盤。本文詳細說明手動清理 PURGE 語法、自動過期配置、主從環境下的安全清理原則與監控建議。

一、 手動清理:PURGE BINARY LOGS

語法變體

-- 1. 刪除指定文件之前的所有日誌(含指定文件)
PURGE {MASTER | BINARY} LOGS TO 'mysql-bin.000010';

-- 2. 刪除指定時間點之前的所有日誌
PURGE {MASTER | BINARY} LOGS BEFORE '2024-01-15 10:00:00';

-- 3. 刪除 N 天前的日誌(動態時間,推薦腳本用)
PURGE BINARY LOGS BEFORE DATE_SUB(NOW(), INTERVAL 7 DAY);
  • MASTER 與 BINARY 同義,MySQL 8.0 推薦 BINARY。
  • 執行需 BINLOG_ADMIN 權限(8.0+)或 SUPER 權限(舊版)。
  • 關鍵安全機制:MySQL 會自動檢查從庫同步位點,若發現從庫尚未讀取某些待刪除日誌,拒絕執行並報錯,防止主從中斷。

實戰示例

mysql> SHOW BINARY LOGS;
+------------------+-----------+
| Log_name         | File_size |
+------------------+-----------+
| mysql-bin.000001 | 157       |
| mysql-bin.000002 | 1.2M      |
...
| mysql-bin.000010 | 500M      |
+------------------+-----------+

-- 確認從庫已同步到 mysql-bin.000008 (SHOW SLAVE STATUS\G 看 Relay_Master_Log_File)
mysql> PURGE BINARY LOGS TO 'mysql-bin.000008';
Query OK, 0 rows affected (0.02 sec)

二、 自動過期:binlog_expire_logs_seconds / expire_logs_days

配置參數(二選一,8.0 推薦秒級)

[mysqld]
# MySQL 8.0+ 推薦:秒級精度,7 天 = 604800 秒
binlog_expire_logs_seconds = 604800

# MySQL 5.7/8.0 兼容:天級精度(若同時設置,秒級優先)
expire_logs_days = 7
  • Server 啟動時、每次 Binlog 切換(FLUSH LOGS)、定期檢查時自動清理過期文件。
  • 動態調整:SET GLOBAL binlog_expire_logs_seconds = 86400;(無需重啟)。
  • 默認值:5.7 默認 0(不自動清理),8.0 默認 30 天(2592000 秒)。

三、 主從環境安全清理原則(必讀)

  1. 先確認從庫位點:SHOW SLAVE STATUS\G 關注 Relay_Master_Log_File(從庫正在應用的主庫 Binlog 文件)與 Exec_Master_Log_Pos。
  2. 保留窗口:清理目標文件早于 所有從庫的 Relay_Master_Log_File。建議保留額外 1-2 個文件緩衝。
  3. 異常從庫處理:若有從庫長期停止/延遲極大,需先修復或重搭,再清理主庫 Binlog,否則無法釋放空間。
  4. GTID 模式下:同樣遵循位點原則,PURGE 會檢查 gtid_purged 集合。

四、 監控與告警

指標收集方式告警閾值建議
Binlog 總大小SHOW BINARY LOGS 求和 / 文件系統 du -sh /var/lib/mysql/> 磁盤 70% 或 > 100GB
Binlog 文件數SHOW BINARY LOGS 計數> 1000(可能意味著切換頻繁或清理失效)
從庫延遲Seconds_Behind_Master> 300 秒
自動清理是否生效對比 expire_logs_days 與最早 Binlog 日期最早文件超過保留天數仍存在

五、 常見誤區與避坑

  • 直接 rm -f mysql-bin.*:嚴禁! 會導致 mysql-bin.index 索引文件與實際文件不一致,Server 重啟報錯、主從複製崩潰。只能用 PURGE 語句。
  • 設置 expire_logs_days=0 關閉自動清理:除非有外部備份/清理體系,否則極高風險。
  • 忽略 binlog_do_db/binlog_ignore_db 過濾規則:清理前確認過濾規則未導致關鍵庫日誌缺失。

六、 總結

Binlog 清理鐵律:自動過期配置生效(binlog_expire_logs_seconds)為主,手動 PURGE 為輔。手動清理前必須驗證所有從庫同步位點。嚴禁操作系統層面直接刪除文件。建立 Binlog 大小/文件數/從庫延遲監控告警,將存儲風險納入常規巡檢體系。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved