定期備份是保護資料最重要的措施。本文說明如何撰寫備份腳本、設定排程自動執行,以及使用 rclone 將備份同步至遠端儲存空間。
建立備份腳本
- 建立備份目錄與腳本:
mkdir -p /opt/backups nano /opt/backups/backup.sh - 寫入以下內容:
#!/bin/bash # ============================================ # 自動備份腳本 — 網站檔案 + MySQL 資料庫 # ============================================ # 設定 BACKUP_DIR="/opt/backups" DATE=$(date +%Y%m%d_%H%M%S) KEEP_DAYS=7 # MySQL 設定(建議改用 ~/.my.cnf 儲存帳密) DB_NAME="your_database" DB_USER="your_db_user" DB_PASS="your_db_password" # 備份網站檔案 echo "[$(date)] 開始備份網站檔案..." tar -czf ${BACKUP_DIR}/web_${DATE}.tar.gz /var/www/ 2>/dev/null # 備份資料庫 echo "[$(date)] 開始備份資料庫..." mysqldump -u${DB_USER} -p${DB_PASS} ${DB_NAME} | \ gzip > ${BACKUP_DIR}/db_${DATE}.sql.gz # 刪除超過保留天數的舊備份 echo "[$(date)] 清理 ${KEEP_DAYS} 天前的舊備份..." find ${BACKUP_DIR} -name "web_*.tar.gz" -mtime +${KEEP_DAYS} -delete find ${BACKUP_DIR} -name "db_*.sql.gz" -mtime +${KEEP_DAYS} -delete echo "[$(date)] 備份完成!" ls -lh ${BACKUP_DIR}/ - 設定腳本執行權限:
chmod +x /opt/backups/backup.sh - 手動測試執行:
/opt/backups/backup.sh
設定 Cron 排程
使用 crontab 設定每天凌晨 3 點自動執行備份:
- 編輯 crontab:
crontab -e - 在最後加入以下行:
0 3 * * * /opt/backups/backup.sh >> /opt/backups/backup.log 2>&1 - 確認排程已設定:
crontab -l
Cron 時間格式說明:分 時 日 月 星期,0 3 * * * 代表每天凌晨 3:00。
使用 rclone 同步至遠端
僅在本機備份不夠安全,建議使用 rclone 將備份同步至遠端儲存(如 S3、Google Drive、Backblaze B2 等)。
- 安裝 rclone:
curl https://rclone.org/install.sh | bash - 設定遠端儲存空間:
rclone config依照互動式引導選擇儲存服務(例如 S3、Google Drive),並完成授權。
- 測試同步:
# 將備份目錄同步至遠端(remote-name 為您在 rclone config 中設定的名稱) rclone sync /opt/backups remote-name:backup-bucket/vps-backups - 加入備份腳本中,在備份完成後自動同步:
# 在 backup.sh 最後加入 echo "[$(date)] 開始同步至遠端..." rclone sync ${BACKUP_DIR} remote-name:backup-bucket/vps-backups \ --transfers 4 --checkers 8 echo "[$(date)] 遠端同步完成!"
驗證備份可還原
備份只有在能成功還原時才有價值。建議定期測試還原流程:
- 還原網站檔案(至測試目錄):
mkdir -p /tmp/restore-test tar -xzf /opt/backups/web_最新日期.tar.gz -C /tmp/restore-test/ - 還原資料庫(至測試資料庫):
mysql -u root -p -e "CREATE DATABASE restore_test;" gunzip < /opt/backups/db_最新日期.sql.gz | mysql -u root -p restore_test - 確認資料完整後,清除測試資料:
rm -rf /tmp/restore-test mysql -u root -p -e "DROP DATABASE restore_test;"
重要提醒:至少每季測試一次還原流程,確保備份確實可用。