最后更新于:2026年7月

VPS 备份与灾难恢复
VPS 备份与灾难恢复:数据安全的最后一道防线

你的 VPS 数据安全吗? 服务器崩溃、硬盘损坏、误操作删除、服务商跑路——这些风险随时可能发生。根据统计,70% 的小型企业在遭遇数据丢失后无法恢复业务,而定期备份的企业恢复率高达 95%。

备份不是"可有可无"的工作,而是"必须做"的事情。本文将带你建立一套完整的备份体系,从策略制定到自动化执行,再到灾难恢复,确保你的数据万无一失。


一、备份策略:3-2-1 法则

1.1 什么是 3-2-1 法则?

3-2-1 法则是业界公认的备份黄金标准:

PLAINTEXT
3 → 至少 3 份数据副本
2 → 至少 2 种不同的存储介质
1 → 至少 1 份异地备份

具体解释:

层级说明示例
原始数据生产环境中的数据VPS 上的数据库和文件
副本 1同机房/同服务器备份本地硬盘备份
副本 2不同存储介质备份外部硬盘/NAS
副本 3异地备份云存储/异地服务器

1.2 备份类型选择

备份类型说明优点缺点适用场景
完全备份备份所有数据恢复快占用空间大、时间长每周/每月一次
增量备份只备份变化的数据速度快、省空间恢复需要多份备份每天一次
差异备份备份上次完全备份后变化的数据恢复比增量快空间比增量大每天一次

推荐组合:

PLAINTEXT
每周日:完全备份(全量)
周一至周六:增量备份(只备份变化)
每月底:异地完全备份

1.3 备份频率策略

数据类型变更频率备份频率保留时间
数据库高频每小时/每天7-30 天
网站文件中频率每天7-30 天
配置文件低频每周90 天
系统镜像低频每月6 个月

二、本地备份方案

2.1 rsync 增量备份

rsync 是 Linux 下最强大的备份工具:

BASH
# 安装 rsync
apt install rsync -y

# 基本用法:同步目录
rsync -av --delete /source/ /destination/

# 增量备份到本地目录
rsync -av --delete --link-dest=/backup/previous /data /backup/current

创建本地备份脚本:

BASH
#!/bin/bash

BACKUP_DIR="/backup"
SOURCE_DIR="/var/www"
DATE=$(date +%Y%m%d_%H%M%S)
KEEP_DAYS=7

# 创建备份目录
mkdir -p $BACKUP_DIR/$DATE

# 增量备份(硬链接方式)
rsync -av \
  --delete \
  --link-dest=$BACKUP_DIR/latest \
  $SOURCE_DIR/ \
  $BACKUP_DIR/$DATE/

# 更新 latest 链接
rm -rf $BACKUP_DIR/latest
ln -s $DATE $BACKUP_DIR/latest

# 清理过期备份
find $BACKUP_DIR -maxdepth 1 -type d -mtime +$KEEP_DAYS -exec rm -rf {} \;

echo "备份完成:$BACKUP_DIR/$DATE"

2.2 tar 压缩备份

适合一次性打包备份:

BASH
# 创建压缩备份
tar -czvf backup_$(date +%Y%m%d).tar.gz /var/www /etc /home

# 查看备份内容
tar -tzvf backup_20260707.tar.gz

# 解压备份
tar -xzvf backup_20260707.tar.gz -C /tmp/restore

分卷备份(大文件):

BASH
# 分卷备份(每卷 1GB)
tar -czvf - /data | split -b 1G - backup_$(date +%Y%m%d).tar.gz.part

# 合并恢复
cat backup_20260707.tar.gz.part* | tar -xzvf -

2.3 数据库备份

MySQL/MariaDB 备份:

BASH
# 安装备份工具
apt install mariadb-client -y

# 单次备份
mysqldump -u root -p --all-databases > backup_$(date +%Y%m%d).sql

# 压缩备份
mysqldump -u root -p --all-databases | gzip > backup_$(date +%Y%m%d).sql.gz

# 备份单个数据库
mysqldump -u root -p dbname > dbname_$(date +%Y%m%d).sql

MySQL 自动备份脚本:

BASH
#!/bin/bash

DB_USER="root"
DB_PASS="your_password"
BACKUP_DIR="/backup/mysql"
DATE=$(date +%Y%m%d_%H%M%S)
KEEP_DAYS=7

