PostgreSQL Field Guide

备份、恢复与 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.dump

pg_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

On this page