Featured image of post VPS数据自动备份教程:每天自动把网站和数据库备份到远程

VPS数据自动备份教程:每天自动把网站和数据库备份到远程

用 3 步把 VPS 上的网站数据和 MySQL 数据库自动备份到另一台 VPS 或云存储,再也不怕数据丢失。附 rsync + cron 完整脚本,新手照做即可。

用 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 会告诉你哪里出了错。


免责声明:文中链接为联盟链接。通过本站链接购买你不会多花钱,本站可能获得少量佣金。感谢支持!