啟用事件排程器
-- 檢查
SELECT @@event_scheduler; -- OFF / ON / DISABLED
-- 運行時開啟
SET GLOBAL event_scheduler = ON;
-- 永久生效 (my.cnf)
[mysqld]
event_scheduler = ON
建立每日清理事件
CREATE EVENT `purge_binlog_daily`
ON SCHEDULE EVERY 1 DAY
STARTS TIMESTAMP(CURDATE() + INTERVAL 1 DAY, '03:00:00') -- 凌晨 3 點低峰期
ON COMPLETION PRESERVE
ENABLE
COMMENT '每日清理 4 天前的 Binlog,釋放磁碟空間'
DO
PURGE MASTER LOGS BEFORE DATE_SUB(NOW(), INTERVAL 4 DAY);
驗證與監控
-- 查看事件狀態
SELECT * FROM information_schema.EVENTS
WHERE EVENT_SCHEMA = DATABASE() AND EVENT_NAME = 'purge_binlog_daily'\G
-- 關鍵欄位
STATUS: ENABLED
LAST_EXECUTED: 2024-01-15 03:00:01
EXECUTE_AT: NULL (週期性)
INTERVAL_VALUE: 1
INTERVAL_FIELD: DAY
參數調整建議
| 場景 | 保留天數 | 執行頻率 | 備註 |
| 高寫入、磁碟小 | 1~2 天 | 每 6 小時 | EVERY 6 HOUR + INTERVAL 2 DAY |
| 標準生產 | 4~7 天 | 每日 | 平衡恢復點目標 (RPO) 與空間 |
| 需支援延遲 Slave | ≥ Max(Slave 延遲) + 1 天 | 每日 | 確保 Slave 仍能追上 |
替代方案:binlog_expire_logs_seconds (MySQL 8.0+)
[mysqld]
binlog_expire_logs_seconds = 345600 -- 4 天 = 4*86400 秒,自動清理,無需 Event
- 原生參數,啟動即生效,無排程器依賴。
- 精確到秒,避免 Event 執行延遲導致殘留。
- 建議 8.0+ 直接用此參數棄用 Event。
注意事項
PURGE MASTER LOGS 需 BINLOG_ADMIN 或 SUPER 權限,Event Definer 必須具備。
- 若有 Slave,清理前確認
SHOW SLAVE STATUS 中 Relay_Master_Log_File 未被刪除。
- 備份策略:Binlog 清理前應已完成全備/增備 (XtraBackup/ mysqldump --master-data)。