Skip to content
VDS · 备份与磁盘

测试恢复:提前检查您的备份

如何进行试恢复、结果应记录什么,以及哪些典型意外只有在演练中才会暴露,而不是在真正的灾难中。

更新于 2026年8月23日

从未实际恢复过的备份不算备份,只是希望。每季度做一次恢复演练,只需一小时,就能把希望变成经过验证的事实。

需要检查什么

发生故障前,您需要回答三个问题:

  1. 完整性。 备份是否包含启动所需的一切:数据、设置、密钥、证书、计划任务。
  2. 可读性。 归档能否打开,数据库转储能否无错误地恢复。
  3. 时间。 完整恢复需要多少小时。您需要提前知道这个数字,而不是在压力下才发现。

如何开展演练

最可靠的做法是在另一台机器上进行,而不是生产机器。租用一台 VDS-1 一个月,从零开始恢复到它上面,并记录耗时。

export RESTIC_REPOSITORY="sftp:backup@backup.example.com:/srv/restic"
export RESTIC_PASSWORD_FILE=/root/.restic-pass

restic snapshots
restic restore latest --target /restore
ls -la /restore

恢复数据库:

docker compose up -d db
gunzip -c /restore/var/backups/db.sql.gz | docker compose exec -T db psql -U postgres app
docker compose exec -T db psql -U postgres app -c "select count(*) from users;"

启动应用并在浏览器中打开——这是最后一步。在页面打开之前,恢复都不算完成。

还有一种更轻量但也很有用的做法:只把数据库恢复到一个单独的容器中,运行在同一台机器上,确认数据存在且是最新的。

不仅要检查解包是否成功,还要检查数据的日期。一个创建得很可靠、但从一个月前就不再包含所需目录的备份,在快照列表中看起来完全正常。请对比表中的记录数量和最新文件的时间戳。

通常会暴露出的问题

  • 忘记 .env 文件。 数据在,但访问数据的密码不在。
  • 忘记证书。 网站能启动,但 HTTPS 无法响应。
  • 忘记计划任务。 一切正常,但备份不再创建——而您一个月后才发现。
  • 没有记录启动顺序。 应用先于数据库启动并崩溃。
  • 仓库密码只存在于已丢失的机器上。 备份还在,但无法访问。
  • 恢复需要十小时,而不是两小时。 接收端带宽或磁盘柜,参见磁盘速度。

写下操作顺序

根据演练结果,写一份简短的操作说明,并保存在机器之外:

  1. 订购一台同档或更高档的机器——开通大约需要一分钟。
  2. 安装 Docker,从备份中恢复 /opt/myapp。
  3. 恢复数据库转储,检查记录数量。
  4. 恢复 /etc/nginx 和证书,启动 Web 服务器。
  5. 将域名指向新地址。
  6. 从 crontab.txt 恢复计划任务。
  7. 检查:网站能打开、登录正常、备份重新开始创建。

第 5 条最容易被低估。DNS 记录不会立即更新,如果您打算进行迁移,应提前将记录的 TTL 降低到 300 秒。

多久做一次

生产服务每季度一次,其他所有服务每半年一次。此外,在任何重大变更之后都要做:新数据库、新服务、移动目录。把演练写进日历,否则它永远不会发生。

备份里应该有什么——具体要备份什么。备份放到哪里——异地备份。如果故障已经发生——数据丢失。