PostgreSQL 19: pg_dumpall 支持非文本输出格式

John Doe 三月 6, 2026

多年来,pg_dumpall作为官方集群级逻辑备份工具,仅能输出纯文本 SQL 脚本,无法复用pg_dump沉淀多年的压缩、并行、选择性恢复等企业级能力;而单库备份工具pg_dump虽功能完善,却无法处理角色、表空间等集群级全局对象。

image

特性提交日志

为 pg_dumpall 添加非文本输出格式。

pg_dumpall 现在除了可以生成纯文本 SQL 脚本外,还支持输出自定义格式、目录格式或 tar 格式。

使用非文本格式时,pg_dumpall 会创建一个目录,其中包含:

  • toc.glo:以自定义格式存储的全局数据(角色和表空间)
  • map.dat:数据库 OID 与名称之间的映射关系
  • databases/:按 OID 命名、每个数据库单独归档的子目录

pg_restore 已扩展支持处理这类 pg_dumpall 归档文件,会先恢复全局对象,再恢复各个数据库。可以使用--globals-only选项只恢复全局对象。

这一特性支持对 pg_dumpall 输出进行并行恢复,并支持从整集群备份中选择性恢复单个数据库。

讨论:https://postgr.es/m/cb103623-8ee6-4ba5-a2c9-f32e3a4933fa@dunslane.net

示例

使用 pg_dumpall 备份

首先是兼容原有逻辑的默认纯文本格式备份,该用法使用默认的纯文本格式,输出纯文本 SQL 脚本,完全兼容历史用法,生成的脚本可直接通过 psql 执行恢复。

pg_dumpall > db.out

针对本次新增的多格式备份能力,官方提供了三类核心用法。目录格式集群备份属于非纯文本格式,-f 指定的路径为输出目录,此参数在所有非纯文本格式下均为必填项,最终会生成适配并行备份与恢复的目录格式归档。

pg_dumpall --format=directory -f db.out

自定义格式集群备份同样为非纯文本格式,必须通过 -f 指定输出目录,备份完成后会为集群内每个数据库生成对应 OID 命名的.dmp格式归档文件。

pg_dumpall --format=custom -f db.out

tar 格式集群备份也属于非纯文本格式,必须通过 - f 指定输出目录,备份后会为每个数据库生成对应 OID 命名的.tar格式归档文件。

pg_dumpall --format=tar -f db.out

使用 pg_restore 恢复

非纯文本格式全集群完整恢复可一键完成 pg_dumpall 生成归档的全集群恢复,其中 -C/--create 参数为恢复多库归档时的必填项,执行后会自动还原全局对象、创建对应数据库并恢复全量数据。

pg_restore db.out -d postgres -C

选择性恢复场景下,可通过 --exclude-database 参数跳过指定数据库,恢复时会跳过名称匹配对应 pattern 的数据库,可多次指定该参数实现多库过滤,无需修改原备份文件。

pg_restore db.out -d postgres -C --exclude-database=pattern

仅恢复全局对象的场景,该命令仅还原归档中的全局角色、表空间内容,不会恢复业务数据库,该参数仅适配 pg_dumpall 生成的非纯文本格式归档。

pg_restore --globals-only 归档路径

注意

非 plain 纯文本格式下,执行 pg_dumpall 必须指定 -f/--file 参数,不可省略;

恢复 pg_dumpall 生成的多库归档时,必须指定 -C/--create 参数;

--globals-only 参数不可与 --clean--data-only--schema-only 等参数共用。

非常不错的体验,感谢所有参与的社区人员。

参考

提交日志:https://git.postgresql.org/pg/commitdiff/763aaa06f03401584d07db71256fc0ab47235cce