二進制日志是主從復制、時間點恢復的核心依據。隨意刪除會導致從庫斷檔、數據無法恢復。本文詳述 PURGE BINARY LOGS 正確用法,並給出生產環境標準操作流程(SOP)。
-- 按日志文件名刪除(不含指定文件) PURGE BINARY LOGS TO 'mysql-bin.000003'; -- 按時間點刪除(刪除指定時間之前的日志) PURGE BINARY LOGS BEFORE '2024-01-15 10:00:00'; -- 同義詞:MASTER = BINARY PURGE MASTER LOGS TO 'mysql-bin.010'; PURGE MASTER LOGS BEFORE '2008-06-22 13:00:00'; -- 動態時間:刪除 3 天前日志 PURGE MASTER LOGS BEFORE DATE_SUB(NOW(), INTERVAL 3 DAY);
-- 1. 查看現有日志 mysql> SHOW BINARY LOGS; +------------------+-----------+ | Log_name | File_size | +------------------+-----------+ | mysql-bin.000001 | 150462942 | | mysql-bin.000002 | 125 | | mysql-bin.000003 | 106 | +------------------+-----------+ -- 2. 刪除 000003 之前的日志 mysql> PURGE BINARY LOGS TO 'mysql-bin.000003'; Query OK, 0 rows affected (0.16 sec) -- 3. 驗證結果 mysql> SHOW BINARY LOGS; +------------------+-----------+ | Log_name | File_size | +------------------+-----------+ | mysql-bin.000003 | 106 | +------------------+-----------+
鐵律: 若有活躍從庫正在讀取目標日志,PURGE 會報錯失敗;若從庫離線且其所需日志被刪,重啟後將無法復制。
SHOW SLAVE STATUS\G 記錄 Master_Log_File 和 Read_Master_Log_PosSHOW BINARY LOGS 獲取完整日志列表PURGE BINARY LOGS TO '目標日志文件名'在主庫 crontab 配置:
# 每天凌晨 1 點清理 3 天前日志 0 1 * * * mysql -uroot -p'xxx' -e "PURGE MASTER LOGS BEFORE DATE_SUB(NOW(), INTERVAL 3 DAY);"
前提: 確保所有從庫延遲 < 3 天,且有監控告警保障。
expire_logs_days 參數:設置後 MySQL 啟動/刷新日志時自動清理,**但不保證實時生效**,建議配合手動/定時 PURGE 使用ER_MASTER_HAS_PURGED_REQUIRED_GTIDSrm -f mysql-bin.*!會導致索引文件 mysql-bin.index 不一致,MySQL 拒絕啟動Binlog 清理三步走:**查從庫位置 → 定安全界線 → 執行 PURGE TO**。納入自動化運維體系,配合監控告警,才能在釋放磁碟空間與保障數據安全間取得平衡。