逻辑转储备份的中心思想是:导出生成一份包含全套 SQL 命令的脚本文件。当把该文件重新回放输入至空数据库实例中时,它会以完全相同的结构与内容无损重建出备份时刻的完整数据库状态。官方为此提供了专用的逻辑导出工具 pg_dump。其极简调用格式为:
pg_dumpdbname>dumpfile
pg_dump 会将生成的 SQL 语句直接流式写出至标准输出。除纯文本脚本格式外,它还支持专用的自定义二进制归档格式(-F c)与目录归档格式(-F d),支持多进程并行压缩导出与按对象颗粒度精细恢复。
pg_dump 在本质上是一个极其精巧的常规客户端程序,支持跨网络对远程数据库执行备份。只要当前连接用户具备读权限,即可导出指定数据;若要导出全库所有对象,通常需要使用超级用户权限执行。
相较于物理备份,逻辑转储的核心优势在于跨平台与跨大版本兼容性:通过 pg_dump 导出的 SQL 脚本几乎能够无缝导入到更高版本的全新 PostgreSQL 集群中,这也是执行大版本升级迁移或从 32 位系统跨架构迁移至 64 位系统的最可靠手段。
pg_dump 生成的转储快照在逻辑上是强一致性的:它基于启动瞬间生成的全局 MVCC 快照导出数据,在导出全过程中完全不阻塞任何业务的常规并发读写操作。
对于由 pg_dump 导出的纯文本 SQL 文件,直接通过交互式终端程序 psql 导入回放:
psql -Xdbname<dumpfile
目标数据库必须在导入前预先建好。
对于采用自定义二进制格式(-F c)或目录格式(-F d)导出的归档文件,必须使用配套的官方恢复工具 pg_restore 进行恢复:
pg_restore -ddbnamedumpfile
pg_restore 允许通过 -j 选项开启多进程并发并行建表与索引构建,数倍加速大库恢复。
因为 pg_dump 仅针对单张数据库生效,它不会导出集群级别的全局对象(如数据库角色用户、全局表空间定义)。官方提供了工具 pg_dumpall,它能一次性将集群内的所有数据库以及全部全局元数据统一导出:
pg_dumpall > db.out
当数据量极大时,直接导出纯文本文件可能受限于文件系统单文件尺寸上限或占用过多磁盘空间。可以结合 Unix 管道命令(如 gzip)直接压缩输出:
pg_dump dbname | gzip > filename.gz
恢复时通过解压流直接导入:
gunzip -c filename.gz | psql dbname
此外,更推荐直接使用 pg_dump 的自定义目录格式(-F d)配合多作业并发参数(-j),能够以极快速度完成多核并行转储与恢复。