網站資料 (程式碼 + 資料庫) 定期備份是營運基礎。本文提供一個生產可用的 Shell 腳本,實現每日全量備份網站目錄與 MySQL/MariaDB 資料庫,並自動清理超過保留天數的舊備份,最後配置 cron 定時執行。
/root/backup_web.sh#!/bin/bash
# ========== 設定區 ==========
WEB_ROOT="/var/www/html"
DB_NAME="mydb"
DB_USER="root"
DB_PASS="StrongPassword" # 建議改用 .my.cnf 或密鑰管理
BACKUP_DIR="/backup/web"
RETENTION_DAYS=14
DATE=$(date +%F)
# =============================
set -euo pipefail
mkdir -p "$BACKUP_DIR"
# 1. 清理舊備份
find "$BACKUP_DIR" -type f -mtime +$RETENTION_DAYS -name "web_*.tar.gz" -delete
find "$BACKUP_DIR" -type f -mtime +$RETENTION_DAYS -name "db_*.sql.gz" -delete
# 2. 備份網站檔案
tar -czf "$BACKUP_DIR/web_${DATE}.tar.gz" -C "$(dirname "$WEB_ROOT")" "$(basename "$WEB_ROOT")"
# 3. 備份資料庫 (單一資料庫)
mysqldump -u"$DB_USER" -p"$DB_PASS" --single-transaction --routines --triggers "$DB_NAME" | \
gzip > "$BACKUP_DIR/db_${DATE}.sql.gz"
# 4. 驗證備份完整性
if [[ -s "$BACKUP_DIR/web_${DATE}.tar.gz" && -s "$BACKUP_DIR/db_${DATE}.sql.gz" ]]; then
echo "[$(date)] 備份成功: web_${DATE}.tar.gz, db_${DATE}.sql.gz"
else
echo "[$(date)] 備份失敗!檔案為空" >&2
exit 1
fi
chmod 700 /root/backup_web.sh
chown root:root /root/backup_web.sh
# 建議將 DB 密碼存入 ~/.my.cnf (chmod 600) 而非腳本明文
# 每天凌晨 02:30 執行 (避開流量尖峰)
30 2 * * * root /root/backup_web.sh >> /var/log/backup_web.log 2>&1
寫入 /etc/cron.d/backup_web (需 root) 或 crontab -e (root 使用者)。
rsync -avz /backup/web/ user@offsite:/backup/web/。gpg --symmetric --cipher-algo AES256 backup.tar.gz。rsnapshot、restic、borgbackup 節省空間。# 列出備份
ls -lh /backup/web/
# 還原網站
tar -xzf /backup/web/web_2024-01-15.tar.gz -C /var/www/html --strip-components=1
# 還原資料庫
gunzip -c /backup/web/db_2024-01-15.sql.gz | mysql -u root -p mydb
定期演練還原流程,才能確保備份真正可用。