VPS 数据备份实战:从手动备份到自动化异地容灾一次讲清


很多站长把网站跑起来之后,最关心的往往是访问量和排名,却很少有人真正在意服务器上那些数据的安全。直到某天磁盘损坏、机房故障、被人误删数据库,或者手滑把一张重要的表清空了,才猛然意识到:网站可以重新搭,数据丢了就真的什么都没了。备份这件事,平时看不出任何价值,真到需要它的那天,就是救命稻草。本文按真实操作顺序,把 VPS 备份从手动打包、数据库导出,到自动化定时备份、异地容灾,一次讲清。

一、备份到底要备什么

动手备份之前,先想清楚一件事:你的 VPS 上,什么东西是丢了就找不回来的?

  • 数据库:博客文章、用户账号、订单记录、配置数据,几乎无法重建,是备份的重中之重。
  • 网站程序源码:虽然能从安装包重新装,但你改过的主题、二次开发的插件、自定义代码丢了就很麻烦。
  • 上传文件:图片附件、用户上传的文件、下载资源,一旦丢失不可恢复。
  • 配置文件:Nginx 站点配置、.env 环境变量、crontab 定时任务,虽然内容不多,但重建起来非常耗时。

很多人以为"我网站不大,手动下载一份就行了"。但对一台 24 小时在线的服务器来说,手动备份最大的问题不是繁琐,而是"懒"——今天拖明天,明天拖下周,等到真出事那天,发现最后一次备份还是三个月前的。所以,备份一定要自动化。

二、手动备份:先学会把数据打包

自动化之前,先手动跑通一次完整流程,确认每一步都正确。以常见的宝塔 + Nginx + MySQL 环境为例,网站数据一般在 /www/wwwroot/ 目录,数据库用 mysqldump 导出。

先把网站目录打包成 tar.gz 归档:

tar -czf /backup/site-$(date +%Y%m%d).tar.gz /www/wwwroot/你的站点目录

再把数据库导出来,注意数据库名和用户名密码按你自己的情况替换:

mysqldump -u用户名 -p密码 数据库名 | gzip > /backup/db-$(date +%Y%m%d).sql.gz

导出完成后,用 ls -lh /backup/ 看一眼文件大小,确认归档内容完整、压缩正常。这一步建议手动跑一遍,把报错全部解决掉,再进入下一步自动化。

三、自动化备份:crontab + Shell 脚本

手动流程跑通之后,把它写成一个脚本,交给系统定时任务去执行。新建 /root/backup.sh,内容大致如下:

#!/bin/bash
BACKUP_DIR="/backup"
DATE=$(date +%Y%m%d)
# 备份网站目录
tar -czf $BACKUP_DIR/site-$DATE.tar.gz /www/wwwroot/你的站点目录
# 备份数据库
mysqldump -u用户名 -p密码 数据库名 | gzip > $BACKUP_DIR/db-$DATE.sql.gz
# 只保留最近 7 份,自动清理旧备份
ls -t $BACKUP_DIR/site-*.tar.gz | tail -n +8 | xargs -r rm -f
ls -t $BACKUP_DIR/db-*.sql.gz | tail -n +8 | xargs -r rm -f

给脚本加执行权限,并手动运行一次验证:

chmod +x /root/backup.sh
bash /root/backup.sh

确认没有报错后,加入 crontab,让它每天凌晨自动执行:

crontab -e
# 每天凌晨 3 点执行备份
0 3 * * * /root/backup.sh >> /root/backup.log 2>&1

这里把输出重定向到了日志文件,方便事后检查任务是否成功执行。脚本里"只保留最近 7 份"的逻辑很重要——不清理的话,磁盘迟早被备份文件占满,反而把服务器拖垮。

四、异地备份:把备份"送"出去

本地备份解决的是"误删、手滑"的问题,但解决不了"服务器挂了、机房出故障"的问题。如果备份文件跟源站放在同一台机器上,硬盘坏了,备份也跟着没了。所以,真正的容灾要求备份必须"异地"存放,至少不在同一台服务器、最好不在同一个机房。

常用的异地备份方式有三种:

  • 对象存储:腾讯云 COS、阿里云 OSS、Cloudflare R2 等都有免费额度,用 rclone 或命令行工具把备份传上去,是最省心的方案。
  • 另一台 VPS:用 scp 或 rsync 把备份推到另一台便宜的小机器上,注意目标机器要配置好密钥认证,避免交互输入密码。
  • 本地电脑:下载到自己电脑或 NAS 上,适合数据量不大的个人站,但记得本地也要留一份。

以 rsync 推送到另一台服务器为例:

rsync -avz --remove-source-files /backup/ user@备份机IP:/backup/

把这条命令追加到 backup.sh 末尾,每天的备份就会自动同步到异地。对个人站长来说,对象存储免费额度通常完全够用,性价比最高,强烈推荐。

五、灾难恢复:关键时刻别掉链子

备份做得再好,恢复练得少,出事时照样抓瞎。建议每季度做一次完整的恢复演练:开一台临时 VPS,把备份下载下来,重新导入数据库、还原网站目录,确认站点能正常访问。流程并不复杂:

# 解压网站目录
tar -xzf site-20261028.tar.gz -C /www/wwwroot/
# 恢复数据库
gunzip -c db-20261028.sql.gz | mysql -u用户名 -p密码 数据库名

演练的意义在于:提前发现备份里的坑——比如备份不完整、数据库导出少了几张表、密码过期、脚本路径写错。真到灾难发生时才发现问题,代价就太大了。

六、几个容易踩的坑

  • 别备份日志:access.log、error.log 这类日志增长飞快,又没必要恢复,一定要在 tar 打包时排除,否则备份体积会失控。
  • 敏感数据要加密:数据库里可能有用户密码、支付信息,备份文件建议用 gpg 加密或放到私有存储桶,设置好访问权限。
  • 密码别硬编码在脚本里:mysqldump 的密码直接写在脚本中,一旦服务器被入侵,等于把数据库钥匙也交出去了。可以考虑使用 mysql_config_editor 或配置文件方式管理。
  • 备份失败没人知道:自动化定时任务偶尔会因为磁盘满、网络异常等原因失败,建议搭配上一期讲过的监控告警,给备份任务加一道"成功才安心、失败就告警"的保险。

总结

备份这件事,投入的成本很低,回报却可能是一次完整的数据失而复得。记住几个关键点:数据库和源码都要备、备份必须自动化、异地再存一份、定期做恢复演练。把这条链路搭好之后,你就可以安心睡觉了——哪怕明天服务器整个宕掉,数据也还在,网站随时能原地复活。


手机扫码阅读

微信或手机浏览器扫一扫,随时随地随心阅读与分享

-

VPS 数据备份实战:从手动备份到自动化异地容灾一次讲清

评 论