VPS 数据备份与恢复完整指南 2026

💡 重要提醒: 没有备份策略的服务器就是在裸奔。硬盘故障、误操作、黑客入侵,任何一项都可能让几个月甚至几年的工作成果瞬间消失。备份是你唯一的保险。
本文将带你从最简单的 rsync 开始,一直到企业级的 BorgBackup 增量备份方案,覆盖:
- ✅ 文件级增量备份
- ✅ 数据库完整备份
- ✅ Docker 数据卷备份
- ✅ 系统级快照还原
- ✅ 自动化定时任务
- ✅ 异地容灾方案
一、备份策略的 3-2-1 原则
在开始之前,先记住业界公认的黄金备份原则:
| 要素 | 含义 | 说明 |
|---|---|---|
| 3 份副本 | 原始数据 + 2 份备份 | 不要把鸡蛋放在同一个篮子 |
| 2 种介质 | 本地 + 异地 + 云端 | 硬盘、对象存储、另一台服务器 |
| 1 份离线 | 至少 1 份离线保存 | 防止勒索软件一锅端 |
实战建议:
VPS 服务器
↓ (每日 rsync 增量)
NAS / 外部硬盘 (本地备份)
↓ (每周 BorgBackup 加密)
对象存储 (S3 / OSS / Backblaze) (异地备份)
↓ (每月一次)
冷存储 / 离线硬盘 (离线备份)二、基础工具:rsync 入门
2.1 什么是 rsync?
rsync 是 Linux 世界最经典的文件同步工具,特点:
- ✅ 增量同步:只传输变化的部分
- ✅ 支持压缩:传输时自动压缩
- ✅ 保留权限:完整保留文件权限、时间戳
- ✅ 支持远程:通过 SSH 同步到远程服务器
- ✅ 断点续传:中断后可继续
2.2 基础语法
# 基本格式
rsync [选项] 源 目标
# 本地备份
rsync -av /home/user/data/ /mnt/backup/user-data/
# 远程备份(推送到远端)
rsync -av /home/user/data/ user@backup-server:/mnt/backup/
# 远程备份(从远端拉取)
rsync -av user@source-server:/home/data/ /local/backup/2.3 常用参数详解
| 参数 | 含义 | 典型使用场景 |
|---|---|---|
-a | 归档模式,保留所有属性 | 几乎所有备份场景 |
-v | 详细输出,显示传输过程 | 调试、日常使用 |
-z | 传输时压缩数据 | 网络带宽有限时 |
-h | 人类可读的数字格式 | 配合 -v |
--delete | 删除目标中已不存在于源的文件 | 做镜像同步时用 |
--dry-run | 仅测试,不实际传输 | 执行前先测试 |
--progress | 显示传输进度 | 大文件传输时 |
--exclude | 排除指定文件/目录 | 排除缓存、临时文件 |
2.4 实用示例
# 完整备份 home 目录到外部硬盘
rsync -avh --progress \
--exclude='node_modules' \
--exclude='.cache' \
--exclude='*.log' \
/home/your-user/ \
/mnt/external-drive/backup/home/
# 测试运行(只显示将要做什么)
rsync -avh --dry-run --progress /source/ /destination/
# 远程备份到备份服务器(通过 SSH)
rsync -avzh \
-e 'ssh -p 22' \
--exclude='node_modules' \
/var/www/ \
backupuser@192.168.1.100:/mnt/backup/www/2.5 备份脚本(入门级)
#!/bin/bash
# 文件名: backup-daily.sh
# 作用: 每日增量备份重要目录
# ===== 配置 =====
SOURCE_DIRS="/home /etc /var/www /var/log"
DEST_DIR="/mnt/backup/daily"
DATE=$(date +%Y-%m-%d)
LOG_FILE="/var/log/backup-$DATE.log"
# ===== 执行备份 =====
echo "[$(date +'%Y-%m-%d %H:%M:%S')] 开始备份..." >> $LOG_FILE
for dir in $SOURCE_DIRS; do
echo "正在备份: $dir" >> $LOG_FILE
rsync -avh \
--exclude='node_modules' \
--exclude='.git' \
--exclude='*.log' \
$dir \
$DEST_DIR/ >> $LOG_FILE 2>&1
done
echo "[$(date +'%Y-%m-%d %H:%M:%S')] 备份完成" >> $LOG_FILE保存后赋权并测试:
chmod +x backup-daily.sh
./backup-daily.sh三、企业级方案:BorgBackup
3.1 为什么选择 BorgBackup?
| 特性 | rsync | BorgBackup |
|---|---|---|
| 增量备份 | ✅ 简单增量 | ✅ 去重增量(仅存变更块) |
| 压缩 | ✅ 传输时 | ✅ 存储时 + 传输时 |
| 加密 | ❌(依赖 SSH) | ✅ AES-256 端到端加密 |
| 去重 | ❌ | ✅ 跨备份全局去重 |
| 快照 | ❌ | ✅ 自动创建时间点快照 |
| 恢复点 | 单个最新版本 | 多个历史版本 |
3.2 安装 BorgBackup
# Debian / Ubuntu
sudo apt update && sudo apt install -y borgbackup
# CentOS / RHEL
sudo dnf install -y epel-release
sudo dnf install -y borgbackup
# 验证安装
borg --version3.3 初始化备份仓库
# 初始化本地仓库(会提示设置密码)
borg init --encryption=repokey /mnt/backup/my-borg-repo
# 初始化远程仓库
borg init --encryption=repokey ssh://backupuser@192.168.1.100:/mnt/backup/my-repo
# 无密码(仅本地测试用)
borg init --encryption=none /mnt/backup/test-repo加密方式选择:
| 方式 | 适用场景 | 特点 |
|---|---|---|
repokey | 推荐 | 密钥存在仓库中,用密码保护 |
keyfile | 极高安全需求 | 密钥存在本地 ~/.config/borg/ |
authenticated | 只防篡改不加密 | 可信任存储环境 |
none | 仅测试 | 无任何安全措施 |
3.4 创建备份
# 创建一个备份快照
borg create --stats --progress \
/mnt/backup/my-borg-repo::$(hostname)-$(date +%Y-%m-%d-%H%M%S) \
/home /etc /var/www /var/log
# 带排除列表的完整备份
borg create --stats --progress --compression zstd \
--exclude 'node_modules' \
--exclude '.git' \
--exclude '*.log' \
--exclude '*.pyc' \
--exclude '/home/*/.cache' \
/mnt/backup/my-borg-repo::server1-$(date +%Y-%m-%d) \
/home /etc /var/www /opt3.5 查看和管理备份
# 列出所有备份
borg list /mnt/backup/my-borg-repo
# 查看某个备份的文件列表
borg list /mnt/backup/my-borg-repo::server1-2026-06-15
# 查看备份信息
borg info /mnt/backup/my-borg-repo
borg info /mnt/backup/my-borg-repo::server1-2026-06-15
# 比较两个备份的差异
borg diff /mnt/backup/my-borg-repo::server1-2026-06-14 server1-2026-06-153.6 恢复文件
# 方法一:挂载备份(推荐)
borg mount /mnt/backup/my-borg-repo::server1-2026-06-15 /mnt/borg-mount
# 现在你可以像普通目录一样浏览和复制文件
ls /mnt/borg-mount/
cp /mnt/borg-mount/home/user/important-file.txt /home/user/
# 卸载
borg umount /mnt/borg-mount
# 方法二:直接提取文件
borg extract /mnt/backup/my-borg-repo::server1-2026-06-15 \
home/user/important-file.txt
# 方法三:完整恢复到指定目录
cd /tmp/restore
borg extract /mnt/backup/my-borg-repo::server1-2026-06-153.7 删除旧备份
# 删除指定备份
borg delete /mnt/backup/my-borg-repo::server1-2026-06-01
# 保留策略:保留最近 7 天每日 + 4 周 + 6 个月
borg prune --keep-daily=7 --keep-weekly=4 --keep-monthly=6 \
/mnt/backup/my-borg-repo
# 回收空闲空间
borg compact /mnt/backup/my-borg-repo3.8 完整的 BorgBackup 自动化脚本
#!/bin/bash
# 文件名: borg-backup.sh
# 作用: BorgBackup 全自动备份脚本
# ===== 配置 =====
export BORG_REPO='/mnt/backup/my-borg-repo'
export BORG_PASSPHRASE='你的加密密码-请用强密码-随机字符串'
BACKUP_PATHS='/home /etc /var/www /opt /root'
HOSTNAME=$(hostname)
DATE=$(date +%Y-%m-%d-%H%M%S)
LOG_FILE='/var/log/borg-backup.log'
# ===== 备份前检查 =====
echo "[$(date)] 开始备份 $HOSTNAME..." >> $LOG_FILE
# 检查仓库是否可访问
if ! borg info $BORG_REPO > /dev/null 2>&1; then
echo "[$(date)] 错误: 无法访问备份仓库 $BORG_REPO" >> $LOG_FILE
exit 1
fi
# ===== 创建备份 =====
borg create --stats --progress --compression zstd \
--exclude 'node_modules' \
--exclude '.git' \
--exclude '*.log' \
--exclude '*.pyc' \
--exclude '/home/*/.cache' \
--exclude '/tmp' \
--exclude '/var/tmp' \
--exclude '/proc' \
--exclude '/sys' \
--exclude '/dev' \
--exclude '/run' \
--exclude '/mnt' \
--exclude 'lost+found' \
::$HOSTNAME-$DATE \
$BACKUP_PATHS >> $LOG_FILE 2>&1
# ===== 清理旧备份 =====
borg prune --keep-daily=7 --keep-weekly=4 --keep-monthly=6 \
>> $LOG_FILE 2>&1
# ===== 回收空间 =====
borg compact >> $LOG_FILE 2>&1
# ===== 清理环境变量 =====
unset BORG_PASSPHRASE
echo "[$(date)] 备份完成" >> $LOG_FILE重要安全提醒: 包含密码的脚本权限必须设置为 700:
chmod 700 borg-backup.sh
chown root:root borg-backup.sh四、数据库备份
4.1 MySQL / MariaDB 备份
# 导出所有数据库(带时间戳)
mysqldump -u root -p \
--all-databases \
--single-transaction \
--quick \
--lock-tables=false \
| gzip > /mnt/backup/mysql/all-databases-$(date +%Y-%m-%d).sql.gz
# 导出单个数据库
mysqldump -u root -p db_name | gzip > backup/db_name-$(date +%Y-%m-%d).sql.gz
# 恢复数据库
gunzip < backup/db_name-2026-06-15.sql.gz | mysql -u root -p db_name自动化 MySQL 备份脚本:
#!/bin/bash
# mysql-backup.sh
DB_USER='backup_user'
DB_PASS='your-password'
BACKUP_DIR='/mnt/backup/mysql'
DATE=$(date +%Y-%m-%d-%H%M%S)
MAX_DAYS=30
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
# 删除 30 天前的备份
find $BACKUP_DIR -name "*.sql.gz" -type f -mtime +$MAX_DAYS -delete4.2 PostgreSQL 备份
# 备份所有数据库
pg_dumpall -U postgres | gzip > /mnt/backup/postgres/all-$(date +%Y-%m-%d).sql.gz
# 备份单个数据库
pg_dump -U postgres db_name | gzip > /mnt/backup/postgres/db_name-$(date +%Y-%m-%d).sql.gz
# 只备份结构
pg_dump -U postgres -s db_name > db-schema.sql
# 恢复
gunzip < backup.sql.gz | psql -U postgres4.3 SQLite 备份
# 方式一:使用 .backup 命令(推荐,安全且可在线备份)
sqlite3 /path/to/database.db ".backup /mnt/backup/sqlite/database-$(date +%Y-%m-%d).db"
# 方式二:直接复制文件(仅在数据库关闭时)
cp /path/to/database.db /mnt/backup/sqlite/database.db
# 验证备份完整性
sqlite3 /mnt/backup/sqlite/database.db ".tables"4.4 MongoDB 备份
# 完整备份
mongodump --uri "mongodb://localhost:27017" \
--out /mnt/backup/mongodb-$(date +%Y-%m-%d)
# 压缩备份
mongodump --uri "mongodb://localhost:27017" --archive \
| gzip > /mnt/backup/mongodb-$(date +%Y-%m-%d).gz
# 恢复
mongorestore /mnt/backup/mongodb-2026-06-15/
# 或从压缩包恢复
mongorestore --gzip --archive=/mnt/backup/mongodb-2026-06-15.gz4.5 Redis 备份
# 触发 BGSAVE(后台保存)
redis-cli BGSAVE
# 等待完成后复制 RDB 文件
sleep 5
cp /var/lib/redis/dump.rdb /mnt/backup/redis/dump-$(date +%Y-%m-%d).rdb
# 恢复 Redis 数据
systemctl stop redis-server
cp /mnt/backup/redis/dump-2026-06-15.rdb /var/lib/redis/dump.rdb
chown redis:redis /var/lib/redis/dump.rdb
systemctl start redis-server五、Docker 数据卷备份
5.1 数据卷手动备份
# 查看所有数据卷
docker volume ls
# 备份数据卷到 tar 文件
docker run --rm \
-v my-data-volume:/data \
-v /mnt/backup:/backup \
ubuntu:24.04 \
tar czf /backup/my-data-$(date +%Y-%m-%d).tar.gz /data
# 恢复数据卷
docker run --rm \
-v my-data-volume:/data \
-v /mnt/backup:/backup \
ubuntu:24.04 \
tar xzf /backup/my-data-2026-06-15.tar.gz -C /5.2 使用 docker-backup 工具
# 安装 docker-backup 脚本
curl -sL https://raw.githubusercontent.com/offen/docker-volume-backup/main/docker-volume-backup.sh \
| sudo tee /usr/local/bin/docker-backup
sudo chmod +x /usr/local/bin/docker-backup
# 备份所有数据卷
docker-backup backup --all --output /mnt/backup/docker-volumes/
# 备份指定数据卷
docker-backup backup db-data nginx-logs --output /mnt/backup/docker-volumes/5.3 自动化备份所有容器
#!/bin/bash
# docker-backup.sh
BACKUP_DIR='/mnt/backup/docker'
DATE=$(date +%Y-%m-%d)
MAX_DAYS=14
mkdir -p $BACKUP_DIR
# 获取所有数据卷
VOLUMES=$(docker volume ls -q)
for volume in $VOLUMES; do
echo "备份数据卷: $volume"
docker run --rm \
-v $volume:/data \
-v $BACKUP_DIR:/backup \
ubuntu:24.04 \
tar czf /backup/$volume-$DATE.tar.gz /data
done
# 删除过期备份
find $BACKUP_DIR -name "*.tar.gz" -type f -mtime +$MAX_DAYS -delete
# 备份镜像列表
docker images > $BACKUP_DIR/images-$DATE.txt
# 备份容器配置
docker ps -a --format 'table {{.Names}}\t{{.Image}}\t{{.Ports}}' > $BACKUP_DIR/containers-$DATE.txt5.4 使用 docker-compose 备份
# 停止容器(避免写入不一致)
docker-compose stop
# 备份数据卷
docker run --rm \
-v $(basename $(pwd))_db-data:/data \
-v /mnt/backup:/backup \
ubuntu:24.04 tar czf /backup/db-data-$(date +%Y-%m-%d).tar.gz /data
# 备份 compose 配置
cp docker-compose.yml /mnt/backup/docker-compose-$(date +%Y-%m-%d).yml
# 启动容器
docker-compose start六、系统级快照:Timeshift
6.1 Timeshift 是什么?
Timeshift 是一个系统级备份工具,类似 Windows 的系统还原点:
- ✅ 支持 Btrfs 原生快照
- ✅ 支持 rsync 增量备份
- ✅ 按计划自动创建快照
- ✅ 可从 Live CD 恢复
- ✅ 可在同一硬盘或外部硬盘存储
注意: Timeshift 主要备份系统文件,不建议备份用户数据(/home 目录)。
6.2 安装与初始化
# Debian / Ubuntu
sudo apt install -y timeshift
# 初始化(rsync 模式,适合大多数文件系统)
sudo timeshift --create --comments "初始备份" --tags M
# 查看备份位置
sudo timeshift --list6.3 常用操作
# 创建手动快照
sudo timeshift --create --comments "更新前备份" --tags D
# 列出所有快照
sudo timeshift --list
# 恢复快照
sudo timeshift --restore
# 删除快照
sudo timeshift --delete --snapshot '2026-06-15_08-00-01'
# 删除所有快照(谨慎使用)
sudo timeshift --delete-all6.4 配置自动定时备份
# 编辑 Timeshift 配置
sudo nano /etc/timeshift/timeshift.json
# 常见配置项:
# backup_device_uuid: 备份设备 UUID
# schedule_monthly: 每月备份数量
# schedule_weekly: 每周备份数量
# schedule_daily: 每日备份数量
# schedule_hourly: 每小时备份数量
# exclude: 排除目录列表典型排除列表:
{
"exclude": [
"/home/*",
"/root/*",
"/tmp/*",
"/var/log/*",
"/var/cache/*",
"/mnt/*",
"/media/*",
"/proc/*",
"/sys/*",
"/dev/*",
"/run/*",
"/var/lib/docker/*",
"node_modules",
".git"
]
}6.5 完整系统恢复流程
当系统无法启动时:
- 用 Ubuntu Live CD/USB 启动
- 安装 Timeshift:bash
sudo add-apt-repository -y ppa:teejee2008/ppa sudo apt update sudo apt install timeshift - 挂载备份所在的分区
- 启动 Timeshift,选择备份恢复
- 重启系统
七、自动化:crontab 定时任务
7.1 crontab 基础语法
# 打开 crontab 编辑器
crontab -e
# 查看当前任务
crontab -l
# 删除所有任务(谨慎)
crontab -r时间格式:
分 时 日 月 周 命令
* * * * * command-to-execute
│ │ │ │ │
│ │ │ │ └── 星期 (0-7,0=7=周日)
│ │ │ └─────── 月份 (1-12)
│ │ └──────────── 日期 (1-31)
│ └───────────────── 小时 (0-23)
└───────────────────── 分钟 (0-59)7.2 常用示例
# 每天凌晨 2 点执行每日备份
0 2 * * * /root/scripts/borg-backup.sh
# 每天凌晨 3 点备份数据库
0 3 * * * /root/scripts/mysql-backup.sh
# 每周日凌晨 4 点清理旧备份
0 4 * * 0 /root/scripts/backup-cleanup.sh
# 每小时检查备份状态(简单健康检查)
0 * * * * /root/scripts/check-backup-status.sh
# 每天凌晨 1 点执行完整系统备份
0 1 * * * /root/scripts/full-system-backup.sh
# 每周一凌晨 3 点执行大文件备份
0 3 * * 1 /root/scripts/big-files-backup.sh
# 每月 1 号凌晨 5 点归档
0 5 1 * * /root/scripts/monthly-archive.sh7.3 完整的 crontab 配置示例
# ================================================
# 备份任务配置
# ================================================
# 每日 BorgBackup 备份(凌晨 2:00)
0 2 * * * /root/scripts/borg-backup.sh >> /var/log/cron-backup.log 2>&1
# 每日数据库备份(凌晨 3:00)
0 3 * * * /root/scripts/mysql-backup.sh >> /var/log/cron-mysql.log 2>&1
# 每日 Docker 数据卷备份(凌晨 3:30)
30 3 * * * /root/scripts/docker-backup.sh >> /var/log/cron-docker.log 2>&1
# 每周清理旧备份(周日凌晨 4:00)
0 4 * * 0 find /mnt/backup -type f -name "*.tar.gz" -mtime +30 -delete >> /var/log/cron-cleanup.log 2>&1
# 每日系统快照(凌晨 1:00)
0 1 * * * timeshift --create --comments "每日自动快照" --tags D >> /var/log/cron-timeshift.log 2>&1
# 每月归档(每月 1 号凌晨 5:00)
0 5 1 * * /root/scripts/monthly-archive.sh >> /var/log/cron-monthly.log 2>&1
# ================================================
# 监控与报告
# ================================================
# 每小时检查磁盘空间
0 * * * * /root/scripts/check-disk-space.sh >> /var/log/cron-disk.log 2>&1八、异地容灾方案
8.1 使用 rclone 同步到云端
# 安装 rclone
curl https://rclone.org/install.sh | sudo bash
# 配置远程存储
rclone config
# 同步备份目录到 S3
rclone sync /mnt/backup/ s3:my-backup-bucket/backup/
# 同步到阿里云 OSS
rclone sync /mnt/backup/ oss:my-backup-bucket/backup/
# 同步到 Backblaze B2
rclone sync /mnt/backup/ b2:my-backup-bucket/backup/
# 查看远程文件
rclone ls s3:my-backup-bucket/backup/8.2 异地服务器备份
# 在备份服务器上准备好 SSH 免密钥登录
ssh-keygen -t rsa -b 4096
ssh-copy-id backupuser@remote-server.com
# 定时同步到异地服务器
rsync -avzh \
-e 'ssh -p 22' \
/mnt/backup/ \
backupuser@remote-server.com:/mnt/offsite-backup/8.3 完整的多层备份架构
VPS 服务器
│
├── 每日 rsync ─→ /mnt/backup/ 本地硬盘(快速恢复)
│
├── 每日 BorgBackup ─→ /mnt/borg-repo/ 增量备份(7 天/4 周/6 月)
│
├── 每日数据库备份 ─→ /mnt/backup/databases/ (SQL 压缩文件)
│
├── 每日 Docker 备份 ─→ /mnt/backup/docker/ (tar.gz)
│
└── 每周 rclone 同步 ─→ 云对象存储(S3/OSS)
│
└── 每月归档 ─→ 离线硬盘(冷存储)九、备份验证与测试
9.1 定期检查备份完整性
# 检查 BorgBackup 仓库完整性
borg check /mnt/backup/my-borg-repo
# 检查特定备份
borg check /mnt/backup/my-borg-repo::server1-2026-06-15
# 深度检查(较慢,建议每月一次)
borg check --verify-data /mnt/backup/my-borg-repo
# 检查 SQL 文件的完整性
gzip -t /mnt/backup/mysql/backup.sql.gz
# 或者解压后检查行数
gunzip -c /mnt/backup/mysql/backup.sql.gz | wc -l
# 检查 tar 归档
tar -tzf /mnt/backup/docker/my-data.tar.gz > /dev/null && echo "文件完整"9.2 测试恢复流程
每月至少执行一次完整恢复测试:
# 1. 创建测试恢复目录
mkdir -p /tmp/restore-test
# 2. 从 BorgBackup 中提取测试文件
cd /tmp/restore-test
borg extract /mnt/backup/my-borg-repo::server1-2026-06-14 \
home/user/test-file.txt
# 3. 验证文件内容
cat home/user/test-file.txt
# 4. 测试数据库恢复(在测试环境)
mysql -u root -ptest test_db < /mnt/backup/mysql/test-2026-06-14.sql
# 5. 测试 Docker 数据卷恢复
docker volume create test-restore
docker run --rm -v test-restore:/data -v /mnt/backup/docker:/backup \
ubuntu:24.04 tar xzf /backup/my-data-2026-06-14.tar.gz -C /
# 6. 清理测试文件
rm -rf /tmp/restore-test
docker volume rm test-restore9.3 监控磁盘空间
#!/bin/bash
# check-disk-space.sh
THRESHOLD=85 # 百分比阈值
BACKUP_DISK='/mnt/backup'
USAGE=$(df -h $BACKUP_DISK | tail -1 | awk '{print $5}' | tr -d '%')
if [ $USAGE -gt $THRESHOLD ]; then
echo "⚠️ 警告:$BACKUP_DISK 使用率已达 $USAGE%,超过阈值 $THRESHOLD%"
echo "建议清理旧备份或扩展存储空间"
# 这里可以添加邮件通知或其他告警
fi十、完整备份清单与最佳实践
10.1 必须备份的清单
| 项目 | 路径 | 频率 | 保留时长 |
|---|---|---|---|
| 系统配置 | /etc | 每日 | 30 天 |
| 网站数据 | /var/www | 每日 | 90 天 |
| 用户数据 | /home | 每日 | 永久 |
| 数据库 | MySQL/Postgres | 每日 | 90 天 |
| Docker 数据卷 | /var/lib/docker/volumes | 每日 | 30 天 |
| 日志 | /var/log | 每日 | 90 天 |
| 系统快照 | Timeshift | 每日/每周 | 30 天 |
| 完整镜像 | VPS 快照 | 每周 | 4 周 |
10.2 备份清单 Checklist
10.3 常见错误与避免方法
| 错误 | 后果 | 避免方法 |
|---|---|---|
| 只备份不验证 | 恢复时才发现备份损坏 | 定期执行恢复测试 |
| 备份在同一硬盘 | 硬盘损坏时一起丢失 | 使用独立磁盘/异地存储 |
| 备份路径包含备份目录 | 无限递归,耗尽磁盘 | 在脚本中排除备份目录 |
| 没有加密 | 数据泄露风险 | 使用 BorgBackup 加密或其他加密 |
| 备份未定期清理 | 磁盘空间被占满 | 设置 prune/过期策略 |
| 没有测试恢复流程 | 紧急时不知道怎么恢复 | 每月执行一次完整恢复练习 |
| 数据库热备份不一致 | 恢复后数据损坏 | 使用 mysqldump/pg_dump 等专用工具 |
结语
数据备份的本质是风险管理。你付出的是一些存储空间和自动化工作时间,换来的是数据安全的保障。
记住三个原则:
- 自动化:让备份自动运行,不要依赖人工操作
- 验证:定期测试恢复流程,确保备份有效
- 冗余:多位置、多介质存储,不要把鸡蛋放在一个篮子
现在就去设置你的备份! 数据只有在你失去它时才知道它有多珍贵。
推荐阅读:
- 系统优化设置指南 - 优化你的 VPS 性能
- Docker Compose 实战教程 - 容器化部署最佳实践
- Fail2ban 防爆破配置 - 保护你的服务器免受暴力破解
💾 提示: 最好的备份策略是——已经实施的策略。不要等到数据丢失了才开始备份。
延伸阅读
免责声明
本文仅供技术交流和学习参考。涉及第三方服务的链接可能包含 sponsored 标记,请自行核实服务条款、价格和可用性,并遵守当地法律法规。