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=tar | tar 归档 |
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_action | pause/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(自定义格式) |
| 灾难恢复 | 流复制从库 + 异地备份 |
扩展阅读