-- 登入 MySQL
mysql -u root -p
-- 列出所有 binlog 文件與大小
SHOW BINARY LOGS;
-- 或
SHOW MASTER LOGS;
-- 查看當前寫入的 binlog 文件與位置
SHOW MASTER STATUS;
-- 查看 binlog 事件內容
SHOW BINLOG EVENTS IN 'mysql-bin.000010' LIMIT 10;
-- 或使用 mysqlbinlog 工具
mysqlbinlog --base64-output=decode-rows -v mysql-bin.000010 | less
-- 刪除指定文件之前的所有 binlog(含指定文件之前)
PURGE BINARY LOGS TO 'mysql-bin.000010';
-- 刪除指定時間之前的 binlog
PURGE BINARY LOGS BEFORE '2024-01-01 00:00:00';
-- 刪除指定日期之前
PURGE BINARY LOGS BEFORE DATE_SUB(NOW(), INTERVAL 7 DAY);
-- MySQL 5.7 / 8.0 舊參數(天)
SET GLOBAL expire_logs_days = 7;
-- my.cnf 永久生效
[mysqld]
expire_logs_days = 7
-- MySQL 8.0 新參數(秒,優先級更高)
SET GLOBAL binlog_expire_logs_seconds = 604800; -- 7天
[mysqld]
binlog_expire_logs_seconds = 604800
⚠️ 同時設定時以秒為準。建議統一使用秒單位參數。
RESET MASTER;
-- 危險!會刪除所有 binlog 並重置索引,從庫會中斷同步
SHOW SLAVE STATUS\G,記下 Relay_Master_Log_File(正在讀取的 Master binlog)SHOW BINARY LOGS,取得完整列表PURGE BINARY LOGS TO '該文件名'| 格式 | 設定 | 優點 | 缺點 |
|---|---|---|---|
| STATEMENT | binlog_format=STATEMENT | 體積小 | 非確定性函數(如 UUID()) 導致主從不一致 |
| ROW | binlog_format=ROW | 最安全、支援所有場景 | 體積大、大批次更新膨脹 |
| MIXED | binlog_format=MIXED (預設) | 自動切換,平衡 | 極少數邊界情況仍可能不一致 |
建議:生產環境預設用 ROW,確保數據一致性;存儲成本敏感可用 MIXED。
[mysqld]
# 註釋或移除
# log-bin=mysql-bin
# binlog_format=ROW
-- 重啟生效
systemctl restart mysqld
# 1. 確認佔用
du -sh /var/lib/mysql/mysql-bin.*
# 2. 臨時移動舊 binlog 到其他磁碟(勿刪除!)
mkdir /mnt/backup_binlog
mv /var/lib/mysql/mysql-bin.000001* /mnt/backup_binlog/
# 3. 更新索引文件 mysql-bin.index(手動編輯移除對應行)
# 4. FLUSH LOGS 產生新 binlog
mysql -e "FLUSH LOGS;"
# 5. 事後補上 PURGE 或設定 expire_logs_days
Binlog 是 MySQL 數據安全的命脈。**清理前必須確認所有從庫同步位置**,優先使用 PURGE BINARY LOGS TO/BEFORE 精確控制,配置 binlog_expire_logs_seconds 自動化,嚴禁在主從架構下直接 RESET MASTER 或手動刪除文件。