Skip to main content
Documents
Toggle Dark/Light/Auto mode Toggle Dark/Light/Auto mode Toggle Dark/Light/Auto mode Back to homepage

PostgreSQL 备份与恢

下面是一份 最系统、最实用的 PostgreSQL 备份与恢复指南,覆盖:逻辑备份、物理备份、增量备份、PITR(时间点恢复)、常见实战方案、企业级最佳实践。

目录

  1. 备份类型总览
  2. 逻辑备份(pg_dump / pg_dumpall)
  3. 物理备份(pg_basebackup)
  4. WAL 归档与增量备份
  5. PITR(时间点恢复)完整流程
  6. 常用备份策略(企业级架构)
  7. 恢复常见问题
  8. 最佳实践总结

1. PostgreSQL 备份类型总览

类型 工具 级别 是否增量 是否可选库/表 典型用途
逻辑备份 pg_dump/pg_dumpall SQL/结构级 小数据量备份、迁移
物理备份 pg_basebackup 文件级 ❌(但可结合WAL) 基础库完整镜像
WAL 归档 archive_mode WAL日志 增量备份、PITR
快照备份 LVM/ZFS/云盘快照 块级 超大库快速备份
流复制备份 主从复制 实时 高可用、热备

2. 逻辑备份(pg_dump / pg_dumpall)

⭐ 场景

  • 单个 database 备份
  • 单个表备份
  • 跨主机迁移、结构变更、版本升级
  • 导出部分数据、结构

2.1 单库逻辑备份(最常用)

pg_dump -U postgres -d mydb -F c -f mydb.dump

参数说明:

  • -F c -> custom 格式,支持压缩与并行恢复
  • pg_restore 恢复速度更快

恢复:

pg_restore -U postgres -d mydb mydb.dump

2.2 单表备份

pg_dump -U postgres -d mydb -t users -F c -f users.dump

恢复:

pg_restore -U postgres -d mydb -t users users.dump

2.3 导出所有数据库(全局 + 所有库)

pg_dumpall -U postgres > all.sql

恢复:

psql -U postgres -f all.sql

3. 物理备份(pg_basebackup)

⭐ 场景

  • 完整镜像备份
  • 集群冷备
  • 搭建主从复制

完整备份

pg_basebackup -U replica -D /backup/pg -Fp -Xs -P

参数说明:

  • -Fp 文件格式(目录)
  • -Xs 备份过程中同时复制 WAL
  • -P 显示进度

恢复 = 直接复制回来(文件级别)

4. WAL 归档与增量备份

WAL(Write-Ahead Log)记录所有变更。

只要有:

  1. 1 次物理基础备份
  2. WAL 日志归档

即可实现:

  • 增量恢复
  • 时间点恢复(PITR)

4.1 启用 WAL 归档

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

5. PITR(时间点恢复)完整流程(最核心🔥)

以下是 从误删/误更新数据恢复到过去任意时刻 的完整步骤。

⭐ 前提条件

  • 一次物理备份(pg_basebackup)
  • WAL 归档启用成功

5.1 停止 PostgreSQL

systemctl stop postgresql

5.2 清空旧数据目录,用基础备份覆盖

rm -rf /var/lib/postgresql/17/main/*
cp -r /backup/pg/* /var/lib/postgresql/17/main/

5.3 创建恢复配置(PostgreSQL ≥ 12)

创建 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

5.4 启动 PostgreSQL

systemctl start postgresql

数据库会自动 replay WAL 直到指定时间。

6. 常用备份策略(企业级)

🔥 企业推荐策略(适合 99% 项目)

每日

  • 00:00:pg_basebackup(基础备份)

持续

  • WAL 归档(增量变化)

每周

  • 全量逻辑备份(pg_dump)
  • 备份存到对象存储(S3 / OSS)

每月

  • 恢复演练
  • 校验备份完整性(pg_verifybackup)

⭐ PostgreSQL 官方推荐方案

  • 物理备份 + WAL -> 主方案
  • 逻辑备份 -> 额外保障
  • 多机异地存储
  • 每 3 个月做一次恢复演练

7. 常见恢复问题(最实用)

❌ 1. archive_command 报错导致 WAL 丢失

WAL 不完整 -> 无法 PITR -> 只能用逻辑备份恢复部分数据。

❌ 2. pg_basebackup 不包含 pg_wal

解决:添加 -Xs 参数复制 WAL。

❌ 3. PostgreSQL 启动后一直 recovery

原因:

  • restore_command 路径错误
  • WAL 不完整

检查日志:

journalctl -u postgresql -f

❌ 4. 恢复后数据库是只读

你忘了删除 recovery.signal。

8. PostgreSQL 备份与恢复最佳实践

  • 启用 WAL 归档(必须)
  • 使用 pg_basebackup 做基础备份
  • 使用 pg_verifybackup 检查备份
  • WAL + 物理备份 + 逻辑备份 三层保护
  • 定期做「恢复演练」
  • 在 Kubernetes / 云环境中使用「快照备份」加速
  • 异地备份(尤其是对象存储)
  • 执行增量恢复时使用 recovery_target_time 精准恢复