很多站长把网站跑起来之后就再没管过数据,直到某天服务器故障、机房停电、或者手滑删错了文件,才猛然发现“数据没了”。备份这件事,平时看不见摸不着,一旦用到就是救命的。这篇按真实可操作的方式,把 VPS 数据备份从手动到自动、从本机到异地讲清楚,照着做就能把“数据丢失”的风险降到最低。
一、先想清楚:你要备份什么
动手之前先盘一盘服务器上有哪些值钱的数据:
- 网站文件:程序源码、上传的图片、主题和插件(WordPress/Typecho 的 wp-content 或 usr 目录等)。
- 数据库:文章、评论、用户、订单,几乎所有核心数据都在这里。
- 配置文件:Nginx、PHP、MySQL 的配置,出问题时恢复配置能省大量时间。
- 其他:日志、定时任务(crontab)、环境变量等。
优先级排序:数据库 > 网站文件 > 配置文件。预算和时间有限时,先保证数据库和网站文件有备份。
二、最基础的:手动备份
备份数据库
MySQL/MariaDB 最常用 mysqldump:
mysqldump -u root -p --single-transaction --default-character-set=utf8mb4 数据库名 > backup.sql
加上 --single-transaction 可以在不锁表的情况下备份 InnoDB 表;备份完记得压缩:gzip backup.sql,能省不少空间。
备份网站文件
用 tar 打包网站目录,排除缓存和日志:
tar -czf www_backup.tar.gz -C / var/www/html --exclude='cache' --exclude='logs'
备份配置
把 /etc 下的关键配置一起打包,恢复时对比着改就行。
三、进阶:定时任务自动备份
手动备份容易忘,真正的解决方案是交给 crontab 定时执行。写一个简单的备份脚本 backup.sh,放在 /root/scripts 下:
#!/bin/bash BACKUP_DIR=/root/backups DATE=$(date +%Y%m%d) # 备份数据库 mysqldump -u root -p密码 数据库名 | gzip > $BACKUP_DIR/db_$DATE.sql.gz # 备份网站文件 tar -czf $BACKUP_DIR/www_$DATE.tar.gz -C / var/www/html # 清理 7 天前的备份 find $BACKUP_DIR -name "*.gz" -mtime +7 -delete
然后添加定时任务,每天凌晨 3 点执行:
crontab -e 0 3 * * * /root/scripts/backup.sh
注意:脚本里的数据库密码建议放在单独的配置文件中并设置好权限,避免明文躺在脚本里。
四、关键一步:异地备份
备份如果只存在同一台服务器上,服务器整机挂了,备份一样跟着没了。所以必须做“异地备份”——把备份文件同步到另一台机器或对象存储。
最常用的工具是 Rclone,它可以对接几乎所有云存储:阿里云 OSS、腾讯云 COS、AWS S3、Backblaze B2,甚至 Google Drive。安装和配置:
apt install rclone rclone config
按提示选择存储类型、填写密钥,完成后测试:rclone ls 远程名:。然后在备份脚本末尾加一行同步:
rclone sync $BACKUP_DIR 远程名:backups/服务器名/
配合前面的定时任务,每天的备份会自动推到异地,做到真正的“双重保险”。
五、恢复演练:备份没验证等于没有
备份最大的坑是“备了但恢复不了”。建议每隔一段时间做一次恢复演练:把备份文件下载到一台干净的机器或新 VPS 上,导入数据库、解压文件,确认网站能正常跑起来。恢复命令大致如下:
gunzip -c db_20261016.sql.gz | mysql -u root -p 数据库名 tar -xzf www_20261016.tar.gz -C /
演练过一次之后,真出事时你才不会手忙脚乱。
六、几点补充建议
- 重要站点可以再加一层对象存储的版本控制或多版本功能,误删也能找回。
- 数据库大的站点,可以考虑用二进制日志(binlog)做增量备份,把丢失窗口压缩到分钟级。
- 用宝塔面板等可视化面板的话,面板自带计划任务和备份功能,可以直接在界面上配置,原理和命令行一致。
- 备份文件建议加密后上传,避免对象存储泄露导致敏感数据外流(可以用 gpg 或 rclone 的加密 remote)。
结语
数据备份没有技术含量上的难度,难的是“习惯”。花一个下午把脚本配好、异地同步打开、恢复演练跑一遍,之后它就安安静静地每天替你兜底。真到服务器出问题那天,你会感谢现在的自己。