# /etc/my.cnf [mysqld] 區塊 expire_logs_days = 7 # 自動刪除 7 天前 binlog(默認 0 從不刪除) max_binlog_size = 100M # 單文件最大 100M,防止單文件過大 binlog_format = ROW # 推薦 ROW 格式,主從一致性最強 # log_bin = mysql-bin # 開啟 binlog(通常默認開)
修改後 systemctl restart mysqld 生效。動態調整(無需重啟):
SET GLOBAL expire_logs_days = 7; SET GLOBAL max_binlog_size = 104857600;
-- 按文件名清理(刪除指定文件之前的所有) PURGE BINARY LOGS TO 'mysql-bin.000058'; -- 按時間清理(刪除指定時間之前的所有) PURGE BINARY LOGS BEFORE '2024-01-15 00:00:00'; -- 相對時間清理(3 天前) PURGE BINARY LOGS BEFORE DATE_SUB(NOW(), INTERVAL 3 DAY);
MASTER / BINARY 同義,PURGE MASTER LOGS ... 效果相同。
SHOW SLAVE STATUS\G → 記錄 Master_Log_File / Relay_Master_Log_File,多從庫取最舊文件SHOW BINARY LOGS 列出所有文件PURGE BINARY LOGS TO '最舊從庫正在讀取的文件名';SHOW BINARY LOGS 確認文件列表,從庫 SHOW SLAVE STATUS 確認復制正常⚠️ 絕不 直接刪除文件系統層面的 mysql-bin.* 文件,會導致索引文件 mysql-bin.index 不一致,主庫拒絕啟動。
| 模式 | Binlog 格式 | 優點 | 缺點 | 適用場景 |
|---|---|---|---|---|
| SBR | STATEMENT | 文件小、可審計、版本兼容好 | 非確定函數(UUID/NOW)導致主從不一致、行鎖多 | 簡單業務、異構版本復制 |
| RBR | ROW | 完全記錄行變更、無非確定問題、從庫鎖少 | Binlog 大、大事務/大批量寫入放大 | 生產首選、高並發、數據一致性要求高 |
| MBR | MIXED | 自動切換:確定語句用 STATEMENT,非確定用 ROW | 極少數邊界情況判斷偏差 | 通用推薦、兼顧體積與安全 |
動態切換:SET SESSION/GLOBAL binlog_format = ROW|STATEMENT|MIXED;
語句:INSERT INTO db_allot_ids SELECT * FROM db_allot_ids
(id, ...) 值,從庫逐行應用,自動跳過/處理衝突expire_logs_days 保留量告警SHOW BINARY LOGS 對比文件數量與預期Binlog 清理鐵律:配置 expire_logs_days 自動清理 + 主從環境按最舊從庫位置 PURGE TO + 絕不手動 rm 文件。生產環境強烈建議 binlog_format=ROW 或 MIXED,配合 GTID 復制(5.6+)構建高可用架構。將清理策略納入運行手冊,定期演練 PITR 恢復,確保數據安全無死角。