mkdir -p $BACKUP_DIR

# 备份所有数据库
mysqldump -u$DB_USER -p$DB_PASS --all-databases \
  --single-transaction \
  --quick \
  --lock-tables=false \
  | gzip > $BACKUP_DIR/all_databases_$DATE.sql.gz

# 备份单个数据库(可选)
# mysqldump -u$DB_USER -p$DB_PASS mydb | gzip > $BACKUP_DIR/mydb_$DATE.sql.gz

# 清理过期备份
find $BACKUP_DIR -name "*.sql.gz" -mtime +$KEEP_DAYS -exec rm -f {} \;

echo "MySQL 备份完成:$BACKUP_DIR/all_databases_$DATE.sql.gz"

PostgreSQL 备份:

BASH
# 备份所有数据库
pg_dumpall > backup_$(date +%Y%m%d).sql

# 压缩备份
pg_dumpall | gzip > backup_$(date +%Y%m%d).sql.gz

# 备份单个数据库
pg_dump dbname > dbname_$(date +%Y%m%d).sql

三、异地备份方案

3.1 rsync 远程备份

备份到远程服务器:

BASH
# 基础用法
rsync -av /local/data user@remote:/remote/backup

# 使用 SSH 密钥免密登录
rsync -av -e ssh /local/data user@remote:/remote/backup

# 增量备份到远程
rsync -av --delete --link-dest=/remote/backup/latest /local/data user@remote:/remote/backup/current

自动远程备份脚本:

BASH
#!/bin/bash

LOCAL_DIR="/var/www"
REMOTE_USER="backup"
REMOTE_HOST="backup.example.com"
REMOTE_DIR="/backup/server1"
DATE=$(date +%Y%m%d_%H%M%S)

# 远程增量备份
rsync -av \
  -e "ssh -i /root/.ssh/backup_key" \
  --delete \
  --link-dest=$REMOTE_DIR/latest \
  $LOCAL_DIR/ \
  $REMOTE_USER@$REMOTE_HOST:$REMOTE_DIR/$DATE/

# 更新远程 latest 链接
ssh -i /root/.ssh/backup_key $REMOTE_USER@$REMOTE_HOST \
  "rm -f $REMOTE_DIR/latest && ln -s $DATE $REMOTE_DIR/latest"

echo "远程备份完成:$REMOTE_HOST:$REMOTE_DIR/$DATE"

3.2 云存储备份

使用 rclone 备份到云存储:

BASH
# 安装 rclone
curl https://rclone.org/install.sh | sudo bash

# 配置云存储(支持 Google Drive、Dropbox、OneDrive、阿里云等)
rclone config

# 备份到云存储
rclone copy /backup remote:backup/server1

# 同步(删除远程多余文件)
rclone sync /backup remote:backup/server1

# 查看远程文件
rclone ls remote:backup/server1

常用云存储配置:

云存储优点缺点推荐度
Google Drive免费 15GB,容量大需要科学上网⭐⭐⭐⭐
Dropbox稳定可靠免费空间小⭐⭐⭐
OneDrive免费 5GB,国内访问好同步速度慢⭐⭐⭐⭐
阿里云 OSS国内速度快付费⭐⭐⭐⭐⭐
腾讯云 COS国内速度快付费⭐⭐⭐⭐⭐
Backblaze B2价格便宜国内访问慢⭐⭐⭐

3.3 对象存储备份(S3 兼容)

BASH
# 使用 s3cmd(需要配置)
s3cmd sync /backup/ s3://my-backup-bucket/server1/

# 使用 aws-cli(AWS S3)
aws s3 sync /backup/ s3://my-backup-bucket/server1/

# 使用 rclone(支持所有 S3 兼容存储)
rclone sync /backup/ s3:my-backup-bucket/server1/

四、加密备份

4.1 加密备份文件

使用 GPG 加密:

BASH
# 生成密钥对(第一次使用)
gpg --gen-key

# 加密文件
gpg -e -r "Your Name" backup.sql.gz

# 解密文件
gpg -d backup.sql.gz.gpg > backup.sql.gz

# 对称加密(不需要密钥对)
gpg -c backup.sql.gz  # 设置密码
gpg -d backup.sql.gz.gpg  # 输入密码解密

加密备份脚本:

BASH
#!/bin/bash

