PostgreSQL 备份与恢
下面是一份 最系统、最实用的 PostgreSQL 备份与恢复指南,覆盖:逻辑备份、物理备份、增量备份、PITR(时间点恢复)、常见实战方案、企业级最佳实践。
目录
- 备份类型总览
- 逻辑备份(pg_dump / pg_dumpall)
- 物理备份(pg_basebackup)
- WAL 归档与增量备份
- PITR(时间点恢复)完整流程
- 常用备份策略(企业级架构)
- 恢复常见问题
- 最佳实践总结
| 类型 | 工具 | 级别 | 是否增量 | 是否可选库/表 | 典型用途 |
|---|---|---|---|---|---|
| 逻辑备份 | pg_dump/pg_dumpall | SQL/结构级 | ❌ | ✅ | 小数据量备份、迁移 |
| 物理备份 | pg_basebackup | 文件级 | ❌(但可结合WAL) | ❌ | 基础库完整镜像 |
| WAL 归档 | archive_mode | WAL日志 | ✅ | ❌ | 增量备份、PITR |
| 快照备份 | LVM/ZFS/云盘快照 | 块级 | ✅ | ❌ | 超大库快速备份 |
| 流复制备份 | 主从复制 | 实时 | ✅ | ❌ | 高可用、热备 |
⭐ 场景
- 单个 database 备份
- 单个表备份
- 跨主机迁移、结构变更、版本升级
- 导出部分数据、结构
pg_dump -U postgres -d mydb -F c -f mydb.dump
参数说明:
- -F c -> custom 格式,支持压缩与并行恢复
- pg_restore 恢复速度更快
恢复:
pg_restore -U postgres -d mydb mydb.dump
pg_dump -U postgres -d mydb -t users -F c -f users.dump
恢复:
pg_restore -U postgres -d mydb -t users users.dump
pg_dumpall -U postgres > all.sql
恢复:
psql -U postgres -f all.sql
⭐ 场景
- 完整镜像备份
- 集群冷备
- 搭建主从复制
完整备份
pg_basebackup -U replica -D /backup/pg -Fp -Xs -P
参数说明:
- -Fp 文件格式(目录)
- -Xs 备份过程中同时复制 WAL
- -P 显示进度
恢复 = 直接复制回来(文件级别)
WAL(Write-Ahead Log)记录所有变更。
只要有:
- 1 次物理基础备份
- WAL 日志归档
即可实现:
- 增量恢复
- 时间点恢复(PITR)
postgresql.conf:
archive_mode = on
archive_command = 'cp %p /data/wal_archive/%f'
wal_level = replica
max_wal_senders = 10
创建归档目录:
mkdir -p /data/wal_archive
以下是 从误删/误更新数据恢复到过去任意时刻 的完整步骤。
⭐ 前提条件
- 一次物理备份(pg_basebackup)
- WAL 归档启用成功
systemctl stop postgresql
rm -rf /var/lib/postgresql/17/main/*
cp -r /backup/pg/* /var/lib/postgresql/17/main/
创建 postgresql.conf 同级目录中的:
recovery.signal
touch recovery.signal
postgresql.auto.conf 中增加:
restore_command = 'cp /data/wal_archive/%f %p'
recovery_target_time = '2025-02-10 14:22:00'
你也可以根据场景选择:
- recovery_target_lsn
- recovery_target_xid
- recovery_target_name
- recovery_target_time
systemctl start postgresql
数据库会自动 replay WAL 直到指定时间。
🔥 企业推荐策略(适合 99% 项目)
每日
- 00:00:pg_basebackup(基础备份)
持续
- WAL 归档(增量变化)
每周
- 全量逻辑备份(pg_dump)
- 备份存到对象存储(S3 / OSS)
每月
- 恢复演练
- 校验备份完整性(pg_verifybackup)
⭐ PostgreSQL 官方推荐方案
- 物理备份 + WAL -> 主方案
- 逻辑备份 -> 额外保障
- 多机异地存储
- 每 3 个月做一次恢复演练
WAL 不完整 -> 无法 PITR -> 只能用逻辑备份恢复部分数据。
解决:添加 -Xs 参数复制 WAL。
原因:
- restore_command 路径错误
- WAL 不完整
检查日志:
journalctl -u postgresql -f
你忘了删除 recovery.signal。
- 启用 WAL 归档(必须)
- 使用 pg_basebackup 做基础备份
- 使用 pg_verifybackup 检查备份
- WAL + 物理备份 + 逻辑备份 三层保护
- 定期做「恢复演练」
- 在 Kubernetes / 云环境中使用「快照备份」加速
- 异地备份(尤其是对象存储)
- 执行增量恢复时使用 recovery_target_time 精准恢复