主從架構中,Binlog 是同步生命線。直接 rm 刪除會導致索引文件 mysql-bin.index 與實際文件不一致,引發主庫啟動失敗、從庫報錯「Could not find first log file」。本文規範**生產環境安全清理全流程**。
SHOW MASTER STATUS;
+------------------+-----------+--------------+------------------+
| File | Position | Binlog_Do_DB | Binlog_Ignore_DB |
+------------------+-----------+--------------+------------------+
| mysql-bin.000097 | 541677824 | www | test,mysql |
+------------------+-----------+--------------+------------------+
SHOW SLAVE STATUS\G
-- 關鍵字段
Master_Log_File: mysql-bin.000103
Read_Master_Log_Pos: 675107897
Relay_Master_Log_File: mysql-bin.000103
Slave_IO_Running: Yes
Slave_SQL_Running: Yes
結論:從庫正在讀取 mysql-bin.000103,**不可清理 000103 及之後的文件**;可清理 000102 及更早文件(前提是所有從庫均已同步過)。
PURGE MASTER LOGS TO 'mysql-bin.000095';
-- 刪除 000095 之前的所有文件,保留 000095 及之後
PURGE MASTER LOGS BEFORE '2024-01-10 00:00:00';
-- 刪除該時間點前的所有文件
SHOW BINARY LOGS;
-- 確認最早文件編號符合預期
ls -lh /var/lib/mysql/mysql-bin.00009*
-- 確認磁盤空間釋放
[mysqld]
expire_logs_days = 7 # 5.7,天級
binlog_expire_logs_seconds = 604800 # 8.0+,秒級,優先級更高
max_binlog_size = 100M # 單文件上限,觸發輪轉
PURGE 過期文件並更新 index。
[ERROR] Failed to open log file ./mysql-bin.000005
[ERROR] Could not open log file
[ERROR] Aborting
mysql-bin.index 內容:cat mysql-bin.index。mysql-bin.index,**刪除不存在的文件行**,保留現存文件名(每行一個)。index 文件也被刪除:touch mysql-bin.index(新建空索引,MySQL 將從 000001 重新開始,**主從將中斷需重建**)。systemctl restart mysqld。
# 每日歸檔腳本
#!/bin/bash
ARCHIVE_DIR="/backup/binlog_archive/$(date +%Y%m)"
mkdir -p "$ARCHIVE_DIR"
# 複製已封存的 Binlog(不含當前寫入文件)
FLUSH LOGS; # 切換新文件,舊文件變為只讀
cp /var/lib/mysql/mysql-bin.000* "$ARCHIVE_DIR/" # 排除當前文件
# 上傳至對象存儲 (OSS/S3)
aws s3 sync "$ARCHIVE_DIR" s3://my-bucket/binlog/$(date +%Y%m)/
Binlog 清理鐵律:**只用 PURGE/expire_logs_days,絕不手動 rm**。清理前**必須**在所有從庫確認 Master_Log_File 進度。配置自動過期、異地歸檔、磁盤告警,構建「零人工干預、零數據風險」的 Binlog 生命周期管理。