温馨提示:本文为读者投稿的实用技术内容,操作前请先做好数据备份。
很多新手入手 VPS 后,第一件事就是忙着搭网站、跑服务,却很少提前想一件事:如果这台服务器突然挂了、被黑客删库了、或者你不想续费想搬家,你的数据怎么办?
后台的数据丢了,网上哭都哭不回来。今天这篇文章不聊虚的,用最实在的命令和步骤,带你把“备份”和“迁移”这两件事彻底搞定。读完你就能自己给网站做定时备份、把数据搬到异地、甚至把整台服务器从一个商家无缝换到另一个商家。
一、先想清楚:你要备份的是什么
动手之前,先搞清楚你机器上有哪些“值钱”的东西,一般分三类:
1. 网站程序文件和配置文件:比如 Nginx 的站点配置、PHP 代码、你上传的图片附件等。这些是静态文件,直接打包拷贝即可。
2. 数据库:WordPress、Typecho 这些动态程序的数据都存在数据库里,是网站的灵魂,必须用专门的工具导出。
3. 环境依赖清单:比如你装了哪些系统包、PHP 扩展,记录下来,迁移新机时照着装。
记住一句话:文件靠打包,数据库靠导出,环境靠记录。三者分开处理,恢复时才不会乱。
二、制定备份策略:别等出事才想起
备份不是“备份了就行”,而是要有策略。业界有著名的“3-2-1 原则”:保留 3 份数据副本,存储在 2 种不同的介质上,其中至少 1 份在异地(机房之外)。
落到 VPS 场景,一个简单可执行的方案是:
- 本地备份:在服务器上保留最近 3 天的压缩包。
- 异地备份:每天把压缩包传到另一台服务器、或者对象存储(OSS/COS/S3)上。
- 定期清理:只保留最近 7~30 天的异地备份,避免磁盘被撑爆。
另外最重要的一条:备份一定要“可恢复”。很多人的备份能生成、却从没验证过能不能恢复,等真出事才知道备份是坏的,那就晚了。所以每个月抽时间在测试环境恢复一次,属于基本功。
三、网站文件备份:用 tar 一步打包
备份文件最常用的组合是 tar + 压缩。以备份 /var/www/html 站点目录为例:
tar -zcvf /backup/site_$(date +%F).tar.gz /var/www/html
参数解释:
- -z:调用 gzip 压缩,生成 .tar.gz 格式。
- -c:打包(create)。
- -v:显示打包过程(可以去掉,精简输出)。
- -f:指定输出文件名。
- 文件名里的 $(date +%F) 会自动带上当天的日期,避免覆盖历史备份。
如果你只想打包其中的部分文件、排除缓存目录,可以加上 --exclude:
tar -zcvf /backup/site_$(date +%F).tar.gz --exclude='/var/www/html/cache' /var/www/html
四、数据库备份:用 mysqldump 导出
数据库不能用 tar 直接打包(文件会不一致),要用数据库自带的导出工具。以 MySQL 为例:
mysqldump -u root -p --all-databases --single-transaction --routines > /backup/db_$(date +%F).sql
参数解释:
- --single-transaction:在 InnoDB 引擎下开启事务,保证导出时数据一致,且不影响线上读写。
- --routines:连同存储过程、函数一起导出。
- --all-databases:导出所有库,方便一键恢复。
导出完顺手压缩一下:
tar -zcf /backup/db_$(date +%F).sql.tar.gz /backup/db_$(date +%F).sql
如果你是 SQLite 或者 PostgreSQL,思路一样,分别用 SQLite 的备份命令或 pg_dump 导出即可。
五、让备份自动化:crontab 定时任务
上面都是手动操作,真想要省心,必须写成定时任务。用 crontab -e 打开定时任务编辑器,加上这样的行:
# 每天凌晨 2:30 备份数据库
30 2 * * * /root/backup_db.sh
# 每天凌晨 3:00 备份网站文件
0 3 * * * /root/backup_site.sh
# 每天凌晨 4:00 把本地备份同步到异地
0 4 * * * /root/sync_remote.sh
crontab 五分钟语法格式是“分 时 日 月 周”,* 表示任意值。把具体的备份命令写成 .sh 脚本,在脚本里加上日志输出,方便排查:
#!/bin/bash
# backup_db.sh
backup_dir="/backup"
mysqldump -u root -p"你的密码" --all-databases --single-transaction --routines > "$backup_dir/db_$(date +%F).sql" 2>>/var/log/backup.log
tar -zcf "$backup_dir/db_$(date +%F).sql.tar.gz" -C "$backup_dir" "db_$(date +%F).sql"
rm -f "$backup_dir/db_$(date +%F).sql"
echo "[$(date)] 数据库备份完成" >> /var/log/backup.log
写好后,记得给脚本加执行权限:chmod +x /root/backup_db.sh,并用 crontab -l 确认任务已写入。
六、异地备份:rsync 与 rclone 二选一
只存在本机的备份,遇到服务器硬盘故障、机房整体宕机就全完了,所以“异地”是刚需。两种主流做法:
方式一:rsync 同步到另一台服务器
rsync -avz --delete /backup/ root@另一台IP:/remote_backup/
- -a:归档模式,保留权限和属性。
- -v:显示过程。
- -z:传输时压缩。
- --delete:让远端删除本地已不存在的文件,保持两边一致。
配合免密登录(SSH 密钥),就能放进 crontab 全自动执行。
方式二:rclone 同步到对象存储
对象存储(阿里云 OSS、腾讯云 COS、AWS S3)相对更省事、更便宜。用 rclone 配置好后一条命令:
rclone sync /backup/ rclone_remote:my-bucket/vps-backup/
- 对象存储按量计费,冷备成本很低。
- 支持加密和版本控制(部分厂商),防勒索病毒很管用。
如果你图简单,直接在系统里安装宝塔面板,它也自带“计划任务 + 异地备份到对象存储”的图形化功能,适合不想敲命令的朋友。
七、验证备份:最重要的第一步,很多人忽略
生成备份时,顺手做两件事:
1. 检查文件完整性:确认压缩包大小正常、能被正常解压。
2. 测试恢复:在另一台环境(或本机别的目录)里,把备份实际恢复一遍,看看网站能不能跑起来。
平时验证的成本很低,关键时刻能救命。往小了说,你至少要知道“哪份压缩包是什么时候的、里面有没有该有的数据”。
八、迁移实战:把 VPS 从旧机无缝搬到新机
搬家换机,本质是“备份 + 异地恢复”的完整演练。按下面六步走,基本不会乱:
第一步:新机装好系统与基础环境
先按你记录的环境清单,在新机上装好 Nginx、PHP、MySQL 等,保证版本与旧机一致或兼容。
第二步:把备份传输到新机
方法一:scp 直接拉取
scp root@旧机IP:/backup/db_xxx.sql.tar.gz /backup/
scp root@旧机IP:/backup/site_xxx.tar.gz /backup/
方法二:如果备份已在对象存储,直接用 rclone 拉下来。
第三步:恢复数据库
先解压,再导入:
mysql -u root -p < /backup/db_xxx.sql
导入后用户名、权限、WordPress 里的配置一并就位。
第四步:恢复网站文件
tar -zxvf /backup/site_xxx.tar.gz -C /
注意把文件恢复到原先的绝对路径,例如 /var/www/html。
第五步:改服务器配置并测试
把 Nginx 的站点配置指到对应目录,修改数据库连接信息(如果域名、路径变了),然后用浏览器访问新机 IP 或临时域名,登录后台确认一切正常。
第六步:切换流量
确认无误后,到域名解析处把 A 记录指到新机 IP,等 DNS 生效即可。注意:如果双机同段网络,记得先改备用资料;换成了新 IP,还得把防火墙、安全组对新 IP 放行。
九、几个新人最容易踩的坑
1. 密码写死在脚本里:虽然能用,但有风险。建议用 ~/.my.cnf 存放 MySQL 凭据,或使用环境变量,不要把密码明文写在日志里。
2. 备份目录放在业务目录里:比如把备份存在 /var/www/html 下,结果备份把网站磁盘撑爆。备份目录务必独立,比如 /backup。
3. 只备份了文件没备份数据库:WordPress 这类动态站,缺了数据库恢复出来就是个空壳。
4. 不看磁盘剩余空间:备份没写磁盘满的检查,导致任务悄悄失败。可以在脚本开头 df -h 看空间,空间不足就发个邮件提醒。
5. 迁移后直接删旧机:建议新旧机并行观察 1~2 周,确认业务稳定后再销毁旧服务器,给自己留退路。
十、小结:把“防患于未然”做成习惯
数据安全这件事,拼的不是技术多高深,而是“有没有提前做、有没有真的做好”。你不需要一次性搭出多复杂的灾备系统,只要做到三点就超过了大多数个人站长:
- 文件打包 + 数据库导出,每天自动执行。
- 数据同步到对象存储或另一台机器(异地)。
- 每月做一次恢复演练,确认备份真的能用。
把这套流程跑熟,以后无论你是换机房、降预算、还是防黑客,手里都有一张不用临时抱佛脚的底牌。快去看看你的 VPS 现在有没有在做备份吧。