强曰为道
与天地相似,故不违。知周乎万物,而道济天下,故不过。旁行而不流,乐天知命,故不忧.
文档目录

PostgreSQL 完全指南 / 13 - 备份恢复

第 13 章 · 备份恢复

备份是 DBA 最重要的职责。本章覆盖 pg_dump、pg_basebackup、WAL 归档和时间点恢复(PITR)。


13.1 备份策略概览

方式类型适用场景恢复粒度
pg_dump逻辑备份单库/单表备份库/表/行级
pg_dumpall逻辑备份全集群备份集群级
pg_basebackup物理备份全集群热备集群级
WAL 归档连续归档PITR(时间点恢复)任意时间点
快照备份文件系统级LVM/ZFS 快照集群级

13.2 pg_dump(逻辑备份)

# 备份单个数据库(自定义格式,推荐)
pg_dump -h localhost -U postgres -Fc mydb > mydb.dump

# SQL 格式备份
pg_dump -h localhost -U postgres mydb > mydb.sql

# 压缩备份
pg_dump -h localhost -U postgres -Fc -Z 9 mydb > mydb.dump

# 备份特定表
pg_dump -h localhost -U postgres -Fc -t employees mydb > employees.dump

# 备份特定 Schema
pg_dump -h localhost -U postgres -Fc -n public mydb > public_schema.dump

# 只备份结构(不含数据)
pg_dump -h localhost -U postgres --schema-only mydb > schema.sql

# 只备份数据
pg_dump -h localhost -U postgres --data-only mydb > data.sql

# 并行备份(PG 17+)
pg_dump -h localhost -U postgres -Fc -j 4 mydb > mydb.dump

# 并行目录格式备份
pg_dump -h localhost -U postgres -Fd -j 4 -f /backup/mydb_dir mydb
格式选项特点
自定义 (-Fc)--format=custom压缩、可选择性恢复、推荐
目录 (-Fd)--format=directory并行备份/恢复、最大灵活性
SQL (-Fp)--format=plain纯 SQL 文本、可读
tar (-Ft)--format=tartar 归档

13.3 pg_restore(逻辑恢复)

# 恢复自定义格式
pg_restore -h localhost -U postgres -d newdb mydb.dump

# 恢复目录格式(并行恢复)
pg_restore -h localhost -U postgres -d newdb -j 4 /backup/mydb_dir

# 恢复特定表
pg_restore -h localhost -U postgres -d newdb -t employees mydb.dump

# 只恢复结构
pg_restore -h localhost -U postgres -d newdb --schema-only mydb.dump

# 列出备份内容
pg_restore -l mydb.dump

# SQL 格式恢复
psql -h localhost -U postgres -d newdb < mydb.sql

13.4 pg_basebackup(物理备份)

# 基本物理备份
pg_basebackup -h primary_host -U replicator -D /backup/base \
  --checkpoint=fast \
  --wal-method=stream \
  --progress \
  --verbose

# 压缩备份
pg_basebackup -h primary_host -U replicator -D /backup/base \
  --checkpoint=fast \
  --wal-method=stream \
  --compress=server-zstd \
  --progress

# tar 格式备份
pg_basebackup -h primary_host -U replicator -D /backup/base \
  --format=tar \
  --checkpoint=fast \
  --wal-method=stream \
  --compress=zstd:3

13.5 WAL 归档配置

# postgresql.conf
archive_mode = on
archive_command = 'cp %p /archive/%f'
# 或使用更安全的命令
# archive_command = 'test ! -f /archive/%f && cp %p /archive/%f'
# 或使用归档工具
# archive_command = 'pg_archivecleanup /archive %r'

# PG 17+ 增量备份支持
-- 查看归档状态
SELECT * FROM pg_stat_archiver;

13.6 时间点恢复(PITR)

# 1. 停止 PostgreSQL
pg_ctl stop

# 2. 清空数据目录(先备份!)
rm -rf /var/lib/postgresql/data/*

# 3. 从基础备份恢复
pg_basebackup 的备份解压到数据目录

# 4. 创建恢复配置
cat > /var/lib/postgresql/data/postgresql.auto.conf << EOF
restore_command = 'cp /archive/%f %p'
recovery_target_time = '2024-03-15 14:30:00+08'
recovery_target_action = 'promote'
EOF

# 5. 创建恢复信号文件(PG 12+)
touch /var/lib/postgresql/data/recovery.signal

# 6. 启动 PostgreSQL
pg_ctl start
# 数据库会恢复到指定时间点

恢复目标选项

参数说明
recovery_target_time恢复到指定时间
recovery_target_xid恢复到指定事务 ID
recovery_target_lsn恢复到指定 WAL 位置
recovery_target = 'immediate'恢复到一致性状态即停止
recovery_target_actionpause/promote/shutdown

13.7 增量备份(PG 17+)

-- PG 17 引入了原生增量备份
-- 1. 做一次全量备份
pg_basebackup -D /backup/full --checkpoint=fast --wal-method=stream

-- 2. 记录备份清单
-- 生成 backup_manifest

-- 3. 增量备份
pg_basebackup -D /backup/incr1 --incremental /backup/full/backup_manifest \
  --checkpoint=fast --wal-method=stream

13.8 备份验证

# 验证备份完整性
pg_restore --list mydb.dump

# 恢复到测试环境验证
pg_restore -h test_host -U postgres -d testdb mydb.dump

# 验证物理备份
pg_verifybackup /backup/base

业务场景

场景推荐策略
小型数据库(< 100GB)pg_dump 每日 + WAL 归档
中型数据库(100GB-1TB)pg_basebackup 每周 + WAL 归档 + 增量
大型数据库(> 1TB)pg_basebackup + 增量 + 流复制
表级恢复pg_dump -Fc(自定义格式)
灾难恢复流复制从库 + 异地备份

扩展阅读