BACKUP_FILE="backup_$(date +%Y%m%d).tar.gz"
GPG_RECIPIENT="backup@example.com"

# 创建备份并加密
tar -czvf - /var/www | gpg -e -r $GPG_RECIPIENT -o $BACKUP_FILE.gpg

# 删除未加密的备份
rm -f $BACKUP_FILE

echo "加密备份完成:$BACKUP_FILE.gpg"

4.2 加密远程传输

使用 SSH 隧道(自动加密):

BASH
# rsync 通过 SSH 传输(自动加密)
rsync -av -e ssh /local/data user@remote:/remote/backup

# SSH 端口转发(加密传输)
ssh -L 5432:localhost:5432 user@remote

使用 VPN 加密传输:

BASH
# WireGuard VPN(加密所有流量)
wg-quick up myvpn
rsync -av /local/data user@remote:/remote/backup
wg-quick down myvpn

五、自动化备份方案

5.1 使用 cron 定时备份

编辑 crontab:

BASH
crontab -e

添加定时任务:

BASH
# 每天凌晨 2 点:网站文件增量备份
0 2 * * * /usr/local/bin/backup_files.sh >> /var/log/backup_files.log 2>&1

# 每天凌晨 3 点:数据库备份
0 3 * * * /usr/local/bin/backup_mysql.sh >> /var/log/backup_mysql.log 2>&1

# 每周日凌晨 4 点:完全备份并上传到云存储
0 4 * * 0 /usr/local/bin/backup_full.sh >> /var/log/backup_full.log 2>&1

# 每月 1 号凌晨 5 点:异地完全备份
0 5 1 * * /usr/local/bin/backup_remote.sh >> /var/log/backup_remote.log 2>&1

Cron 时间格式:

PLAINTEXT
分钟(0-59) 小时(0-23) 日期(1-31) 月份(1-12) 星期(0-7) 命令

5.2 备份监控与告警

检查备份是否成功:

BASH
#!/bin/bash

BACKUP_LOG="/var/log/backup_files.log"
LAST_BACKUP=$(tail -1 $BACKUP_LOG)

if echo "$LAST_BACKUP" | grep -q "备份完成"; then
    echo "备份成功"
else
    # 发送告警通知
    curl -s "https://api.telegram.org/botYOUR_BOT_TOKEN/sendMessage?chat_id=YOUR_CHAT_ID&text=VPS%20备份失败!%20请检查。"
fi

添加到 crontab:

BASH
# 每天凌晨 6 点检查备份状态
0 6 * * * /usr/local/bin/check_backup.sh

5.3 完整自动化备份脚本

BASH
#!/bin/bash

# ============================================
# VPS 自动备份脚本(3-2-1 策略)
# ============================================

# 配置
BACKUP_DIR="/backup"
SOURCE_DIRS="/var/www /etc /home"
DB_USER="root"
DB_PASS="your_password"
REMOTE_HOST="backup.example.com"
REMOTE_USER="backup"
REMOTE_DIR="/backup/server1"
KEEP_LOCAL=7
KEEP_REMOTE=30
DATE=$(date +%Y%m%d_%H%M%S)

# 颜色
RED='\033[0;31m'
GREEN='\033[0;32m'
NC='\033[0m'

echo "========== 开始备份 ($DATE) =========="

# 1. 创建本地备份目录
mkdir -p $BACKUP_DIR/$DATE/files
mkdir -p $BACKUP_DIR/$DATE/database

# 2. 文件备份
echo "[$(date)] 正在备份文件..."
for dir in $SOURCE_DIRS; do
    rsync -av --delete $dir/ $BACKUP_DIR/$DATE/files/$(basename $dir)/
done

# 3. 数据库备份
echo "[$(date)] 正在备份数据库..."
mysqldump -u$DB_USER -p$DB_PASS --all-databases \
    --single-transaction --quick \
    | gzip > $BACKUP_DIR/$DATE/database/all_databases.sql.gz

# 4. 更新本地 latest 链接
rm -rf $BACKUP_DIR/latest
ln -s $DATE $BACKUP_DIR/latest

# 5. 清理本地过期备份
echo "[$(date)] 清理本地过期备份..."
find $BACKUP_DIR -maxdepth 1 -type d -mtime +$KEEP_LOCAL -exec rm -rf {} \;

