單一腳本支援三種運作模式,涵蓋從「首次建立遠端庫」到「日常本地/遠端備份」的完整生命週期:
first:首次執行,在遠端主機建立同名資料庫local:本地備份,壓縮存放於指定目錄,保留上一版mysqldump | mysql 直接同步至遠端# 遠端主機
REMOTE_HOST="192.168.1.100"
REMOTE_PASSWORD="RemoteRootPass!"
# 本地設定
DB_PATH="/var/lib/mysql"
LOCAL_PASSWORD="LocalRootPass!"
DB_BACKUP_PATH="/root/db_backup"
NO_BACKUP_DB="test information_schema performance_schema sys"
#!/bin/bash
# 掃描本地資料目錄下的每個資料庫
for db in $(ls $DB_PATH); do
[[ -d $DB_PATH/$db ]] || continue
# 排除檢查
skip=0
for n in $NO_BACKUP_DB; do [[ $db == $n ]] && skip=1; done
[[ $skip -eq 1 ]] && { echo "[$db] 跳過備份"; continue; }
case "$1" in
first)
echo -n "[$db] 首次在遠端建庫... "
mysqladmin -h $REMOTE_HOST -p$REMOTE_PASSWORD create $db && echo "成功" || { echo "失敗"; exit 1; }
;;
local)
[[ -d $DB_BACKUP_PATH ]] || mkdir -p $DB_BACKUP_PATH
[[ -f $DB_BACKUP_PATH/$db.gz ]] && mv $DB_BACKUP_PATH/$db.gz $DB_BACKUP_PATH/$db.1.gz
mysqldump -p$LOCAL_PASSWORD $db | gzip > $DB_BACKUP_PATH/$db.gz
echo "[$db] 本地備份完成"
;;
*)
echo -n "[$db] 遠端同步... "
mysqldump --add-drop-table -p$LOCAL_PASSWORD $db | mysql -h $REMOTE_HOST -p$REMOTE_PASSWORD $db
echo "完成"
;;
esac
done
/usr/local/sbin/mysql_dual_backup.sh,chmod +xmysql_dual_backup.sh first(在遠端建立所有庫)mysql_dual_backup.sh local(crontab 每天凌晨)mysql_dual_backup.sh(crontab 每小時/按需)--defaults-extra-file=/root/.mysql_remote.cnf、--defaults-extra-file=/root/.mysql_local.cnfCREATE、INSERT、UPDATE、DELETE、DROP 權限於特定庫--ssl-mode=REQUIRED雙機互備僅解決「資料同步」,無法替代「時間點恢復」。生產環境請疊加:
log_bin、binlog_format=ROW、expire_logs_days=7)mysqldump --master-data=2 --single-transaction + 定時 mysqlbinlog 歸檔 Binlog一個支援 first|local|remote 三模式的腳本,能覆蓋 MySQL 雙機互備的大部分需求。但請記住:**同步 ≠ 備份**。唯有「全量 + Binlog + 異地 + 定期演練」才能構成完整的資料保護體系。