PURGE BINARY LOGS 可行,百台節點逐台操作不現實。slavelist(每行一個從庫 IP/主機名)。SHOW SLAVE STATUS 取得 Master_Log_File(當前同步檔案)與 Master_Host(主庫位址)。PURGE MASTER LOGS TO '檔案名'。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' 動態獲取 |
mysql_binlog 模組或自定義 task,冪等、並行、可視化報表。mysql_binlog_size_bytes,觸發告警自動執行清理 Playbook。清理前務必確認 binlog 已備份(專用備份機 + 定時 mysqlbinlog --read-from-remote-server 遠程備份),滿足 PITR 需求。