
为什么必须自己管理 VPS 备份
VPS 与共享主机的一个关键区别在于由谁负责备份。共享主机通常由服务商为您自动备份。而 VPS 因为您拥有完整的 Root 权限和对整个环境的全面控制,备份责任完全由您承担。
硬件故障、安全漏洞和人为失误都可能发生。扎实的备份策略才能让您在任何情况下都能快速恢复。
3-2-1 备份法则:保留 3 份数据副本,存储在 2 种不同介质上,其中 1 份异地存储。这是全球 IT 专业人员公认的行业标准建议。
方法一:使用 tar/gzip 手动备份
最基础的方式是手动压缩您的网站文件和数据库导出文件。
备份网站文件
tar -czf /backup/webfiles-$(date +%Y%m%d).tar.gz /var/www/html
备份 MySQL 数据库
mysqldump -u root -p --all-databases > /backup/db-$(date +%Y%m%d).sql
gzip /backup/db-$(date +%Y%m%d).sql
请先创建 /backup 目录,并确保有足够的磁盘空间。
方法二:通过 rsync 同步到远程服务器
rsync 可高效地将文件同步到远程目标,仅传输变更的数据,节省时间和带宽:
rsync -avz --delete /var/www/html/ user@remote-server:/backup/www/
使用 SSH 密钥认证,使 rsync 在计划任务中无人值守运行时无需输入密码。
Linux VPS 常用备份工具
除 tar 和 rsync 之外,还有几款专用工具可让备份管理更可靠、更易于大规模维护。
Duplicati
Duplicati 是一款带有 Web 图形界面的开源备份工具。它支持 30 多种目标类型,包括 SFTP、Amazon S3、Google Drive 和 Backblaze B2。所有数据在上传前均已加密,即使存储账户遭到入侵,备份文件也无法被读取。
# 在 Ubuntu/Debian 上安装 Duplicati
apt-get install mono-runtime libmono-2.0-dev
wget https://github.com/duplicati/duplicati/releases/download/v2.0.8.1/duplicati_2.0.8.1-1_all.deb
dpkg -i duplicati_2.0.8.1-1_all.deb
systemctl enable duplicati && systemctl start duplicati
BorgBackup(borg)
BorgBackup 专注于块级去重——仅存储实际发生变化的数据块。对于每天部分更新的大型数据库,这使其存储效率极高。
# 安装并初始化 Borg 仓库
apt-get install borgbackup
borg init --encryption=repokey /backup/borg-repo
# 创建每日归档
borg create /backup/borg-repo::backup-{now:%Y-%m-%d} /var/www/html /etc
# 列出所有归档
borg list /backup/borg-repo
Rclone — 同步到云存储
Rclone 可将 VPS 文件同步到 40 多个云存储服务商,包括 AWS S3、Google Cloud Storage、Wasabi 和 Cloudflare R2。它是满足 3-2-1 备份法则"异地"要求的推荐工具。
# 安装 Rclone
curl https://rclone.org/install.sh | sudo bash
# 配置远端(例如 S3 兼容存储)
rclone config
# 将备份目录同步到存储桶
rclone sync /backup s3:your-bucket-name/vps-backup/ --progress
| 工具 | 去重功能 | 图形界面 | 云端支持 | 适用场景 |
|---|---|---|---|---|
| tar + cron | 无 | 无 | 通过 rclone | 初学者,最简单的配置 |
| rsync | 文件级 | 无 | 通过 VPN/SSH | 接近实时的文件同步 |
| BorgBackup | 块级 | 无 | 通过 SFTP | 最大化存储效率 |
| Duplicati | 有 | Web 界面 | 30+ 服务商 | 非技术用户 |
| Rclone | 无 | 无 | 40+ 服务商 | 异地云端副本 |
方法三:快照(如果服务商支持)
快照捕获 VPS 在某一时间点的完整状态,包括操作系统、应用程序和所有数据,可一次性恢复所有内容。
- 非常适合重大事故后的整机恢复
- 占用存储空间多于文件级备份
- 请向您的 VPS 服务商确认是否支持快照功能
方法四:自动化计划任务
手动备份容易遗忘。通过计划任务自动化备份,让其按计划无需人工干预地运行:
打开 crontab:crontab -e
每晚 02:00 运行:
0 2 * * * tar -czf /backup/web-$(date +\%Y\%m\%d).tar.gz /var/www/html
0 2 * * * mysqldump -u root -pYOURPASS --all-databases | gzip > /backup/db-$(date +\%Y\%m\%d).sql.gz
正确备份 MySQL 数据库
数据库是最难恢复的资产。静态 HTML 文件可以从源码重建,但订单、用户账户和应用程序状态等数据一旦丢失便无可挽回。
完整 MySQL 导出
# Dump all databases in one operation
mysqldump -u root -p --all-databases --single-transaction \
--routines --triggers --events \
> /backup/full-db-$(date +%Y%m%d_%H%M).sql
# Compress immediately to save disk space
gzip /backup/full-db-$(date +%Y%m%d_%H%M).sql
单个数据库备份
# 备份单个数据库
mysqldump -u root -p --single-transaction \
my_wordpress_db | gzip > /backup/wp-db-$(date +%Y%m%d).sql.gz
# 恢复
gunzip < /backup/wp-db-20260608.sql.gz | mysql -u root -p my_wordpress_db
创建专用 MySQL 备份用户
不要在备份脚本中使用 root 账户,而应创建一个仅拥有备份所需权限的专用 MySQL 用户。这样即使脚本或凭证遭到入侵,也能将风险降到最低。
CREATE USER 'backup_user'@'localhost' IDENTIFIED BY 'StrongPassHere';
GRANT SELECT, LOCK TABLES, SHOW VIEW, EVENT, TRIGGER ON *.* TO 'backup_user'@'localhost';
FLUSH PRIVILEGES;
关键提示:备份 InnoDB 表时务必使用 --single-transaction。它可在不锁表的情况下创建一致性快照,使您的网站在备份期间仍能正常接受请求,实现零停机备份。
自动清理旧备份
不进行清理,备份文件最终会占满磁盘。添加计划任务条目,删除 30 天以前的文件:
0 3 * * * find /backup -name "*.tar.gz" -mtime +30 -delete
0 3 * * * find /backup -name "*.sql.gz" -mtime +30 -delete
备份告警与监控
静默失败的备份与没有备份一样危险。设置告警可确保您在备份流程出现问题时立即知晓。
通过备份脚本发送邮件通知
#!/bin/bash
# backup-with-alert.sh
BACKUP_FILE="/backup/web-$(date +%Y%m%d).tar.gz"
ADMIN_EMAIL="[email protected]"
tar -czf "$BACKUP_FILE" /var/www/html 2>&1
if [ $? -eq 0 ]; then
SIZE=$(du -sh "$BACKUP_FILE" | cut -f1)
echo "Backup succeeded: $BACKUP_FILE ($SIZE)" | \
mail -s "[VPS] Backup OK $(date +%Y-%m-%d)" "$ADMIN_EMAIL"
else
echo "Backup FAILED — please investigate immediately." | \
mail -s "[VPS] BACKUP FAILED $(date +%Y-%m-%d)" "$ADMIN_EMAIL"
fi
验证备份文件大小
备份文件过小通常意味着发生了错误。添加大小检查以尽早发现此类情况:
#!/bin/bash
BACKUP_FILE="/backup/web-$(date +%Y%m%d).tar.gz"
MIN_SIZE=1048576 # 1MB in bytes
if [ -f "$BACKUP_FILE" ]; then
ACTUAL_SIZE=$(stat -c%s "$BACKUP_FILE")
if [ "$ACTUAL_SIZE" -lt "$MIN_SIZE" ]; then
echo "Warning: backup file is unusually small ($ACTUAL_SIZE bytes)" | \
mail -s "[VPS] Backup size warning" [email protected]
fi
fi
| 监控级别 | 方式 | 响应时间 |
|---|---|---|
| 基础 | 计划任务发送邮件 | 任务执行后 |
| 中级 | 邮件 + 文件大小检查 | 24 小时内 |
| 高级 | Healthchecks.io 心跳 + PagerDuty | 几分钟内 |
定期测试恢复流程
从未测试过的备份等同于不可信任的备份。至少每月在预发布环境中执行一次恢复测试,以验证备份文件完整且恢复流程正常。
温馨提示:如果您希望无需自行管理即可自动备份,AsiaGB 共享主机每月包含两次备份,起价仅需 500 泰铢/年。