目录

pgsql-33 备份与恢复

1. 概述

备份是数据库的生命线。PostgreSQL 备份分两大类,理解它们的区别是面试和实战的基础:

类型 工具 内容 特点
逻辑备份 pg_dump / pg_dumpall 导出为 SQL/自定义格式 灵活、可跨版本/跨平台、可选表,但大库慢
物理备份 pg_basebackup 复制数据文件 快、适合大库,但需同版本/同架构
PITR 物理备份 + WAL 归档 基础备份 + 增量日志 可恢复到任意时间点

对比 MySQL:MySQL 逻辑备份用 mysqldump(对应 pg_dump),物理备份用 Percona XtraBackup(对应 pg_basebackup/pgBackRest)。PG 的 PITR 基于统一的 WAL(见 WAL与检查点机制),而 MySQL 的时间点恢复需结合全量备份 + binlog 重放,机制相似但日志体系不同。

2. 逻辑备份:pg_dump / pg_restore

2.1 pg_dump(单库)

# 自定义格式(推荐!支持并行、压缩、选择性恢复)
pg_dump -U postgres -d mydb -F c -f mydb.dump

# 纯 SQL 格式(可读、可直接 psql 执行)
pg_dump -U postgres -d mydb -f mydb.sql

# 常用选项
pg_dump -d mydb --schema-only  -f schema.sql   # 只结构
pg_dump -d mydb --data-only    -f data.sql     # 只数据
pg_dump -d mydb -t orders -t users -f part.dump # 指定表
pg_dump -d mydb -F d -j 4 -f dumpdir/          # 目录格式 + 4并行(大库快)

格式说明:-F c(custom 自定义)、-F d(directory 目录,支持并行)、-F t(tar)、-F p(plain SQL 默认)。生产推荐 custom 或 directory 格式,因为支持压缩、并行和选择性恢复。

2.2 pg_dumpall(整个实例)

# 备份所有库 + 全局对象(角色、表空间)
pg_dumpall -U postgres -f all.sql
# 只备份全局对象(角色/权限),常与 pg_dump 配合
pg_dumpall --globals-only -f globals.sql

注意:pg_dump 不含角色和权限等全局对象,完整迁移需配合 pg_dumpall --globals-only。这是常见遗漏点。

2.3 恢复

# 恢复 custom/directory 格式(用 pg_restore)
pg_restore -U postgres -d mydb -c mydb.dump          # -c 先清理再恢复
pg_restore -U postgres -d newdb -j 4 mydb.dump       # 并行恢复
pg_restore -d mydb -t orders mydb.dump               # 只恢复某表

# 恢复纯 SQL 格式(直接用 psql)
psql -U postgres -d mydb -f mydb.sql

3. 物理备份:pg_basebackup

复制整个数据目录的字节级副本,适合大库和搭建从库。

pg_basebackup -h localhost -U replicator -D /backup/base -F tar -z -P -X stream
# -F tar 打包  -z 压缩  -P 显示进度  -X stream 同时流式获取备份期间产生的WAL
  • 速度快(不解析数据,直接拷文件)。
  • 要求恢复端 PG 大版本一致、CPU 架构一致
  • 是搭建流复制从库的标准手段(见 主从复制与高可用)。

4. PITR:时间点恢复(进阶重点)

PITR(Point-In-Time Recovery) = 一份基础物理备份 + 持续归档的 WAL 日志,可恢复到备份之后的任意时刻(如"误删数据前一秒")。

4.1 开启 WAL 归档

# postgresql.conf
wal_level = replica
archive_mode = on
archive_command = 'test ! -f /archive/%f && cp %p /archive/%f'   # 归档每个WAL段

4.2 恢复流程

# 1) 停库,用基础备份替换数据目录
# 2) 在数据目录创建 recovery 配置(PG 12+ 用 postgresql.conf + 标志文件)
# postgresql.conf 中设置恢复目标
restore_command = 'cp /archive/%f %p'       # 从归档取回 WAL
recovery_target_time = '2026-07-27 14:30:00' # 恢复到这个时刻(误操作前)
# 3) 创建 recovery.signal 触发恢复,然后启动
touch $PGDATA/recovery.signal
pg_ctl start
# PG 会重放 WAL 到指定时间点后停止

恢复目标还可用 recovery_target_xid(事务号)、recovery_target_lsnrecovery_target_name(还原点)。

5. 备份策略与工具

  • 小库:定期 pg_dump(自定义格式)+ 异地存储。
  • 大库/关键业务:物理备份 + WAL 归档做 PITR,定期全量 + 持续增量。
  • 生产推荐工具
    • pgBackRest:功能最全,支持增量/差异备份、并行、压缩、加密、云存储、保留策略。
    • Barman:备份管理与 PITR 一体化。
  • 3-2-1 原则:3 份副本、2 种介质、1 份异地。
  • 定期演练恢复:没验证过的备份等于没有备份。

6. 面试高频问答

Q1:逻辑备份和物理备份的区别? 逻辑备份(pg_dump)导出 SQL/数据,灵活、可跨版本跨平台、可选表,但大库慢、恢复需重建索引;物理备份(pg_basebackup)拷贝数据文件,快、适合大库,但要求同版本同架构。

Q2:pg_dump 会备份用户和权限吗? 不会。pg_dump 只备份单个库的对象,角色/权限等全局对象要用 pg_dumpall --globals-only 单独备份,完整迁移需两者配合。

Q3:什么是 PITR?依赖什么实现? 时间点恢复,依赖一份基础物理备份 + 持续归档的 WAL 日志,重放 WAL 到指定时刻,可恢复到误操作前任意时间点。

Q4:pg_dump 的哪种格式最好?为什么? custom(-F c)或 directory(-F d)格式,支持压缩、并行备份/恢复、选择性恢复单表;纯 SQL 格式只能整体顺序执行。

Q5:怎么保证备份可靠? 遵循 3-2-1 原则、开启 WAL 归档做 PITR、用 pgBackRest 等工具管理增量与保留策略,并定期演练恢复验证备份可用。

7. 下一步

学习 主从复制与高可用,构建高可用架构。