先定义恢复目标#
备份方案必须回答两个问题:最多能丢多少数据(RPO),最长能停多久(RTO)。小型博客通常可以每天做逻辑全量备份、保留 14~30 天,并把副本同步到另一台机器或对象存储。
创建可检查的归档#
自定义格式支持选择性恢复和并行恢复,比直接压缩 SQL 更适合常规演练。
bash
stamp=$(date +%Y%m%d-%H%M%S)
pg_dump --format=custom --no-owner --file="gkblog-$stamp.dump" gkblog
pg_restore --list "gkblog-$stamp.dump" | head -30
sha256sum "gkblog-$stamp.dump" > "gkblog-$stamp.dump.sha256"
在隔离数据库恢复#
bash
createdb -T template0 gkblog_restore_test
pg_restore --exit-on-error --no-owner --dbname=gkblog_restore_test gkblog-20260801-020000.dump
psql gkblog_restore_test -c 'select count(*) from "Article";'
psql gkblog_restore_test -c 'select count(*) from "User";'
dropdb gkblog_restore_test
| 验证层级 | 方法 |
|---|---|
| 文件完整 | SHA-256 校验通过 |
| 归档可读 | pg_restore --list 无错误 |
| 结构完整 | 迁移表、索引和约束存在 |
| 业务可用 | 用恢复库启动应用并登录、读文章 |
自动化与保留策略#
- 备份任务失败会告警
- 副本离开生产服务器
- 每月至少恢复一次
- 删除策略只处理明确的备份目录
- 记录恢复耗时并与 RTO 比较
官方 pg_dump 与 pg_restore 文档还说明了目录格式和并行恢复。真正可靠的不是“有 dump 文件”,而是最近一次恢复演练成功。
讨论区 18
分享你的经验、补充或不同观点。支持 Markdown 基础语法。