# 6. 上传到远程服务器
echo "[$(date)] 上传到远程服务器..."
rsync -av -e ssh $BACKUP_DIR/$DATE/ $REMOTE_USER@$REMOTE_HOST:$REMOTE_DIR/$DATE/
ssh $REMOTE_USER@$REMOTE_HOST "rm -f $REMOTE_DIR/latest && ln -s $DATE $REMOTE_DIR/latest"

# 7. 清理远程过期备份
echo "[$(date)] 清理远程过期备份..."
ssh $REMOTE_USER@$REMOTE_HOST "find $REMOTE_DIR -maxdepth 1 -type d -mtime +$KEEP_REMOTE -exec rm -rf {} \;"

# 8. 备份到云存储(可选)
echo "[$(date)] 备份到云存储..."
rclone sync $BACKUP_DIR/$DATE/ remote:backup/server1/$DATE/

echo -e "${GREEN}========== 备份完成 ==========${NC}"
echo "本地备份:$BACKUP_DIR/$DATE"
echo "远程备份:$REMOTE_HOST:$REMOTE_DIR/$DATE"
echo "云存储备份:remote:backup/server1/$DATE"

使用方法:

BASH
chmod +x backup_321.sh
cp backup_321.sh /usr/local/bin/
crontab -e
# 添加:0 2 * * * /usr/local/bin/backup_321.sh >> /var/log/backup_321.log 2>&1

六、灾难恢复实战

6.1 恢复流程概述

PLAINTEXT
灾难发生 → 评估损失 → 选择恢复方案 → 执行恢复 → 验证 → 监控

恢复方案选择:

灾难类型恢复方案恢复时间
文件误删除从本地备份恢复分钟级
数据库损坏从数据库备份恢复分钟-小时级
系统崩溃从系统镜像恢复小时级
机房宕机从异地备份恢复到新服务器小时-天级

6.2 文件恢复

从本地备份恢复:

BASH
# 查看备份内容
ls /backup/latest/files/

# 恢复单个文件
rsync -av /backup/latest/files/var/www/index.html /var/www/

# 恢复整个目录
rsync -av /backup/latest/files/var/www/ /var/www/

从远程备份恢复:

BASH
# 恢复到本地
rsync -av user@remote:/remote/backup/latest/files/ /var/www/

6.3 数据库恢复

MySQL 恢复:

BASH
# 停止数据库服务
systemctl stop mariadb

# 恢复数据库
gzip -d backup_20260707.sql.gz
mysql -u root -p < backup_20260707.sql

# 启动数据库服务
systemctl start mariadb

# 验证
mysql -u root -p -e "SHOW DATABASES;"

增量恢复(如果使用增量备份):

BASH
# 先恢复完全备份
mysql -u root -p < full_backup.sql

# 再应用增量备份(使用 mysqlbinlog)
mysqlbinlog binlog.000001 binlog.000002 | mysql -u root -p

6.4 系统级恢复

从系统镜像恢复:

BASH
# 创建系统镜像(灾难发生前)
dd if=/dev/vda of=/backup/system_image.img

# 恢复系统镜像(灾难发生后)
dd if=/backup/system_image.img of=/dev/vda

使用 Clonezilla 恢复:

BASH
# 备份系统
clonezilla live -> savedisk -> local_disk

# 恢复系统
clonezilla live -> restoredisk -> local_disk

6.5 异地灾备恢复

完整异地恢复流程:

BASH
# 步骤 1:购买新 VPS
# 步骤 2:安装基础系统
# 步骤 3:安装必要软件(nginx, mysql, php 等)
# 步骤 4:从异地备份恢复数据

# 恢复文件
rsync -av user@remote:/remote/backup/latest/files/ /var/www/

# 恢复数据库
gzip -d /tmp/all_databases.sql.gz
mysql -u root -p < /tmp/all_databases.sql

# 步骤 5:配置服务
# 步骤 6:验证恢复
# 步骤 7:切换域名 DNS

七、备份验证与监控

7.1 备份验证

验证备份文件完整性:

BASH
# 使用 md5sum 验证
md5sum backup_20260707.tar.gz > backup_20260707.tar.gz.md5

# 验证
md5sum -c backup_20260707.tar.gz.md5

验证数据库备份:

BASH
# 检查 SQL 文件是否有效
mysql -u root -p --check-only --force < backup.sql > /dev/null 2>&1
if [ $? -eq 0 ]; then
    echo "数据库备份有效"
