首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫

百台 MySQL 節點批量清理過期 Binlog 釋放磁碟空間自動化方案

     編輯:MySQL 資料庫相關知識

痛點

  • 單機手動 PURGE BINARY LOGS 可行,百台節點逐台操作不現實。
  • 需根據從庫同步位置,安全清理主庫已同步的舊 binlog。
  • 架構為 M-M 或 M-S 多組,需自動化巡檢清理。

核心思路

  1. 維護一份從庫清單 slavelist(每行一個從庫 IP/主機名)。
  2. 對每個從庫:遠程執行 SHOW SLAVE STATUS 取得 Master_Log_File(當前同步檔案)與 Master_Host(主庫位址)。
  3. 遠程登入對應主庫,執行 PURGE MASTER LOGS TO '檔案名'。
  4. Shell 迴圈遍歷所有從庫,完成批量清理。

核心腳本 clean_binlog.sh

#!/bin/bash
# 參數:從庫主機名
SLAVE=$1

# 1. 取得從庫正在同步的主庫 binlog 檔案
MASTER_LOG_FILE=$(ssh $SLAVE "
    mysql -uxx -pxx --ssl-ca=/opt/mysql/ssl/ca-cert.pem \
          --ssl-cert=/opt/mysql/ssl/server-cert.pem \
          --ssl-key=/opt/mysql/ssl/server-key.pem \
          -e 'SHOW SLAVE STATUS\G' | grep -i Master_Log_File | awk '{print \$2}'
")

# 2. 取得主庫主機名/IP
MASTER_HOST=$(ssh $SLAVE "
    mysql -uxx -pxx --ssl-ca=/opt/mysql/ssl/ca-cert.pem \
          --ssl-cert=/opt/mysql/ssl/server-cert.pem \
          --ssl-key=/opt/mysql/ssl/server-key.pem \
          -e 'SHOW SLAVE STATUS\G' | grep -i Master_Host | awk '{print \$2}'
")

# 3. 在主庫執行 PURGE
ssh $MASTER_HOST "
    mysql -uxx -pxx --ssl-ca=/opt/mysql/ssl/ca-cert.pem \
          --ssl-cert=/opt/mysql/ssl/server-cert.pem \
          --ssl-key=/opt/mysql/ssl/server-key.pem \
          -e \"PURGE MASTER LOGS TO '$MASTER_LOG_FILE';\"
"

# 4. 驗證主庫 binlog 目錄磁碟使用
ssh $MASTER_HOST "df -h /mysql/binlog"

批量執行腳本

# slavelist 內容範例:
# db-slave-01
# db-slave-02
# ...

for s in $(cat slavelist); do
    sh clean_binlog.sh $s
done

關鍵細節與避坑指南

風險點對策
從庫延遲大,PURGE 導致主庫刪除從庫尚未同步的 binlog清理前檢查 Seconds_Behind_Master=0,或保留 N 個 binlog 檔案作緩衝
多從庫對應同一主庫,重複 PURGE去重 MASTER_HOST,或改為遍歷主庫清單,按最舊從庫位置 PURGE
SSL 憑證路徑硬編碼改用 ~/.my.cnf 或環境變數注入,避免明文密碼
網路抖動導致 SSH 失敗加入重試邏輯、超時控制、失敗告警(發送 Slack/郵件)
binlog 目錄非標準路徑讀取 SHOW VARIABLES LIKE 'log_bin_basename' 動態獲取

進階:Ansible / SaltStack 替代方案

  • 用 Ansible mysql_binlog 模組或自定義 task,冪等、並行、可視化報表。
  • 結合 Prometheus 監控 mysql_binlog_size_bytes,觸發告警自動執行清理 Playbook。

備份配合

清理前務必確認 binlog 已備份(專用備份機 + 定時 mysqlbinlog --read-from-remote-server 遠程備份),滿足 PITR 需求。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved