萬盛學電腦網

您现在的位置: 萬盛學電腦網 >> 作業系統 >  >> Linux 教學

雙機/多機自動互備份方案:Shell + FTP + tar + MySQL + crontab 實戰腳本

針對雙單磁碟 Linux 伺服器架構,設計一套低成本、全自動的異地互備方案。主機 (host) 每日打包應用檔案與 MySQL 資料庫,透過 FTP 推送至備份機 (ship);備份機同步拉取並保留多版本。採用 Shell 腳本 + crontab 實現,無需額外軟體授權。

一、 架構角色定義

角色主機名IP職責備份時間
主機 (生產)host192.168.1.10產生備份、推送至 ship每日 03:00
備份機 (異地)ship192.168.1.20接收備份、保留歷史版本每日 06:00

前提:兩機系統時間差 < 1 小時 (NTP 同步);ship 建立專用帳號 backup_user,僅允許 FTP/SFTP 登入,目錄 /home/backup_user 配置足夠磁碟配額。

二、 主機備份腳本 /root/scripts/backup_host.sh


#!/bin/bash
# ========== 設定區 ==========
HOST="ship.mydomain.com"
USER="backup_user"
PASS="StrongPassword123"
LOCAL_BACKUP_DIR="/backup/host"
REMOTE_BACKUP_DIR="/home/backup_user/host"
MYSQL_USER="root"
MYSQL_PASS="MySqlRootPass"
MYSQL_DBS="--all-databases"
DATE=$(date +%Y%m%d_%H%M)
DOW=$(date +%u)  # 1-7 (Mon-Sun)
# ============================

mkdir -p "$LOCAL_BACKUP_DIR"

# 1. 應用檔案完整備份 (每週一) / 增量備份 (其餘)
if [ "$DOW" -eq 1 ]; then
    tar -czpf "$LOCAL_BACKUP_DIR/app_full_$DATE.tar.gz" /var/www/html /etc/httpd/conf /opt/app
    FULL_FILE="app_full_$DATE.tar.gz"
else
    # 增量:找上次完整備份時間戳
    LAST_FULL=$(ls -t "$LOCAL_BACKUP_DIR"/app_full_*.tar.gz 2>/dev/null | head -1)
    if [ -n "$LAST_FULL" ]; then
        tar -czpf "$LOCAL_BACKUP_DIR/app_incr_$DATE.tar.gz" -N "$(date -r "$LAST_FULL" +%Y-%m-%d)" /var/www/html /etc/httpd/conf /opt/app
    else
        tar -czpf "$LOCAL_BACKUP_DIR/app_full_$DATE.tar.gz" /var/www/html /etc/httpd/conf /opt/app
    fi
fi

# 2. MySQL 邏輯備份 (每日完整)
mysqldump -u"$MYSQL_USER" -p"$MYSQL_PASS" $MYSQL_DBS --single-transaction --routines --triggers --events | gzip > "$LOCAL_BACKUP_DIR/mysql_$DATE.sql.gz"

# 3. 透過 FTP 上傳至 ship (使用 lftp 支援腳本化、斷點續傳)
lftp -u "$USER","$PASS" "$HOST" <> /var/log/backup_host.log

三、 備份機拉取腳本 /root/scripts/pull_backup.sh (備援/雙向同步)


#!/bin/bash
# ship 主動從 host 拉取 (若 host 推送失敗)
HOST="host.mydomain.com"
USER="backup_user"
PASS="StrongPassword123"
REMOTE_DIR="/home/backup_user/host"
LOCAL_DIR="/backup/ship"

lftp -u "$USER","$PASS" "$HOST" <> /var/log/pull_backup.log

四、 Crontab 排程

host (生產機):crontab -e


0 3 * * * /root/scripts/backup_host.sh >/dev/null 2>&1

ship (備份機):


0 6 * * * /root/scripts/pull_backup.sh >/dev/null 2>&1

五、 關鍵安全強化

  1. FTP 改用 SFTP/SCP:lftp sftp://user:pass@host 或 rsync -avz -e ssh /backup/host/ user@ship:/home/backup_user/host/ (需 SSH 金鑰免密登入)。
  2. MySQL 密碼不寫腳本:使用 --defaults-extra-file=/root/.my.cnf (權限 600),[client] user=root password=...。
  3. 備份加密:tar ... | gpg --symmetric --cipher-algo AES256 --passphrase-file /root/.gpg_pass > backup.tar.gz.gpg。
  4. 驗證完整性:備份後生成 sha256sum 清單,定期抽樣驗證。
  5. 監控告警:腳本回傳非 0 碼時發送郵件/Slack/Telegram 告警。

六、 擴展:增量備份與 rsync 方案

若資料量大 (TB 級),tar 全量備份耗時過長。改用 rsync 增量同步:


rsync -avz --delete --link-dest=/backup/host/latest /var/www/html/ user@ship:/home/backup_user/host/current/
# --link-dest 硬連結未變更檔案,極省空間與時間
# 完成後更新 latest 符號連結指向 current

配合 rsnapshot 或 borgbackup (去重、壓縮、加密) 獲得企業級備份體驗。

七、 總結

本方案以 Shell + crontab 為核心,整合 tar、mysqldump、lftp/rsync,實現雙機異地自動互備。關鍵在於:時間同步、權限最小化、傳輸加密、保留策略、完整性驗證、失效告警 六大支柱。隨業務增長,建議遷移至專業備份軟體 (Veeam, Commvault, Borg, Restic) 獲得去重、即時快照、合規報表等進階能力。

copyright © 萬盛學電腦網 all rights reserved