VPS 数据备份实战:从手动备份到定时自动备份一次讲清


很多站长把网站部署上线之后,就再也没有管过服务器上的数据。直到某天手滑删了数据库、磁盘突然损坏、或者商家跑路连机器一起消失,才猛然发现所有的文章、评论、配置全都没了。服务器可以随时再买一台,但数据没了就是真没了。

备份这件事,平时看不见价值,真到出事那天才知道它是最后一道防线。这篇文章不聊虚的,就按真实操作顺序,把 VPS 上网站文件、数据库的备份,从手动打包到定时自动备份、再到异地容灾,一次讲清。

一、备份前先想清楚:备份什么、备份到哪

动手之前,先搞清楚两件事:备份什么,备份到哪。

一个典型的网站 VPS,需要备份的无非三样东西:

  • 网站文件:程序源码、上传的图片附件、主题插件等,一般都在 /www/wwwroot 或 /var/www 下。
  • 数据库:文章、评论、用户数据全在里面,这是最核心、也最容易丢的部分。
  • 配置文件:Nginx 站点配置、PHP 配置、SSL 证书目录等,数量少但恢复的时候缺一不可。

至于备份到哪,记住一条原则:备份一定要和服务器分开存。如果备份文件就放在同一台 VPS 上,服务器磁盘坏了或者机器没了,备份也跟着一起没了,等于没备份。所以一份留在本机应急,一份传到对象存储或者网盘做异地保存,才是完整的方案。

二、手动备份:tar 打包 + mysqldump 导出

先把手动备份跑通,后面自动化的脚本都是从这一步延伸出来的。

1. 打包网站文件

网站文件用 tar 打包,一条命令搞定:

tar -czf /backup/www_$(date +%Y%m%d_%H%M%S).tar.gz /www/wwwroot

解释一下:-c 创建压缩包,-z 用 gzip 压缩,-f 指定输出文件名。文件名里带上时间戳,方便区分版本,也方便后面做保留策略。

2. 导出数据库

数据库用 mysqldump 导出,MySQL 和 MariaDB 都通用:

mysqldump -uroot -p --single-transaction --default-character-set=utf8mb4 yourdbname > /backup/yourdb_$(date +%Y%m%d_%H%M%S).sql

两个参数值得多说一句:--single-transaction 用事务保证导出过程中数据一致,导出时不锁表,网站可以正常访问;--default-character-set=utf8mb4 防止中文乱码。如果你的数据库启用了 GTID 或者用的是 MariaDB,加个 --master-data=2 或 --column-statistics=0 视版本而定,遇到报错按提示处理即可。

最后把 SQL 文件也压一下,能省不少磁盘空间:

gzip /backup/yourdb_*.sql

如果用的是宝塔面板,面板自带的计划任务也能一键备份网站和数据库,省事。但手动写脚本的好处是可控性更强,也方便加上异地同步,下面接着讲。

三、定时自动备份:一个脚本 + crontab

手动备份偶尔做一次还行,天天记得按时备份根本不现实,人总会忘。所以要把备份做成定时任务。

先写一个备份脚本,把刚才的操作串起来:

#!/bin/bash
# /root/backup.sh
BACKUP_DIR="/backup"
DATE=$(date +%Y%m%d_%H%M%S)
DB_NAME="yourdbname"
DB_USER="root"
DB_PASS="yourpassword"

mkdir -p "$BACKUP_DIR"

# 1. 备份网站文件
tar -czf "$BACKUP_DIR/www_$DATE.tar.gz" /www/wwwroot

# 2. 备份数据库
mysqldump -u$DB_USER -p$DB_PASS --single-transaction --default-character-set=utf8mb4 "$DB_NAME" | gzip > "$BACKUP_DIR/db_$DATE.sql.gz"

# 3. 只保留最近 7 份,删除更早的备份
cd "$BACKUP_DIR" || exit
ls -t www_*.tar.gz | tail -n +8 | xargs -r rm -f
ls -t db_*.sql.gz | tail -n +8 | xargs -r rm -f

echo "备份完成:$DATE"

给脚本加上执行权限,然后手动跑一次确认没有报错:

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

确认正常之后,用 crontab 把它加进定时任务。这里推荐凌晨低峰期执行,每天一次:

crontab -e

加入下面一行:

0 3 * * * bash /root/backup.sh >> /root/backup.log 2>&1

意思是每天凌晨 3 点执行一次,输出写进日志,方便事后排查。改完保存,用 crontab -l 确认任务已经挂上。这一步做完,自动备份就生效了,以后每天都会有一份新的备份。

四、异地备份:rclone 同步到对象存储

本机定时备份只解决了一半问题——如果服务器整台没了,本机的备份也一起没了。异地容灾才是完整的保障。

rclone 是目前最常用的云同步工具,支持几十种对象存储和网盘。以腾讯云 COS / 阿里云 OSS 为例,装好后先配置一个远端:

curl https://rclone.org/install.sh | bash
rclone config

按向导选择对应的存储类型,填上 AccessKey、SecretKey 和桶名,一路回车就能配置好,远端名字比如叫 myoss。然后回到备份脚本里,在删除旧备份之前加上同步:

# 4. 同步到对象存储
rclone sync "$BACKUP_DIR" myoss:vps-backup --progress

rclone sync 会把本地目录和远端保持一致,新备份自动传上去,本地删掉的旧文件远端也会跟着清理。同步完可以去控制台里检查一下文件是否真的传上去了。

如果不想折腾对象存储,用 rclone 同步到 Google Drive、OneDrive 这些免费网盘也完全够用,步骤是一样的。

五、恢复演练:备份能还原才算数

备份做了、定时任务也挂上了,但很多人从来没验证过备份能不能用。等到真出事故那天才发现备份文件是坏的,那才是最绝望的。所以一定要定期做恢复演练。

恢复网站的步骤其实就是备份的逆过程。还原文件:

tar -xzf /backup/www_20261030_030000.tar.gz -C /www/

还原数据库:

gunzip -c /backup/db_20261030_030000.sql.gz | mysql -uroot -p yourdbname

建议每个月找一次低峰期,在一台新机器或者测试环境里完整恢复一遍,确认文件、数据库都能正常用。演练过几次之后,真出事的时候才不会手忙脚乱。

总结

到这里,一套完整的 VPS 备份方案就搭起来了:手动备份保证随时能救急,定时任务保证每天自动执行,异地同步保证服务器整体丢失也不怕,定期演练保证备份真的可用。

这套流程花不了多少时间,但它是网站长期运营里投入产出比最高的一件事。趁着现在网站数据还不多,赶紧把备份脚本配起来,别等到数据丢了才后悔。


手机扫码阅读

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

VPS 数据备份与迁移实战:从定时备份到无缝搬家一次讲清

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

评 论