MySQL 二進制日誌(Binlog)記錄所有數據變更,是主從複製、時間點恢復(PITR)的核心依賴。但若不加控制,Binlog 會無限增長佔滿磁盤。本文詳細說明手動清理 PURGE 語法、自動過期配置、主從環境下的安全清理原則與監控建議。
-- 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> 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[mysqld]
# MySQL 8.0+ 推薦:秒級精度,7 天 = 604800 秒
binlog_expire_logs_seconds = 604800
# MySQL 5.7/8.0 兼容:天級精度(若同時設置,秒級優先)
expire_logs_days = 7
FLUSH LOGS)、定期檢查時自動清理過期文件。SET GLOBAL binlog_expire_logs_seconds = 86400;(無需重啟)。SHOW SLAVE STATUS\G 關注 Relay_Master_Log_File(從庫正在應用的主庫 Binlog 文件)與 Exec_Master_Log_Pos。Relay_Master_Log_File。建議保留額外 1-2 個文件緩衝。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 大小/文件數/從庫延遲監控告警,將存儲風險納入常規巡檢體系。