网站备份实战:crontab 定时自动备份网站与数据库,异地存储与一键恢复一次讲清


很多站长都有过这样的经历:网站被挂马、服务器硬盘损坏、误删了数据库,这时候才想起备份。可翻遍服务器发现,备份要么从来没做过,要么只存在同一台机器上——硬盘一坏,备份和网站一起没了。备份这件事,做一次不难,难的是做到"自动化、异地化、可恢复"。这篇从策略到命令,把网站备份一次讲清楚。

一、先想清楚:备份到底要备什么

网站备份通常包含三部分:网站文件(源码、图片、模板等静态资源)、数据库(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

恢复前先停掉对外的写入,恢复后再清理浏览器和程序缓存,避免出现"文件是新的是缓存是旧的"的混乱状态。

八、最后别忘了:定期演练恢复

没有恢复验证过的备份,就等于没有备份。建议每季度在测试环境上完整走一遍"下载备份 → 恢复文件 → 导入数据库 → 网站正常访问"的流程。真正出事那天,节省的时间都是靠平时演练换来的。

备份不是做给服务器看的,是做给"万一出事"的自己看的。把自动化、异地化和可恢复性三件事做扎实,网站数据才算真正安全。


手机扫码阅读

微信或手机浏览器扫一扫,随时随地随心阅读与分享

FRP 内网穿透实战:用一台 VPS 把 NAS 与内网服务安全映射到公网

Docker Compose 部署 LNMP 建站实战:Nginx、MySQL、PHP 一次讲清

评 论