萬盛學電腦網

您现在的位置: 萬盛學電腦網 >> 程式設計 >  >> 資料庫 >> MySQL 教學

MySQL 主從環境下 Binlog 安全清理:PURGE MASTER LOGS 實戰與誤刪修復

前言

主從架構中,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       |
+------------------+-----------+--------------+------------------+

從庫:查看正在讀取的主庫 Binlog 文件


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。
  • 主從環境下,自動清理**同樣受從庫進度保護**:若從庫落後超過過期時間,主庫**不會**清理從庫仍需的文件(5.7.23+/8.0+ 行為)。

手動誤刪 Binlog 文件後的修復

現象


[ERROR] Failed to open log file ./mysql-bin.000005
[ERROR] Could not open log file
[ERROR] Aborting

修復步驟

  1. 檢查 mysql-bin.index 內容:cat mysql-bin.index。
  2. 編輯 mysql-bin.index,**刪除不存在的文件行**,保留現存文件名(每行一個)。
  3. 若 index 文件也被刪除:touch mysql-bin.index(新建空索引,MySQL 將從 000001 重新開始,**主從將中斷需重建**)。
  4. 重啟 MySQL:systemctl restart mysqld。

異地歸檔策略(合規與 PITR 需求)


# 每日歸檔腳本
#!/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 生命周期管理。

copyright © 萬盛學電腦網 all rights reserved