很多站长都有过这样的经历:网站被挂马、服务器硬盘损坏、误删了数据库,这时候才想起备份。可翻遍服务器发现,备份要么从来没做过,要么只存在同一台机器上——硬盘一坏,备份和网站一起没了。备份这件事,做一次不难,难的是做到"自动化、异地化、可恢复"。这篇从策略到命令,把网站备份一次讲清楚。
一、先想清楚:备份到底要备什么
网站备份通常包含三部分:网站文件(源码、图片、模板等静态资源)、数据库(MySQL/MariaDB 导出的 SQL 数据)、以及环境配置(Nginx、PHP、FTP 等运行配置)。很多人只备份了文件和数据库,恢复时才发现环境配置丢了,重新装环境又折腾半天。
二、备份策略怎么定:本地 + 异地,保留 3~7 份
备份的原则很简单:本地留最近几份用于快速恢复,异地(另一台服务器或对象存储)留一份用于防"机毁"。保留份数建议 3~7 份,太多浪费磁盘,太少覆盖太快。每天凌晨执行一次、保留最近 7 天,再配合异地同步,基本能覆盖绝大多数故障场景。
三、网站文件备份:tar 打包
对文件做备份,最通用的是 tar 打包压缩,一条命令即可完成:
tar -czf /backup/site_$(date +%F).tar.gz -C /www/wwwroot mysite.com
如果网站文件很大,可以先全量打包一次,之后用 rsync 做增量同步,避免每次都把整个目录重新传一遍。
四、数据库备份:mysqldump 导出
数据库用 mysqldump 导出为 SQL 文件,备份时加上 --single-transaction 可以避免锁表,不影响线上读写:
mysqldump -uroot -p --single-transaction --databases mydb > /backup/db_$(date +%F).sql
再顺手用 gzip 压缩,SQL 文本的压缩率通常都在 90% 以上,能省下大量磁盘空间:
gzip /backup/db_$(date +%F).sql
五、用 crontab 把备份变成定时任务
把上面的命令写进一个备份脚本 backup.sh,然后交给 crontab 每天凌晨自动执行:
0 3 * * * /usr/local/bin/backup.sh >> /var/log/backup.log 2>&1
凌晨 3 点是访问低谷,备份对网站的影响最小。注意 crontab 里要写脚本的绝对路径,并给脚本加上可执行权限,否则任务会静默失败。
六、异地备份:传到另一台服务器或对象存储
异地备份推荐两种方式:一是用 rsync 同步到另一台自己的服务器,二是用 rclone 上传到对象存储(比如阿里云 OSS、腾讯云 COS、七牛云)。rclone 配置好远程存储后,一条命令即可完成上传:
rclone copy /backup oss:mybackup --transfers 4
异地备份最大的意义是:服务器整体故障时,数据仍然在别处,新机器上拉回来就能恢复,不至于从头再来。
七、一键恢复:文件与数据库的还原
文件恢复就是把备份解包回原目录:
tar -xzf site_2026-11-09.tar.gz -C /www/wwwroot
数据库恢复则是把 SQL 文件导入:
gzip -dc db_2026-11-09.sql.gz | mysql -uroot -p mydb
恢复前先停掉对外的写入,恢复后再清理浏览器和程序缓存,避免出现"文件是新的是缓存是旧的"的混乱状态。
八、最后别忘了:定期演练恢复
没有恢复验证过的备份,就等于没有备份。建议每季度在测试环境上完整走一遍"下载备份 → 恢复文件 → 导入数据库 → 网站正常访问"的流程。真正出事那天,节省的时间都是靠平时演练换来的。
备份不是做给服务器看的,是做给"万一出事"的自己看的。把自动化、异地化和可恢复性三件事做扎实,网站数据才算真正安全。