用 VPS 建站最怕什么?不是被攻击,是没有备份。
很多新手第一次遇到数据丢失时才发现:原来这台 VPS 上的数据,没有任何备份。一旦出问题,几周的心血全没了。
这篇文章教你用 rsync + cron 实现 VPS 自动增量备份,每天凌晨 3 点自动把网站文件和数据库同步到另一台备份机(或云存储),全程不需要人工干预。
前置准备
| 项目 | 说明 |
|---|---|
| 源 VPS | 你的网站运行机器(需要备份的那台) |
| 目标存储 | 另一台 VPS、或云对象存储(OSS/COS) |
| 系统 | Linux(Ubuntu/Debian/CentOS 都支持) |
| 权限 | root 或 sudo 权限 |
本文以「备份到另一台 VPS」为例,步骤最简单,适合大多数人。
第一步:安装 rsync
rsync 是 Linux 下最常用的文件同步工具,备份增量、只传输变化的部分,速度快、占用带宽低。
在源 VPS 和目标 VPS 上都要安装:
# Ubuntu/Debian
sudo apt update
sudo apt install rsync -y
# CentOS
sudo yum install rsync -y
验证安装成功:
rsync --version
# 应该输出版本号,比如 rsync version 3.x.x
第二步:在目标 VPS 创建备份用户
不要用 root 账号做备份,创建专门的用户更安全。
在目标 VPS 上执行:
# 创建备份用户(用你喜欢的名字)
sudo adduser backup
# 创建备份存放目录
sudo mkdir -p /home/backup/vps-backup
sudo chown backup:backup /home/backup/vps-backup
在源 VPS 上测试能否连接目标 VPS:
# 测试 SSH 连接(用 backup 用户)
ssh -v backup@目标VPS的IP
# 如果能连上,说明网络通畅
重要:建议先在源 VPS 生成 SSH 密钥对,把公钥复制到目标 VPS,实现免密码登录,这样后面写脚本不需要明文存储密码。
生成密钥对并复制:
# 源 VPS 上执行
ssh-keygen -t rsa -b 4096
# 一路回车,不需要设密码
# 复制公钥到目标 VPS
ssh-copy-id backup@目标VPS的IP
测试免密码登录:
ssh backup@目标VPS的IP
# 应该直接登录,不需要输入密码
第三步:编写备份脚本
下面是一个完整的备份脚本,支持:
- 网站文件打包备份
- MySQL 数据库导出备份
- 增量同步到目标 VPS
- 自动删除 7 天前的旧备份(节省空间)
在源 VPS 上创建脚本文件:
sudo mkdir -p /opt/backup-scripts
sudo nano /opt/backup-scripts/backup.sh
复制以下内容,修改对应的变量:
#!/bin/bash
# ========== 配置区 ==========
# 目标 VPS 信息
TARGET_HOST="目标VPS的IP"
TARGET_USER="backup"
TARGET_PATH="/home/backup/vps-backup/源VPS名称"
# 源 VPS 网站目录(改成你的实际路径)
WEB_ROOT="/var/www"
# MySQL 配置(改成你的实际账号密码)
DB_HOST="localhost"
DB_USER="root"
DB_PASS="你的MySQL密码"
DB_NAME="你的数据库名"
# 备份保留天数
KEEP_DAYS=7
# 时间戳
DATE=$(date +%Y%m%d_%H%M%S)
BACKUP_DIR="/tmp/vps-backup-${DATE}"
# ========== 开始备份 ==========
echo "[$(date)] 开始 VPS 备份..."
# 创建临时备份目录
mkdir -p ${BACKUP_DIR}
# 1. 备份网站文件
echo "[$(date)] 打包网站文件..."
tar -czf ${BACKUP_DIR}/web_files_${DATE}.tar.gz -C / ${WEB_ROOT#/}
# 2. 备份 MySQL 数据库
if [ -n "${DB_NAME}" ]; then
echo "[$(date)] 导出数据库..."
mkdir -p ${BACKUP_DIR}/db
mysqldump -h${DB_HOST} -u${DB_USER} -p${DB_PASS} ${DB_NAME} | gzip > ${BACKUP_DIR}/db/${DB_NAME}_${DATE}.sql.gz
fi
# 3. 打包全部备份
echo "[$(date)] 打包备份文件..."
cd /tmp
tar -czf vps_backup_${DATE}.tar.gz vps-backup-${DATE}/
# 4. 传输到目标 VPS
echo "[$(date)] 传输到备份服务器..."
rsync -avz --progress \
-e "ssh -o StrictHostKeyChecking=no" \
/tmp/vps_backup_${DATE}.tar.gz \
${TARGET_USER}@${TARGET_HOST}:${TARGET_PATH}/
# 5. 删除本地临时文件
echo "[$(date)] 清理本地临时文件..."
rm -rf ${BACKUP_DIR} /tmp/vps_backup_${DATE}.tar.gz
# 6. 删除远程旧备份(保留最近 KEEP_DAYS 天)
echo "[$(date)] 清理远程旧备份(保留 ${KEEP_DAYS} 天)..."
ssh ${TARGET_USER}@${TARGET_HOST} "find ${TARGET_PATH}/ -name 'vps_backup_*.tar.gz' -mtime +${KEEP_DAYS} -delete"
echo "[$(date)] 备份完成!"
保存脚本后,赋予执行权限:
sudo chmod +x /opt/backup-scripts/backup.sh
第四步:设置定时任务(cron)
用 crontab 设置每天凌晨 3 点自动执行:
# 编辑 crontab
sudo crontab -e
# 在打开的编辑器里添加这一行:
0 3 * * * /opt/backup-scripts/backup.sh >> /var/log/vps-backup.log 2>&1
# 保存退出(按 Ctrl+X,然后按 Y 确认)
验证定时任务是否添加成功:
sudo crontab -l
# 应该看到刚才添加的行
第五步:测试备份是否正常工作
第一次建议手动运行一次脚本,验证备份流程没问题:
# 手动执行备份脚本
sudo /opt/backup-scripts/backup.sh
# 观察输出,如果最后显示 "备份完成!" 说明成功
然后到目标 VPS 上检查文件是否已经传过来:
# 在目标 VPS 上执行
ls -la /home/backup/vps-backup/
# 应该看到 tar.gz 备份文件
如果备份文件名能正常显示,说明整个流程跑通了。
恢复数据教程
万一哪天网站出问题了,从备份恢复很简单:
1. 下载备份文件到源 VPS:
# 在源 VPS 上执行
scp backup@目标VPS的IP:/home/backup/vps-backup/源VPS名称/vps_backup_20260525_030000.tar.gz /tmp/
2. 解压恢复网站文件:
cd /
tar -xzf /tmp/vps_backup_20260525_030000.tar.gz
# 解压后恢复 var/www 目录
3. 恢复数据库:
gunzip < /tmp/db/你的数据库名_20260525_030000.sql.gz | mysql -u root -p你的密码 数据库名
常见问题
Q:备份占太多硬盘怎么办?
A:脚本里已经设置了 KEEP_DAYS=7,会自动删除 7 天前的旧备份。如果还不够,可以改成 3 天,或者把目标存储换成 OSS(阿里云 OSS 最低 0.12 元/GB/月)。
Q:能用 1TB 这种大流量 VPS 当备份盘吗?
A:完全可以。RackNerd 有款 8GB 内存、150GB NVMe、20TB 流量的年付 $119,用来当备份机非常划算。RackNerd 大容量备份机
Q:我的 MySQL 没有密码怎么办?
A:建议先给数据库设密码,数据安全很重要。如果真的不想设,可以把脚本里的 -p${DB_PASS} 改成 -p(交互式输入)。
Q:备份失败了怎么办?
A:检查 /var/log/vps-backup.log 日志文件,看看哪一步出错。常见问题:
- SSH 免密码没配置好 → 重新做 ssh-copy-id
- 数据库名或密码错误 → 检查脚本里的配置
- 目标 VPS 磁盘满了 → 登录目标 VPS 手动清理旧备份
更进一步:云存储备份
如果你不想维护一台专门的备份 VPS,可以把备份传到云存储:
阿里云 OSS:
# 安装 ossutil
curl -O https://help.aliyun.com/document_detail/121869.html
# 配置好 OSS 后,用以下命令上传:
ossutil cp /tmp/vps_backup_xxx.tar.gz oss://你的bucket名/
腾讯云 COS:
# 安装 coscli
# 配置好后:
cos-cli cp /tmp/vps_backup_xxx.tar.gz cos://你的bucket名/
云存储的好处是更可靠、不依赖另一台 VPS,但多一层费用。
总结
| 步骤 | 做什么 |
|---|---|
| 1 | 安装 rsync(源和目标 VPS 都要装) |
| 2 | 创建备份用户 + 配置 SSH 免密码登录 |
| 3 | 编写 backup.sh 备份脚本 |
| 4 | 添加 cron 定时任务(每天 3 点执行) |
| 5 | 手动测试一次,确认备份正常 |
这套方案跑起来之后,你的数据每天自动增量备份,再也不用担心数据丢失。如果遇到问题,日志文件 /var/log/vps-backup.log 会告诉你哪里出了错。
免责声明:文中链接为联盟链接。通过本站链接购买你不会多花钱,本站可能获得少量佣金。感谢支持!
