傳統備份流程:本地壓縮 → 傳輸遠端。風險:週期性備份間隙若發生故障,binlog 遺失;且無法備份正在寫入的活躍 binlog。MySQL 5.6+ 引入 mysqlbinlog --read-from-remote-server,支援即時拉取遠端 binlog,本質相當於一個只接收 binlog 的 Slave。
mysqlbinlog --read-from-remote-server --raw \
--host=192.168.244.145 --port=3306 \
--user=repl --password=repl \
--stop-never mysql-bin.000001
| 參數 | 作用 |
|---|---|
--read-from-remote-server | 從遠端 Server 讀取 binlog(預設讀本地) |
--raw | 以二進位格式寫檔(預設輸出文本) |
--stop-never | 持續追蹤新生成的 binlog,不自動結束 |
--user | 需具備 REPLICATION SLAVE 權限的帳號 |
mysql-bin.000001 | 起始 binlog 檔案 |
--stop-never-slave-server-id:指定偽裝的 slave server-id(預設 -1)。--to-last-log:隱含於 --stop-never,持續獲取後續 binlog。--result-file=/backup/prefix-:自訂本地儲存前綴,目錄需以 / 結尾。缺陷:連線中斷不會自動重連(原生 Slave 會自動重連)。
解決:Shell 死迴圈守護進程,斷線 10 秒後自動重連並從最新本地 binlog 續傳。
#!/bin/sh
BACKUP_BIN=/usr/bin/mysqlbinlog
LOCAL_BACKUP_DIR=/backup/binlog/
BACKUP_LOG=/backup/binlog/backuplog
REMOTE_HOST=192.168.244.145
REMOTE_PORT=3306
REMOTE_USER=repl
REMOTE_PASS=repl
FIRST_BINLOG=mysql-bin.000001
SLEEP_SECONDS=10
mkdir -p ${LOCAL_BACKUP_DIR}
cd ${LOCAL_BACKUP_DIR}
while :; do
if [ `ls -A "${LOCAL_BACKUP_DIR}" | wc -l` -eq 0 ]; then
LAST_FILE=${FIRST_BINLOG}
else
LAST_FILE=`ls -l ${LOCAL_BACKUP_DIR} | grep -v backuplog | tail -n 1 | awk '{print $9}'`
fi
${BACKUP_BIN} --raw --read-from-remote-server --stop-never \
--host=${REMOTE_HOST} --port=${REMOTE_PORT} \
--user=${REMOTE_USER} --password=${REMOTE_PASS} ${LAST_FILE}
echo "`date +'%Y/%m/%d %H:%M:%S'` mysqlbinlog停止,返回碼:$?" | tee -a ${BACKUP_LOG}
echo "${SLEEP_SECONDS}秒後重新連線..." | tee -a ${BACKUP_LOG}
sleep ${SLEEP_SECONDS}
done
--raw 時,事件先存記憶體,每 4KB 刷盤一次;斷線時立即刷盤。--raw(文本模式)則即時寫檔,但 --result-file 必須指定完整檔名而非目錄。此方案適合作為 binlog 異地歸檔補充,核心業務仍建議部署真實 Slave 或使用 XtraBackup 物理備份。