很多站长把网站部署上线之后,就再也没有管过服务器上的数据。直到某天手滑删了数据库、磁盘突然损坏、或者商家跑路连机器一起消失,才猛然发现所有的文章、评论、配置全都没了。服务器可以随时再买一台,但数据没了就是真没了。
备份这件事,平时看不见价值,真到出事那天才知道它是最后一道防线。这篇文章不聊虚的,就按真实操作顺序,把 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 备份方案就搭起来了:手动备份保证随时能救急,定时任务保证每天自动执行,异地同步保证服务器整体丢失也不怕,定期演练保证备份真的可用。
这套流程花不了多少时间,但它是网站长期运营里投入产出比最高的一件事。趁着现在网站数据还不多,赶紧把备份脚本配起来,别等到数据丢了才后悔。