else
    echo "数据库备份无效!"
    exit 1
fi

定期恢复测试:

BASH
# 每月一次恢复测试
1. 在测试服务器上恢复最近的备份
2. 验证数据完整性
3. 测试应用是否正常运行
4. 记录恢复时间

7.2 备份监控

监控指标:

指标说明告警条件
备份成功率备份是否成功完成< 100%
备份时间备份耗时> 预期时间 2 倍
备份大小备份文件大小异常波动 > 30%
磁盘空间备份目录剩余空间< 20%
远程连接远程备份是否可达连接失败

监控工具:

BASH
# 安装监控工具
apt install monit -y

Monit 配置示例:

INI
# /etc/monit/conf.d/backup

check process backup with pidfile /var/run/backup.pid
    start program = "/usr/local/bin/backup_321.sh"
    stop program = "/bin/kill -TERM `cat /var/run/backup.pid`"
    if failed host backup.example.com port 22 for 3 cycles then alert
    if space usage > 80% for 3 cycles then alert

八、备份工具推荐

8.1 开源备份工具

工具用途特点推荐度
rsync文件同步备份增量同步,速度快⭐⭐⭐⭐⭐
tar文件打包备份简单可靠,兼容性好⭐⭐⭐⭐⭐
duplicity加密增量备份支持多种后端,自动加密⭐⭐⭐⭐
Bacula企业级备份功能强大,配置复杂⭐⭐⭐
BorgBackup压缩加密备份去重压缩,加密存储⭐⭐⭐⭐
restic安全高效备份去重,加密,支持多种后端⭐⭐⭐⭐⭐

8.2 商业备份服务

服务特点价格推荐度
Backblaze B2价格便宜,无限带宽$5/TB/月⭐⭐⭐⭐⭐
Carbonite自动备份,易用起价 $6/月⭐⭐⭐
CrashPlan无限存储$10/月⭐⭐⭐⭐
Acronis全功能,含恢复起价 $5/月⭐⭐⭐⭐

8.3 云存储服务

服务特点免费额度推荐度
Google Drive容量大,Google 生态15GB⭐⭐⭐⭐
OneDrive微软生态,国内访问好5GB⭐⭐⭐⭐
阿里云 OSS国内速度快,API 丰富试用⭐⭐⭐⭐⭐
腾讯云 COS国内速度快,价格合理试用⭐⭐⭐⭐⭐
Cloudflare R2无出口流量费10GB⭐⭐⭐⭐

九、常见问题与解决方案

Q1:备份文件太大怎么办?

解决方案:

Q2:备份占用太多磁盘空间怎么办?

解决方案:

Q3:备份过程中数据变化怎么办?

解决方案:

Q4:异地备份传输太慢怎么办?

解决方案:

Q5:备份恢复失败怎么办?

解决方案:


十、总结

备份策略总结

PLAINTEXT
核心原则:3-2-1 法则
- 3 份数据副本
- 2 种存储介质
- 1 份异地备份

备份频率:
- 数据库:每小时/每天
- 文件:每天
- 系统:每周/每月

备份类型:
- 每周:完全备份
- 每日:增量备份
- 每月:异地完全备份

验证:
- 定期验证备份完整性
- 每月进行恢复测试
- 监控备份状态

一键备份脚本获取

BASH
# 下载备份脚本
curl -O https://raw.githubusercontent.com/example/backup-scripts/main/backup_321.sh
chmod +x backup_321.sh

# 配置脚本
vim backup_321.sh

# 添加到定时任务
crontab -e
# 添加:0 2 * * * /path/to/backup_321.sh >> /var/log/backup.log 2>&1

最后的提醒

备份的唯一价值在于恢复。 定期验证你的备份是否能正常恢复,比任何完美的备份策略都重要。


【相关推荐】


备份是数据安全的最后一道防线。建立完善的备份体系,不是在"浪费时间",而是在"节省未来的时间"。祝你数据安全,万无一失!🔒

版权声明

作者: 易邦

链接: https://blog.e8k.net/posts/vps-backup-disaster-recovery-2026/

许可证: 知识共享署名-非商业性使用-相同方式共享 4.0 国际许可协议

本作品采用知识共享署名-非商业性使用-相同方式共享 4.0 国际许可协议进行许可。