3-2-1 备份原则

  • 3:保留 3 份备份副本
  • 2:使用 2 种不同存储介质(本地 + 远程)
  • 1:至少有 1 份异地备份

自动备份脚本

#!/bin/bash
# backup.sh — 网站文件和数据库自动备份
set -euo pipefail

# === 配置 ===
SITE_DIR="/var/www/example.com"
DB_NAME="wordpress"
DB_USER="root"
DB_PASS="your_password"
BACKUP_DIR="/var/backups"
RETENTION_DAYS=30
DATE=$(date +%Y%m%d_%H%M%S)

# 远程存储配置(可选)
RCLONE_REMOTE="s3:bucket-name/backups"

# === 1. 创建备份目录 ===
mkdir -p "$BACKUP_DIR/files" "$BACKUP_DIR/database"

# === 2. 备份文件(排除缓存目录) ===
echo ">>> Backing up files..."
tar -czf "$BACKUP_DIR/files/files_$DATE.tar.gz" \
  --exclude="wp-content/cache" \
  --exclude="wp-content/uploads/backupwp" \
  --exclude="node_modules" \
  --exclude=".git" \
  -C "$SITE_DIR" .

# === 3. 备份数据库 ===
echo ">>> Backing up database..."
mysqldump -u "$DB_USER" -p"$DB_PASS" "$DB_NAME" \
  --single-transaction --quick --lock-tables=false \
  | gzip > "$BACKUP_DIR/database/db_$DATE.sql.gz"

# === 4. 删除超过保留期的本地备份 ===
echo ">>> Cleaning old backups..."
find "$BACKUP_DIR/files" -name "*.tar.gz" -mtime +$RETENTION_DAYS -delete
find "$BACKUP_DIR/database" -name "*.sql.gz" -mtime +$RETENTION_DAYS -delete

# === 5. 同步到远程存储(可选) ===
if command -v rclone &>/dev/null; then
    echo ">>> Syncing to remote storage..."
    rclone sync "$BACKUP_DIR" "$RCLONE_REMOTE" --progress
fi

# === 6. 验证备份 ===
echo ">>> Verifying backup integrity..."
tar -tzf "$BACKUP_DIR/files/files_$DATE.tar.gz" > /dev/null && echo "Files backup OK"
zcat "$BACKUP_DIR/database/db_$DATE.sql.gz" | head -1 > /dev/null && echo "Database backup OK"

echo "=== Backup complete: $DATE ==="

Crontab 配置

# 每天凌晨 3 点执行备份
0 3 * * * /usr/local/bin/backup.sh >> /var/log/backup.log 2>&1

# 每周日删除 30 天前的备份(已在脚本中自动处理)

恢复步骤

# 恢复文件
tar -xzf /var/backups/files/files_20260713_030001.tar.gz -C /var/www/example.com/

# 恢复数据库
mysql -u root -p"$PASSWORD" db_name < db_20260713_030001.sql
# 或
gunzip < /var/backups/database/db_20260713_030001.sql.gz | mysql -u root -p"$PASSWORD" db_name

备份策略建议

数据类型 备份频率 保留时间 备份方式
网站文件 每日 30 天 增量或全量
数据库 每日 30 天 mysqldump
配置文件 每次变更 90 天 Git 仓库
日志文件 每周 180 天 logrotate
完整快照 每月 12 个月 服务商快照

安全注意事项

  1. 备份文件包含敏感数据,确保权限为 600
  2. 远程存储需要加密(使用服务商提供的加密或 GPG)
  3. 定期测试恢复流程——没有经过恢复验证的备份不是真正的备份
  4. 将备份脚本和密钥分开存储