网站的命根子是数据。服务器可以重装,代码可以从 Git 重新拉取,但数据库里的用户、订单、文章和配置,一旦丢失就是永久损失。很多站长把 VPS 买回来、网站跑起来之后就再没做过备份,直到某天数据库损坏、文件误删或者服务器被入侵,才追悔莫及。
这篇文章按真实操作顺序,把一套完整的「备份 + 恢复」方案串起来讲清楚:备份什么、多久备一次、怎么自动化、备份放哪里、以及真出事之后怎么最快把网站救回来。
一、先搞清楚:网站到底要备份哪些东西
一个典型网站(以 LNMP/LEMP 架构为例)由三部分组成:
1. 网站文件:源码、上传目录、主题插件,通常位于 /www/wwwroot 或 /var/www 下
2. 数据库:MySQL/MariaDB 里的数据,是整个网站的命脉
3. 配置与证书:Nginx 站点配置、PHP 配置、SSL 证书、.env 环境变量
很多人只备份文件忘了数据库,或者只备数据库丢了证书,恢复时才发现 SSL 过期、配置缺失。所以第一步是列一张清单,把三类内容全部纳入备份范围。
二、备份策略:遵守 3-2-1 原则
备份不是「有就行」,而是要有冗余:
- 3 份数据:原始数据 + 2 份备份副本
- 2 种介质:本地磁盘 + 异地/云端
- 1 份异地:至少有一份备份放在服务器之外
对个人站长来说,最务实的落地方式是:本地保留最近 7 天的每日备份(脚本自动清理旧备份),每周再把备份同步一份到对象存储(阿里云 OSS、腾讯云 COS、Backblaze B2 等)或另一台服务器。
三、数据库备份:mysqldump + crontab 定时任务
MySQL 备份最常用的工具是 mysqldump。写一个备份脚本,放到 /root/backup 目录下:
#!/bin/bash # /root/backup/backup_db.sh 每日数据库备份脚本 DB_USER="root" DB_PASS="你的数据库密码" BACKUP_DIR="/root/backup/db" DATE=$(date +%Y%m%d_%H%M%S) mkdir -p "$BACKUP_DIR" mysqldump -u"$DB_USER" -p"$DB_PASS" --all-databases \ --single-transaction --routines --triggers | gzip > "$BACKUP_DIR/db_$DATE.sql.gz" # 只保留最近 7 天的备份 find "$BACKUP_DIR" -name "*.sql.gz" -mtime +7 -delete
几个关键参数说明:
--single-transaction:InnoDB 引擎下无需锁表,即可得到一致性快照;
--routines --triggers:把存储过程和触发器也一并备份;
用 gzip 压缩后,备份体积通常能缩小 80% 以上。
然后用 crontab 注册定时任务,每天凌晨 3 点自动执行:
0 3 * * * /root/backup/backup_db.sh >> /root/backup/backup.log 2>&1
四、文件备份:tar 打包 + rclone 同步到云端
网站文件用 tar 打包,再用 rclone 增量同步到对象存储,一条命令就能把整个备份目录推上云端:
#!/bin/bash # /root/backup/backup_files.sh 每日文件备份脚本 BACKUP_DIR="/root/backup/files" DATE=$(date +%Y%m%d) tar czf "$BACKUP_DIR/www_$DATE.tar.gz" -C /www wwwroot find "$BACKUP_DIR" -name "*.tar.gz" -mtime +7 -delete # 同步到对象存储(rclone 支持 OSS / COS / S3 / B2 等几十种后端) rclone sync /root/backup remote:backup-bucket \ --exclude "*.log" --transfers 4 --fast-list
rclone 支持几十种存储后端,阿里云 OSS、腾讯云 COS、AWS S3、Google Drive 都能用。第一次配置只需要一条命令,按提示选择存储类型、填入 AccessKey 和 SecretKey 即可:
rclone config
五、验证备份:恢复演练才是真正的备份
备份最大的谎言是「我有备份」——很多备份在真正需要恢复时才发现是坏的。建议每月做一次恢复演练:
1. 找一台测试机,或者临时开一台便宜的 VPS;
2. 把最新的备份下载下来;
3. 还原数据库,解压文件,检查网站能否正常访问。
还原数据库的命令如下:
gunzip -c db_20260101_030000.sql.gz | mysql -uroot -p
只要每月花二十分钟做一次演练,真出事的时候你就能从容应对,而不是手忙脚乱。
六、灾难恢复:从 0 到 1 重建网站
最坏的情况:服务器彻底挂了。这时候靠的就是备份 + 一份「重建手册」。建议在服务器上维护一份 /root/RESTORE.md,记录:
操作系统与面板/环境版本(宝塔、LNMP 一键包等);
域名与 DNS 解析记录;
SSL 证书位置与续期方式;
数据库账号、备份存放位置与下载方式。
真正恢复时按手册顺序操作:重装系统 → 安装环境 → 恢复文件 → 恢复数据库 → 恢复配置 → 验证访问。整个流程熟练之后,两小时内就能把网站从零恢复到可用状态。
七、进阶:备份加密与自动告警
备份包里包含数据库密码等敏感信息,传云端之前建议先加密(gpg -c 或 openssl enc)。另外可以在脚本末尾加一段告警逻辑:备份成功就调用 Server酱、钉钉或飞书 Webhook 推送一条消息,失败则立即告警,第一时间发现问题:
if [ $? -eq 0 ]; then curl -s "https://sctapi.ftqq.com/你的SendKey.send?title=备份成功&desp=$(date)" else curl -s "https://sctapi.ftqq.com/你的SendKey.send?title=备份失败,请立即检查!" fi
总结
备份这件事,投入的是几分钟的脚本和一点点存储成本,换来的是数据安全的心安理得。今天就把定时备份配好、把异地同步配上,再每月做一次恢复演练。等到真出事的那一天,你会感谢现在动手的自己。