备份、恢复与 PITR
按恢复目标选择逻辑或物理备份,并用演练证明可恢复
选择工具
| 需求 | 工具/方式 | 关键边界 |
|---|---|---|
| 单库、可移植、选择对象 | pg_dump / pg_restore | 不包含集群级角色与 tablespace 定义 |
| 全集群逻辑对象 | pg_dumpall --globals-only 配合各库 dump | 大库恢复慢,需重建索引 |
| 整实例快速恢复 | pg_basebackup 或成熟备份工具 | 版本和平台约束更强 |
| 恢复到某一时间点 | 物理基准备份 + 连续 WAL 归档 | 必须持续验证 WAL 完整性 |
pgBackRest、WAL-G 与 pg_dump 怎么选
| 方案 | 更适合 | 不足以单独证明 |
|---|---|---|
pgBackRest | 自托管实例的 full/differential/incremental、并行备份、多 repository、WAL 与 PITR | 目标 RTO 已达标,密钥和所有 WAL 都可用 |
WAL-G | 对象存储导向的物理备份与 WAL 工作流 | repository 保留、删除保护和恢复正确 |
pg_dump / pg_restore | 逻辑迁移、选择对象、小规模恢复与跨版本导出 | 连续时间点恢复或整实例低 RTO |
| 云平台备份 | 降低基础设施维护量 | 跨账户、跨区域、平台外恢复和全部扩展可恢复 |
不要机械套用固定的每日/每周频率。由 RPO、WAL 生成量、恢复带宽、保留策略和实测 RTO 反推 backup cadence,并保留至少一份独立于主数据库权限边界的副本。
逻辑备份
自定义格式支持并行恢复与选择对象:
pg_dump \
--format=custom \
--file=commerce-20260802.dump \
--dbname='postgresql://backup@db.example/commerce'
pg_restore --list commerce-20260802.dump
createdb commerce_restore_test
pg_restore \
--dbname=commerce_restore_test \
--jobs=4 \
--exit-on-error \
commerce-20260802.dumppg_dump 在导出期间提供一致快照,但只能备份一个 database。角色等全局对象另行备份:
pg_dumpall --globals-only > globals-20260802.sql不要把包含密码哈希的 globals 文件放进普通制品库。
物理备份与 PITR
PITR 需要:可用的基准备份、从基准备份起连续完整的 WAL、正确的恢复配置,以及时间线管理。只保存 WAL 不够;只做 base backup 也无法恢复到任意时间点。
归档命令必须只在安全复制成功后返回 0,并避免覆盖已有文件。对象存储通常需要成熟备份工具管理并发、校验、保留和加密,而不是一条未经监控的 shell 命令。
持续告警 archive failure、缺失 WAL、repository 容量和最近一次可恢复时间。删除旧备份前,让工具按依赖关系计算保留链;不要只按文件日期手工删除。
恢复演练
每次演练记录:备份 ID、起止时间、恢复目标、数据库版本、所需密钥、实际 RTO、可恢复到的最新事务时间、校验查询和异常。
验证至少包括:
SELECT count(*) FROM critical_table;
SELECT min(created_at), max(created_at) FROM critical_table;
SELECT conname, convalidated FROM pg_constraint WHERE NOT convalidated;
SELECT indexrelid::regclass, indisvalid FROM pg_index WHERE NOT indisvalid;再运行应用层只读冒烟测试。行数相同不证明业务关系和权限正确。
副本不是备份
复制会快速复制误删、错误更新和逻辑损坏。备份需要独立保留、删除保护、校验和恢复演练。
Last updated on