← [ BACK_TO_NOTES ]

BodySense 数据库第 18 课:Backup、Restore、PITR、Replication 与 RPO / RTO

学习数据库灾难恢复:logical/physical backup、WAL archive、PITR、replication/failover,并用 RPO/RTO 评估 BodySense 的 PostgreSQL durability。

#course #growing #backend #database #postgresql #bodysense

[!info] related notes

BodySense 数据库第 18 课:Backup、Restore、PITR、Replication 与 RPO / RTO

[!abstract] 本课目标 “有备份”只有在真的能恢复并满足 RPO/RTO时才有意义。

从零建立概念:先问“我要防哪一种数据灾难”

数据库灾难不只一种:

机器硬盘坏
数据库进程崩溃
主库不可用
误 DELETE
错误 migration
表逻辑损坏
账号被攻击后恶意删除
整个区域不可用
几小时后才发现数据错误

不同机制防不同事故。

所以:

Backup、Replication、PITR、High Availability 不能用一句“都有副本”混在一起。

Crash Recovery 和 Backup 先区分

上一课 WAL Crash Recovery:

同一数据库实例意外停止
→ 用本地 data files + WAL
→ 恢复到一致状态

Backup:

在线实例/文件本身已经不可信或不存在
→ 从独立保存的副本恢复

如果整个磁盘一起坏了,本地 WAL 也没了,Crash Recovery 就没有材料。

Logical Backup:导出逻辑对象和数据

PostgreSQL 常见:

pg_dump
pg_dumpall
pg_restore

逻辑备份更像:

schema objects
+
rows/data
→ logical archive

优点:

可选择 table/schema
跨机器恢复方便
可用于版本迁移场景
可检查逻辑对象

代价:

大数据库 dump/restore 可能很慢
不天然提供任意时间点恢复
恢复吞吐可能成为 RTO 瓶颈

Physical Backup:保存数据库物理基线

Physical backup 保存 PostgreSQL cluster data files 的一致基础状态。

典型:

pg_basebackup
storage snapshot(需满足 PostgreSQL 一致性要求)
managed database physical backup

它和 WAL 配合最自然。

Replication:为了 Availability / Read Scale,不是历史保险箱

Primary:

produces WAL

Standby/Replica:

receive WAL
→ replay
→ stay near current primary state

如果 Primary 硬件坏:

promote/fail over replica

可以降低服务中断时间。

但是:

DROP TABLE users

也是合法 transaction。

Replica 会忠实复制。

所以:

Replication 防“节点故障”,不天然防“逻辑错误”。

Synchronous vs Asynchronous Replication

Async

Primary commit 可以在 Replica 尚未确认持久化前返回。

优点:

lower commit latency

风险:

Primary sudden loss
→ some latest commits not yet replayed/received

可能产生非零 RPO。

Synchronous

Commit 等待指定 standby 达到一定确认级别。

优点:

stronger failover durability

代价:

network/standby latency enters commit path
standby failure may impact availability

仍然是业务取舍。

WAL Archiving:把连续历史保存到独立存储

正常 WAL segment 会在主库循环复用。

如果希望 PITR:

completed WAL
→ archive to durable external storage

形成连续历史。

它不能只偶尔成功。

如果中间缺一个必需 WAL segment:

base backup
+ incomplete WAL chain
→ cannot replay across the gap

所以要监控 archive failure / lag。

PITR:为什么可以恢复到“误删前 1 分钟”

PITR = Point-In-Time Recovery。

材料:

Base Backup at T0
+
WAL from T0 onward

恢复:

restore base backup
→ replay WAL
→ stop at target time / LSN / transaction

例如:

15:30 accidental DELETE

可恢复到:

15:29:59

然后从恢复实例导出需要的数据。

这比“回到昨晚 02:00 全量备份”损失小得多。

RPO / RTO 从零解释

RPO — Recovery Point Objective

最多允许恢复到多旧的数据点,也就是最多接受丢多少最近数据。

例:

RPO = 5 min

事故后允许最多损失最后约 5 分钟。

RTO — Recovery Time Objective

从事故开始到业务恢复可用,最多允许多久。

RTO = 30 min

就意味着不能设计一个需要 8 小时手工 restore 的流程。

