博客数据备份方案:从 rsync 到异地容灾

Cold 发布于 2023-11-25 13 次阅读 574 字 预计阅读时间: 3 分钟 日常随笔


前几天看到有人帖子说服务器被服务商误删,五年博客数据全没。惊出一身冷汗——我的博客虽然没什么大不了的内容,但七八年的记录说没就没也挺难受。趁着周末把备份体系彻底整了一遍。

备份的对象

  • WordPress 数据库(文章内容,最重要)
  • wp-content/uploads(图片附件,体积最大)
  • Nginx 配置、主题自定义代码、SSL 证书位置记录
  • 域名解析记录的截图/导出(出问题时能快速照着重建)

方案:三份副本,两种介质,一份异地

第一份:服务器本地每日备份。脚本凌晨三点跑,mysqldump + tar 打包,保留最近 7 天。注意脚本里 mysqldump 要加 --single-transaction,不锁表:

#!/bin/bash
DATE=$(date +%F)
mysqldump -ublog -p'xxx' --single-transaction blog | gzip > /backup/db_$DATE.sql.gz
tar -czf /backup/uploads_$DATE.tar.gz /www/blog/wp-content/uploads
find /backup -mtime +7 -delete

第二份:同步到家里的 NAS。服务器到家里的网络没有公网入口,用了最朴素的方案:frp 打通后 rsync 拉取。每天一次增量同步,备份体积小的时候几乎没流量。

第三份:对象存储。每周日把当周备份推一份到腾讯云 COS(开了版本控制,防止误删备份本身)。这才是真正的异地容灾——服务器炸了、家里进水了,数据还在。

最重要的一步:验证恢复

没验证过的备份等于没备份。我在本地 Docker 起了个 WordPress,用备份文件完整恢复了一遍:导库、解压 uploads、改配置,40 分钟后一个一模一样的博客在本地跑了起来。这一步强烈建议每个自建博客的人都做一次,你会当场发现备份脚本里的各种坑(我的是 tar 打包时用了绝对路径,恢复时路径全对不上)。

最后把"如何从备份恢复"写成了一页文档,放在和备份无关的地方(NAS 的备忘 + 自己邮箱各存一份)。备份这事的终极目标是:哪怕我现在失忆了,对着文档也能把站救回来。

和喜欢的一切在一起~
最后更新于 2023-11-25