Linux / 02

把备份脚本从“能跑”改到“敢恢复”

备份任务每天显示成功,不代表数据真的可用。真正的完成标志,是你知道怎样把它恢复回来。

我以前判断备份是否可靠,只看定时任务有没有报错。直到一次迁移才发现,压缩包里缺了数据库导出文件——脚本仍然以 0 退出,因为最后执行成功的是上传命令。

先定义要恢复什么

“备份整台服务器”听起来保险,实际常常难以恢复。更清晰的做法是列出服务重建所需的最小集合:配置文件、持久化数据、数据库转储、密钥,以及能重现软件版本的清单。

  • 数据库使用一致性导出,不直接复制运行中的数据目录;
  • 容器配置保留 compose 文件与明确的镜像版本;
  • 密钥单独加密保存,并记录恢复时的权限要求;
  • 缓存、日志和可重新生成的构建产物默认不进入备份。

让错误尽早暴露

Shell 脚本至少开启严格模式,并在上传之前检查预期文件存在且非空:

set -euo pipefail

test -s "$workdir/database.sql"
tar -C "$workdir" -czf "$archive" .
sha256sum "$archive" > "$archive.sha256"

校验和不能证明业务数据正确,但可以证明文件在传输和存储后没有悄悄变化。远端上传完成后,最好重新下载校验文件并抽样比对。

保留策略要对抗“晚发现”

只保留最近七份日备份,无法处理两周后才发现的数据污染。我采用简单的分层策略:保留 7 个日版本、5 个周版本和 6 个月版本。数量不必照抄,关键是覆盖问题被发现的时间窗口。

恢复演练是备份的一部分

每月在隔离目录或临时实例中执行一次恢复:解密、校验、解压、导入数据库、启动服务,再用一个最小检查清单验证登录、读取和写入。演练的命令与耗时也记录下来。

没有恢复步骤的备份,只是一批希望有用的文件。

最后让通知包含可判断的信息:生成时间、文件大小、校验结果、远端位置和最近一次恢复演练日期。这样“成功”才不只是一个绿色图标。