两者不是同一件事

每分钟 backup
→ RPO 很小
但 restore 需要 6h
→ RTO 很差

也可能:

Replica failover 1 min
→ RTO 很好
但 async lag 10 min
→ RPO 可能较差

Backup Retention:保留多久也是设计

如果只有:

latest backup

而逻辑 corruption 两周后才发现:

latest backup already contains corruption

所以要设计:

hourly/daily/weekly
retention duration
off-site / cross-region
encryption
immutability
access control

根据业务和成本决定。

Restore Drill:Backup 成功日志不是证据终点

真正证据链:

backup created
→ artifact exists
→ restore into isolated environment
→ PostgreSQL starts
→ migrations/schema expected
→ key counts/invariants validate
→ application can connect
→ record duration

只有走完才知道:

backup is recoverable
RTO is measured

不是猜。

BodySense 为什么尤其需要考虑 Data Class

不同数据恢复优先级可能不同:

User account
BodyState history
Diagnosis/Treatment
Runtime Event
Job ledger
derived cache
analytics

例如 Redis Cache 可以重建,但 PostgreSQL Health history 可能需要更严格 RPO。

Disaster Recovery 方案应从 data classification 和业务 contract 推导。

1. Backup 与 Replication 不是同一个东西

Backup
→ 历史独立副本

Replication
→ 另一份接近当前状态的在线副本

误删一张表时,replica 也可能立刻复制误删;因此 replication 不能替代 backup。

2. Logical vs Physical

Logical:

pg_dump / pg_restore
→ schema + logical rows
→ 跨环境恢复灵活

Physical:

base backup / storage-level copy
→ cluster files
→ 与 WAL/PITR/standby 更紧密

3. PITR

Base Backup
+ continuous WAL archive
→ replay until target timestamp/LSN

可以恢复到误操作之前,而不只是最近一次每日备份。

4. RPO / RTO

RPO = 最多能接受丢多少数据
RTO = 最多能接受恢复多久

“每天备份一次”若业务 RPO 是 5 分钟,显然不满足需求。

5. Restore Drill

备份文件存在不代表可恢复。真正验收至少要:

  • 在隔离环境恢复;
  • 验证 migration/schema identity;
  • 验证关键业务行/约束;
  • 记录耗时;
  • 证明应用能连接恢复后的数据库。

Prediction

[!question]

  1. 有 streaming replica 是否还需要 backup?
  2. 每天凌晨 2 点 pg_dump,下午 6 点数据库损坏,最大理论数据损失可能多少?
  3. PITR 为什么需要连续 WAL archive?
  4. Backup job 显示 success 是否足以通过 DR 验收?
  5. RPO=0 与 RTO=0 是否现实且免费?

[!success]- Answer / 解析 1. 需要。 Replica 会复制逻辑错误/误删,也可能同时受区域/凭证/软件故障影响。

2. 接近 16 小时。 若没有增量/WAL 等其他恢复来源。

3. Base backup 只提供起点,目标时间点之间发生的 transaction 必须通过 WAL 重放。

4. 不足。 必须做 restore drill;坏备份、缺依赖、权限/schema 漂移都可能直到恢复时才暴露。

5. 通常不现实。 越接近零,复制、同步提交、多区域和自动 failover 成本/复杂度越高。

BodySense Lab

阅读现有 data-durability-backup 计划,写出当前 PostgreSQL:

backup mechanism
off-host location
restore procedure
claimed RPO
claimed RTO
last real restore evidence

没有真实证据的字段写 unknown,不要猜。

L4 Gate

能把一个“数据库坏了怎么办”的回答具体化为 Backup + WAL + Restore Drill + RPO/RTO,而不是只说“有主从/每天备份”。

创建于 2026/9/18 更新于 2026/9/18
Digital Biome
Access

键盘导航

j / k / ↑ / ↓
选择对象
Enter / o
打开选择
/ 或 Ctrl+K
全站搜索
i / f / 1–4
筛选当前列表
g → h / l / p / t / a
首页 / 笔记 / 项目 / 工具 / About
r → 1–9
打开所选对象的关联
u
返回上一页
Esc
关闭浮层 / 取消命令;输入框内清空文本