2024 年 9 月 26 日: PostgreSQL 17 发布!
支持的版本:当前 (17) / 16 / 15 / 14 / 13 / 12
开发版本:devel
不支持的版本:11 / 10 / 9.6 / 9.5 / 9.4 / 9.3 / 9.2 / 9.1 / 9.0 / 8.4 / 8.3 / 8.2 / 8.1 / 8.0 / 7.4 / 7.3 / 7.2 / 7.1

pg_dump

pg_dump — 将 PostgreSQL 数据库提取到脚本文件或其他归档文件

概要

pg_dump [连接选项...] [选项...] [数据库名]

描述

pg_dump 是一款用于备份 PostgreSQL 数据库的实用程序。即使数据库正在被同时使用,它也能创建一致的备份。 pg_dump 不会阻止其他用户访问数据库(读取或写入)。

pg_dump 只转储单个数据库。要备份整个集群,或备份集群中所有数据库共有的全局对象(例如角色和表空间),请使用 pg_dumpall.

转储可以输出到脚本或归档文件格式。脚本转储是纯文本文件,包含用于将数据库重建到保存时的状态所需的 SQL 命令。要从这样的脚本恢复,请将其输入到 psql。脚本文件可用于在其他机器和体系结构上重建数据库;进行一些修改后,甚至可以在其他 SQL 数据库产品上使用。

必须将替代归档文件格式与 pg_restore 一起使用来重建数据库。它们允许 pg_restore 选择性地恢复内容,甚至在恢复之前重新排序项目。归档文件格式被设计为跨体系结构可移植。

当与归档文件格式之一结合使用并与 pg_restore 结合使用时,pg_dump 提供了灵活的归档和传输机制。 pg_dump 可用于备份整个数据库,然后 pg_restore 可用于检查归档和/或选择要恢复的数据库部分。最灵活的输出文件格式是 自定义 格式 (-Fc) 和 目录 格式 (-Fd)。它们允许在恢复期间选择和重新排序所有存档项目,支持并行恢复,并且默认情况下会被压缩。 目录 格式是唯一支持并行转储的格式。

在运行 pg_dump 时,应检查输出以查找任何警告(打印到标准错误),尤其要参考以下限制。

选项

以下命令行选项控制输出的内容和格式。

数据库名

指定要转储的数据库的名称。如果未指定,则使用环境变量 PGDATABASE。如果未设置,则使用为连接指定的用户名。

-a
--data-only

仅转储数据,不转储模式(数据定义)。转储表数据、大对象和序列值。

此选项类似于,但由于历史原因,与指定 --section=data 不完全相同。

-b
--large-objects
--blobs (已弃用)

在转储中包含大对象。这是默认行为,除非指定 --schema--table--schema-only。因此,-b 开关仅用于将大对象添加到已请求特定模式或表的转储中。请注意,大对象被视为数据,因此在使用 --data-only 时会被包含,但在使用 --schema-only 时不会。

-B
--no-large-objects
--no-blobs (已弃用)

在转储中排除大对象。

当同时给出 -b-B 时,行为是输出大对象,在转储数据时,请参阅 -b 文档。

-c
--clean

在输出创建它们的命令之前,输出用于 DROP 所有转储数据库对象的命令。此选项在恢复将覆盖现有数据库时很有用。如果目标数据库中不存在任何对象,则在恢复期间将报告可忽略的错误消息,除非还指定了 --if-exists

此选项在发出存档(非文本)输出文件时被忽略。对于存档格式,您可以在调用 pg_restore 时指定此选项。

-C
--create

从创建一个数据库本身的命令开始输出,然后重新连接到已创建的数据库。(使用此形式的脚本,在运行脚本之前,您连接到的目标安装中的数据库无关紧要。)如果还指定了 --clean,则脚本会在重新连接到目标数据库之前将其删除并重新创建。

使用 --create,输出还包括数据库的注释(如果有),以及任何特定于此数据库的配置变量设置,即任何提到此数据库的 ALTER DATABASE ... SET ...ALTER ROLE ... IN DATABASE ... SET ... 命令。还将转储数据库本身的访问权限,除非指定了 --no-acl

此选项在发出存档(非文本)输出文件时被忽略。对于存档格式,您可以在调用 pg_restore 时指定此选项。

-e 模式
--extension=模式

仅转储与 模式 匹配的扩展。当未指定此选项时,将转储目标数据库中的所有非系统扩展。可以通过编写多个 -e 开关来选择多个扩展。 模式 参数被解释为一个模式,遵循与 psql\d 命令所用规则相同的规则(参见 模式),因此可以通过在模式中编写通配符来选择多个扩展。使用通配符时,请注意在需要时引用模式以防止 shell 展开通配符。

如果其扩展由 --extension 指定,则由 pg_extension_config_dump 注册的任何配置关系都包含在转储中。

注意

当指定了 -e 时,pg_dump 不会尝试转储所选扩展可能依赖的任何其他数据库对象。因此,无法保证特定扩展转储的结果可以单独成功恢复到干净的数据库中。

-E 编码
--encoding=编码

以指定的字符集编码创建转储。默认情况下,转储以数据库编码创建。(另一种获得相同结果的方法是将 PGCLIENTENCODING 环境变量设置为所需的转储编码。)受支持的编码在 第 23.3.1 节 中描述。

-f 文件
--file=文件

将输出发送到指定的文件。对于基于文件的输出格式,可以省略此参数,在这种情况下将使用标准输出。但是,对于目录输出格式,必须给出此参数,其中它指定目标目录而不是文件。在这种情况下,目录由 pg_dump 创建,并且在之前必须不存在。

-F 格式
--format=格式

选择输出的格式。 格式 可以是以下之一

p
plain

输出一个纯文本SQL脚本文件(默认)。

c
custom

输出一个自定义格式的归档,适合输入到 pg_restore 中。与目录输出格式一起,这是最灵活的输出格式,因为它允许在恢复期间手动选择和重新排序存档项目。此格式默认情况下也被压缩。

d
directory

输出一个目录格式的归档,适合输入到 pg_restore 中。这将创建一个目录,其中包含每个要转储的表和大型对象的一个文件,以及一个名为目录文件的文件,该文件以机器可读格式描述转储的对象,pg_restore 可以读取。目录格式的归档可以使用标准的 Unix 工具进行操作;例如,可以使用 gziplz4zstd 工具压缩未压缩的存档中的文件。此格式默认情况下使用 gzip 进行压缩,并且还支持并行转储。

t
tar

输出一个适合作为 pg_restore 输入的 tar 格式存档。tar 格式与目录格式兼容:解压缩 tar 格式存档会生成有效的目录格式存档。但是,tar 格式不支持压缩。此外,使用 tar 格式时,表数据项的相对顺序在还原过程中不能更改。

-j njobs
--jobs=njobs

通过同时转储 njobs 个表来并行运行转储。此选项可能会减少执行转储所需的时间,但也会增加数据库服务器的负载。您只能将此选项与目录输出格式一起使用,因为这是唯一允许多个进程同时写入数据的输出格式。

pg_dump 将打开 njobs + 1 个数据库连接,因此请确保您的 max_connections 设置足够高以容纳所有连接。

在运行并行转储时请求对数据库对象的独占锁可能会导致转储失败。原因是 pg_dump 主进程请求对工作进程稍后要转储的对象的共享锁 (ACCESS SHARE),以确保在转储运行时没有人删除它们并使其消失。如果另一个客户端随后请求对表的独占锁,则不会授予该锁,而是会排队等待主进程的共享锁释放。因此,任何其他对该表的访问也不会被授予,并且会在独占锁请求之后排队。这包括试图转储该表的工作进程。没有任何预防措施,这将是一个典型的死锁情况。为了检测此冲突,pg_dump 工作进程使用 NOWAIT 选项请求另一个共享锁。如果工作进程未被授予此共享锁,则其他人一定是在此期间请求了独占锁,并且无法继续转储,因此 pg_dump 别无选择,只能中止转储。

要执行并行转储,数据库服务器需要支持同步快照,这是一个在 PostgreSQL 9.2 中为主服务器和 10 为备用服务器引入的功能。使用此功能,数据库客户端可以确保它们看到相同的数据集,即使它们使用不同的连接。 pg_dump -j 使用多个数据库连接;它使用主进程连接到数据库一次,并且为每个工作作业再次连接。如果没有同步快照功能,不同的工作作业不能保证在每个连接中看到相同的数据,这会导致不一致的备份。

-n pattern
--schema=pattern

仅转储与 pattern 匹配的模式;这会选择模式本身及其包含的所有对象。当未指定此选项时,将转储目标数据库中的所有非系统模式。可以通过编写多个 -n 开关来选择多个模式。 pattern 参数被解释为一个模式,遵循与 psql\d 命令使用的相同规则(见 Patterns),因此也可以通过在模式中写入通配符来选择多个模式。使用通配符时,请注意在需要时引用模式以防止 shell 展开通配符;见 Examples 如下。

注意

当指定 -n 时,pg_dump 不会尝试转储所选模式可能依赖的任何其他数据库对象。因此,不能保证特定模式转储的结果可以成功地单独还原到干净的数据库中。

注意

当指定 -n 时,不会转储大型对象等非模式对象。您可以使用 --large-objects 开关将大型对象添加回转储。

-N pattern
--exclude-schema=pattern

不要转储任何与 pattern 匹配的模式。模式根据与 -n 相同的规则进行解释。 -N 可以多次给出,以排除与多个模式匹配的模式。

当同时给出 -n-N 时,行为是仅转储至少与一个 -n 开关匹配但与任何 -N 开关都不匹配的模式。如果 -N 出现而没有 -n,则与 -N 匹配的模式将从正常的转储中排除。

-O
--no-owner

不要输出设置对象所有权以匹配原始数据库的命令。默认情况下,pg_dump 会发出 ALTER OWNERSET SESSION AUTHORIZATION 语句来设置创建的数据库对象的所有权。除非脚本由超级用户(或拥有脚本中所有对象的相同用户)启动,否则这些语句将失败。要创建一个可以由任何用户还原但会将该用户设置为所有对象所有权的脚本,请指定 -O

此选项在发出存档(非文本)输出文件时被忽略。对于存档格式,您可以在调用 pg_restore 时指定此选项。

-R
--no-reconnect

此选项已过时,但为了向后兼容性而仍然接受。

-s
--schema-only

仅转储对象定义(模式),不转储数据。

此选项是 --data-only 的反义词。它类似于,但由于历史原因不完全等同于,指定 --section=pre-data --section=post-data

(不要将此与 --schema 选项混淆,该选项以不同的含义使用单词 schema。)

要仅排除数据库中部分表的表数据,请参阅 --exclude-table-data

-S username
--superuser=username

指定在禁用触发器时使用的超级用户用户名。这仅在使用 --disable-triggers 时才相关。(通常,最好省略此选项,而是以超级用户身份启动生成的脚本。)

-t pattern
--table=pattern

仅转储名称与 pattern 匹配的表。可以通过编写多个 -t 开关来选择多个表。 pattern 参数被解释为一个模式,遵循与 psql\d 命令使用的相同规则(见 Patterns),因此也可以通过在模式中写入通配符来选择多个表。使用通配符时,请注意在需要时引用模式以防止 shell 展开通配符;见 Examples 如下。

除了表之外,此选项还可用于转储匹配的视图、物化视图、外部表和序列的定义。它不会转储视图或物化视图的内容,并且外部表的内容只有在使用 --include-foreign-data 指定相应的外部服务器时才会转储。

当使用 -t 时,-n-N 开关无效,因为通过 -t 选择的表将被转储,而不管这些开关如何,并且非表对象将不会被转储。

注意

当指定 -t 时,pg_dump 不会尝试转储所选表可能依赖的任何其他数据库对象。因此,不能保证特定表转储的结果可以成功地单独还原到干净的数据库中。

-T pattern
--exclude-table=pattern

不要转储任何与 pattern 匹配的表。模式根据与 -t 相同的规则进行解释。 -T 可以多次给出,以排除与多个模式匹配的表。

当同时给出 -t-T 时,行为是仅转储至少与一个 -t 开关匹配但与任何 -T 开关都不匹配的表。如果 -T 出现而没有 -t,则与 -T 匹配的表将从正常的转储中排除。

-v
--verbose

指定详细模式。这将导致 pg_dump 将详细的对象注释和启动/停止时间输出到转储文件,并将进度消息输出到标准错误。重复该选项会导致其他调试级别消息出现在标准错误中。

-V
--version

打印 pg_dump 版本并退出。

-x
--no-privileges
--no-acl

防止转储访问权限(授予/撤销命令)。

-Z level
-Z method[:detail]
--compress=level
--compress=method[:detail]

指定要使用的压缩方法和/或压缩级别。压缩方法可以设置为 gziplz4zstdnone(不压缩)。可以可选地指定一个压缩详细信息字符串。如果详细信息字符串是整数,它将指定压缩级别。否则,它应该是一个逗号分隔的项目列表,每个项目都采用 keywordkeyword=value 的形式。目前,支持的关键字是 levellong

如果未指定压缩级别,将使用默认压缩级别。如果仅指定一个级别而没有提及算法,则如果级别大于 0,将使用 gzip 压缩,如果级别为 0,则不使用压缩。

对于自定义和目录存档格式,这指定了对单个表数据段的压缩,默认是使用 gzip 以中等级别进行压缩。对于纯文本输出,设置非零压缩级别会导致整个输出文件被压缩,就好像它被送入 gziplz4zstd 一样;但默认是不压缩。使用 zstd 压缩时,long 模式可能会提高压缩率,但代价是增加内存使用量。

tar 存档格式目前根本不支持压缩。

--binary-upgrade

此选项用于就地升级实用程序。不建议或不支持将其用于其他目的。此选项的行为可能会在将来的版本中更改,恕不另行通知。

--column-inserts
--attribute-inserts

将数据转储为带有显式列名的 INSERT 命令(INSERT INTO table (column, ...) VALUES ...)。这会使恢复非常缓慢;它主要用于创建可加载到非 PostgreSQL 数据库中的转储。恢复过程中的任何错误只会导致有问题的 INSERT 命令中的一部分行丢失,而不是整个表内容。

--disable-dollar-quoting

此选项禁用对函数体使用美元引用,并强制使用 SQL 标准字符串语法引用它们。

--disable-triggers

此选项仅在创建仅数据转储时相关。它指示 pg_dump 包含命令以在恢复数据时暂时禁用目标表上的触发器。如果您在表上具有引用完整性检查或其他触发器,而您不想在数据恢复期间调用它们,请使用此选项。

目前,为 --disable-triggers 发出的命令必须以超级用户身份执行。因此,您还应该使用 -S 指定超级用户名称,或者最好注意以超级用户身份启动生成的脚本。

此选项在发出存档(非文本)输出文件时被忽略。对于存档格式,您可以在调用 pg_restore 时指定此选项。

--enable-row-security

此选项仅在转储具有行安全性的表的內容时相关。默认情况下,pg_dump 会将 row_security 设置为关闭,以确保从表中转储所有数据。如果用户没有足够的权限绕过行安全性,则会抛出错误。此参数指示 pg_dumprow_security 设置为打开,允许用户转储他们有权访问的表內容部分。

请注意,如果您目前使用此选项,您可能还需要将转储设置为 INSERT 格式,因为恢复过程中的 COPY FROM 不支持行安全性。

--exclude-extension=pattern

不要转储与 pattern 匹配的任何扩展。该模式根据与 -e 相同的规则进行解释。可以多次给出 --exclude-extension 来排除与多个模式匹配的扩展。

当同时给出 -e--exclude-extension 时,行为是仅转储至少匹配一个 -e 开关但不匹配任何 --exclude-extension 开关的扩展。如果 --exclude-extension 出现在没有 -e 的情况下,那么与 --exclude-extension 匹配的扩展将从正常的转储中排除。

--exclude-table-and-children=pattern

这与 -T/--exclude-table 选项相同,只是它还排除了与 pattern 匹配的表的任何分区或继承子表。

--exclude-table-data=pattern

不要转储与 pattern 匹配的任何表的數據。该模式根据与 -t 相同的规则进行解释。可以多次给出 --exclude-table-data 来排除与多个模式匹配的表。当您需要特定表的定义,但不需要其中的數據时,此选项很有用。

要排除数据库中所有表的數據,请参阅 --schema-only

--exclude-table-data-and-children=pattern

这与 --exclude-table-data 选项相同,只是它还排除了与 pattern 匹配的表的任何分区或继承子表的數據。

--extra-float-digits=ndigits

在转储浮点數據时,使用指定的 extra_float_digits 值,而不是最大可用精度。为备份目的而进行的例行转储不应使用此选项。

--filter=filename

指定一个文件名,从中读取要包含或排除在转储中的对象的模式。这些模式根据与相应选项相同的规则进行解释:-t/--table--table-and-children-T/--exclude-table--exclude-table-and-children 用于表,-n/--schema-N/--exclude-schema 用于模式,--include-foreign-data 用于外国服务器上的數據,--exclude-table-data--exclude-table-data-and-children 用于表數據,以及 -e/--extension--exclude-extension 用于扩展。要从 STDIN 读取,请使用 - 作为文件名。--filter 选项可以与上面列出的选项一起使用,用于包含或排除对象,也可以多次指定多个过滤器文件。

该文件在每行列出一个对象模式,格式如下

{ include | exclude } { extension | foreign_data | table | table_and_children | table_data | table_data_and_children | schema } PATTERN

第一个关键字指定与模式匹配的对象是包含还是排除。第二个关键字指定使用模式过滤的对象类型

  • extension: 扩展。这与 -e/--extension--exclude-extension 选项类似。

  • foreign_data: 外国服务器上的數據。这与 --include-foreign-data 选项类似。此关键字只能与 include 关键字一起使用。

  • table: 表。这与 -t/--table-T/--exclude-table 选项类似。

  • table_and_children: 包括任何分区或继承子表的表。这与 --table-and-children--exclude-table-and-children 选项类似。

  • table_data: 与 pattern 匹配的任何表的表數據。这与 --exclude-table-data 选项类似。此关键字只能与 exclude 关键字一起使用。

  • table_data_and_children: 与 pattern 匹配的任何表的表數據,以及这些表的任何分区或继承子表。这与 --exclude-table-data-and-children 选项类似。此关键字只能与 exclude 关键字一起使用。

  • schema: 模式。这与 -n/--schema-N/--exclude-schema 选项类似。

# 开头的行被视为注释并被忽略。注释也可以放在对象模式行的后面。空行也会被忽略。有关如何在模式中执行引用的方法,请参阅 Patterns

示例文件列在下面的 Examples 部分。

--if-exists

--clean 模式下使用 DROP ... IF EXISTS 命令删除对象。这会抑制可能报告的 不存在 错误。除非还指定了 --clean,否则此选项无效。

--include-foreign-data=foreignserver

转储任何与 foreignserver 模式匹配的外国服务器的外国表的數據。可以通过编写多个 --include-foreign-data 开关来选择多个外国服务器。此外,foreignserver 参数根据 psql\d 命令所使用的相同规则进行解释(请参阅 Patterns),因此可以通过在模式中编写通配符来选择多个外国服务器。使用通配符时,请注意在需要时引用模式以防止 shell 展开通配符;请参阅下面的 Examples。唯一的例外是空模式不允许。

注意

--include-foreign-data 中使用通配符可能会导致访问意外的外国服务器。此外,要安全地使用此选项,请确保命名服务器必须具有受信任的所有者。

注意

当指定 --include-foreign-data 时,pg_dump 不会检查外国表是否可写。因此,不能保证外国表转储的结果能够成功恢复。

--inserts

将数据转储为 INSERT 命令(而不是 COPY)。这会使恢复非常缓慢;它主要用于创建可加载到非 PostgreSQL 数据库中的转储。恢复过程中的任何错误只会导致有问题的 INSERT 命令中的一部分行丢失,而不是整个表内容。请注意,如果您重新排列了列顺序,则恢复可能会完全失败。 --column-inserts 选项可以防止列顺序更改,尽管速度更慢。

--load-via-partition-root

在转储表分区數據时,使 COPYINSERT 语句的目标为包含它的分区层次结构的根,而不是分区本身。这会导致在加载數據时,为每行重新确定适当的分区。当在服务器上恢复數據时,这可能很有用,因为行并不总是与它们在原始服务器上的分区相同。例如,如果分区列的类型为 text,并且两个系统对用于对分区列进行排序的排序规则的定义不同,则可能会发生这种情况。

--lock-wait-timeout=timeout

不要无限期地等待在转储开始时获取共享表锁。如果在指定的 timeout 内无法锁定表,则改为失败。超时可以以 SET statement_timeout 接受的任何格式指定。(允许的格式因您从中转储的服务器版本而异,但所有版本都接受毫秒数的整数。)

--no-comments

不要转储注释。

--no-publications

不要转储发布。

--no-security-labels

不要转储安全标签。

--no-subscriptions

不要转储订阅。

--no-sync

默认情况下,pg_dump 会等待所有文件安全地写入磁盘。此选项会导致 pg_dump 返回而不等待,这更快,但意味着随后的操作系统崩溃可能会导致转储损坏。通常,此选项对于测试很有用,但不应在从生产安装中转储數據时使用。

--no-table-access-method

不要输出命令来选择表访问方法。使用此选项,所有对象将在恢复过程中创建为默认的表访问方法。

此选项在发出存档(非文本)输出文件时被忽略。对于存档格式,您可以在调用 pg_restore 时指定此选项。

--no-tablespaces

不要输出命令来选择表空间。使用此选项,所有对象将在恢复过程中创建为默认的表空间。

此选项在发出存档(非文本)输出文件时被忽略。对于存档格式,您可以在调用 pg_restore 时指定此选项。

--no-toast-compression

不要输出命令来设置TOAST压缩方法。使用此选项,所有列将使用默认压缩设置进行恢复。

--no-unlogged-table-data

不要转储未记录表的內容和序列。此选项不会影响是否转储表和序列定义(模式);它只会抑制转储表和序列數據。未记录表和序列中的數據在从备用服务器转储时始终被排除。

--on-conflict-do-nothing

INSERT命令中添加ON CONFLICT DO NOTHING。除非同时指定了--inserts--column-inserts--rows-per-insert,否则此选项无效。

--quote-all-identifiers

强制对所有标识符进行引用。建议在从 PostgreSQL 主版本与 pg_dump 不同的服务器转储数据库时,或当输出意图加载到不同主版本的服务器时使用此选项。默认情况下,pg_dump 只引用在其自身主版本中是保留字的标识符。这在处理其他版本的服务器时有时会导致兼容性问题,这些服务器可能具有略微不同的保留字集。使用--quote-all-identifiers可以防止此类问题,但代价是转储脚本的可读性降低。

--rows-per-insert=nrows

将数据转储为 INSERT 命令(而不是 COPY)。控制每个 INSERT 命令的最大行数。指定的数值必须大于零。还原期间的任何错误只会导致有问题的INSERT的一部分行丢失,而不是整个表的全部内容。

--section=sectionname

只转储指定的段。段名称可以是pre-datadatapost-data。此选项可以指定多次以选择多个段。默认情况下,转储所有段。

数据段包含实际的表数据、大对象内容和序列值。数据后的项目包括索引、触发器、规则和约束的定义,但不包括已验证的检查约束。数据前的项目包括所有其他数据定义项目。

--serializable-deferrable

为转储使用serializable 事务,以确保所使用的快照与数据库的后续状态一致;但通过等待事务流中没有异常存在的点来做到这一点,因此不会有转储失败或导致其他事务因serialization_failure而回滚的风险。有关事务隔离和并发控制的更多信息,请参见第 13 章

对于仅用于灾难恢复的转储,此选项没有好处。对于用于加载数据库副本以进行报告或其他只读负载共享的转储,它可能有用,而原始数据库将继续更新。如果没有它,转储可能反映的状态与最终提交的事务的任何串行执行不一致。例如,如果使用批处理技术,批处理可能在转储中显示为已关闭,而批处理中的所有项目都不会出现。

如果在启动 pg_dump 时没有活动读写事务,此选项将没有区别。如果存在活动读写事务,转储的开始可能会延迟不确定的时间。运行后,有无开关的性能相同。

--snapshot=snapshotname

在转储数据库时使用指定的同步快照(有关更多详细信息,请参见表 9.98)。

当需要将转储与逻辑复制槽(请参见第 47 章)或并发会话同步时,此选项很有用。

在并行转储的情况下,将使用此选项定义的快照名称,而不是获取新的快照。

--strict-names

要求每个扩展(-e/--extension)、模式(-n/--schema)和表(-t/--table)模式至少匹配要转储的数据库中的一个扩展/模式/表。这也适用于与--filter一起使用的过滤器。请注意,如果所有扩展/模式/表模式都没有匹配,pg_dump 会生成错误,即使没有--strict-names也是如此。

此选项对--exclude-extension-N/--exclude-schema-T/--exclude-table--exclude-table-data没有影响。排除模式未匹配任何对象不被视为错误。

--sync-method=method

当设置为fsync(默认值)时,pg_dump --format=directory 将递归打开并同步存档目录中的所有文件。

在 Linux 上,可以使用syncfs 来代替,要求操作系统同步包含存档目录的整个文件系统。有关使用syncfs时需要注意的注意事项,请参见recovery_init_sync_method

当使用--no-sync--format 未设置为directory时,此选项无效。

--table-and-children=pattern

这与-t/--table选项相同,只是它还包括与pattern匹配的表的任何分区或继承子表。

--use-set-session-authorization

输出 SQL 标准 SET SESSION AUTHORIZATION 命令,而不是 ALTER OWNER 命令来确定对象所有权。这使转储更符合标准,但根据转储中对象的记录,可能无法正确还原。此外,使用SET SESSION AUTHORIZATION的转储肯定需要超级用户权限才能正确还原,而ALTER OWNER需要更少的权限。

-?
--help

显示有关pg_dump 命令行参数的帮助,然后退出。

以下命令行选项控制数据库连接参数。

-d dbname
--dbname=dbname

指定要连接的数据库的名称。这等效于在命令行上指定dbname作为第一个非选项参数。 dbname可以是连接字符串。如果是这样,连接字符串参数将覆盖任何冲突的命令行选项。

-h host
--host=host

指定运行服务器的机器的主机名。如果值以斜杠开头,则将其用作 Unix 域套接字的目录。默认值取自PGHOST环境变量(如果已设置),否则尝试 Unix 域套接字连接。

-p port
--port=port

指定服务器正在侦听连接的 TCP 端口或本地 Unix 域套接字文件扩展名。默认为PGPORT环境变量(如果已设置),或编译时默认值。

-U username
--username=username

要连接的用户名称。

-w
--no-password

从不发出密码提示。如果服务器需要密码身份验证,而密码无法通过其他方式(例如.pgpass文件)获得,则连接尝试将失败。此选项在没有用户参与输入密码的批处理作业和脚本中很有用。

-W
--password

强制pg_dump在连接到数据库之前提示输入密码。

此选项从不必要,因为如果服务器要求密码身份验证,pg_dump 会自动提示输入密码。但是,pg_dump 会浪费一次连接尝试来发现服务器需要密码。在某些情况下,键入-W以避免额外的连接尝试是值得的。

--role=rolename

指定要用于创建转储的角色名称。此选项导致pg_dump在连接到数据库后发出SET ROLE rolename命令。当经过身份验证的用户(由-U指定)缺少pg_dump需要的权限时,但可以切换到具有所需权限的角色时,此选项很有用。一些安装有禁止直接以超级用户身份登录的策略,使用此选项允许在不违反策略的情况下进行转储。

环境

PGDATABASE
PGHOST
PGOPTIONS
PGPORT
PGUSER

默认连接参数。

PG_COLOR

指定是否在诊断消息中使用颜色。可能的值是alwaysautonever

此实用程序(与大多数其他 PostgreSQL 实用程序一样)还使用 libpq 支持的环境变量(请参见第 32.15 节)。

诊断

pg_dump 在内部执行 SELECT 语句。如果您在运行 pg_dump 时遇到问题,请确保您能够使用例如psql从数据库中选择信息。此外,libpq 前端库使用的任何默认连接设置和环境变量都适用。

pg_dump 的数据库活动通常由累积统计系统收集。如果这是不可取的,您可以通过PGOPTIONSALTER USER命令将参数track_counts设置为 false。

备注

如果您的数据库集群对 template1 数据库有任何本地添加,请谨慎地将 pg_dump 的输出还原到一个真正的空数据库中;否则,您可能会因添加对象的重复定义而出现错误。要创建一个没有本地添加的空数据库,请从 template0 而不是 template1 复制,例如

CREATE DATABASE foo WITH TEMPLATE template0;

当选择仅数据转储并使用--disable-triggers选项时,pg_dump 会发出命令在插入数据之前禁用用户表上的触发器,然后发出命令在数据插入后重新启用触发器。如果还原在中间停止,系统目录可能处于错误状态。

pg_dump 生成的转储文件不包含优化器用于制定查询规划决策的统计信息。因此,建议在从转储文件还原后运行 ANALYZE 以确保最佳性能;有关更多信息,请参见第 24.1.3 节第 24.1.6 节

因为 pg_dump 用于将数据传输到更新版本的 PostgreSQL,所以可以预期 pg_dump 的输出可以加载到比 pg_dump 版本更新的 PostgreSQL 服务器版本中。 pg_dump 也可以从比其自身版本更旧的 PostgreSQL 服务器中转储数据。(目前,支持回溯到版本 9.2 的服务器。)但是,pg_dump 无法从比其自身主要版本更新的 PostgreSQL 服务器中转储数据;它将拒绝尝试,而不是冒着生成无效转储的风险。此外,不能保证 pg_dump 的输出可以加载到较旧的主要版本的服务器中 - 即使转储是从该版本的服务器中获取的。将转储文件加载到较旧的服务器中可能需要手动编辑转储文件以删除较旧的服务器无法理解的语法。建议在跨版本情况下使用 --quote-all-identifiers 选项,因为它可以防止由于不同 PostgreSQL 版本中保留字列表不同而引起的问题。

在转储逻辑复制订阅时,pg_dump 将生成使用 CREATE SUBSCRIPTION 命令的 connect = false 选项,以便还原订阅不会为创建复制槽或初始表复制而进行远程连接。这样,转储可以在不需要访问远程服务器的网络的情况下进行还原。然后,用户需要以适当的方式重新激活订阅。如果相关主机已更改,则可能需要更改连接信息。在启动新的完整表复制之前,截断目标表也可能合适。如果用户打算在刷新期间复制初始数据,则必须使用 two_phase = false 创建槽。在初始同步之后,如果订阅最初是使用 two_phase = true 选项创建的,则订阅者将自动启用 two_phase 选项。

示例

将名为 mydb 的数据库转储到 SQL 脚本文件中

$ pg_dump mydb > db.sql

将此类脚本重新加载到名为 newdb 的(新创建的)数据库中

$ psql -d newdb -f db.sql

将数据库转储到自定义格式的归档文件中

$ pg_dump -Fc mydb > db.dump

将数据库转储到目录格式的归档中

$ pg_dump -Fd mydb -f dumpdir

使用 5 个工作进程并行地将数据库转储到目录格式的归档中

$ pg_dump -Fd mydb -j 5 -f dumpdir

将归档文件重新加载到名为 newdb 的(新创建的)数据库中

$ pg_restore -d newdb db.dump

将归档文件重新加载到与转储来源相同的数据库中,丢弃该数据库的当前内容

$ pg_restore -d postgres --clean --create db.dump

转储名为 mytab 的单个表

$ pg_dump -t mytab mydb > db.sql

转储 detroit 架构中所有名称以 emp 开头的表,除了名为 employee_log 的表

$ pg_dump -t 'detroit.emp*' -T detroit.employee_log mydb > db.sql

转储所有名称以 eastwest 开头并以 gsm 结尾的架构,排除任何名称包含 test 的架构

$ pg_dump -n 'east*gsm' -n 'west*gsm' -N '*test*' mydb > db.sql

相同,使用正则表达式符号合并开关

$ pg_dump -n '(east|west)*gsm' -N '*test*' mydb > db.sql

转储除名称以 ts_ 开头的表以外的所有数据库对象

$ pg_dump -T 'ts_*' mydb > db.sql

要在 -t 和相关开关中指定大写或混合大小写的名称,需要将名称用双引号引起来;否则它将折叠为小写(参见 Patterns)。但是双引号对于 shell 来说是特殊的,因此反过来它们也必须用引号引起来。因此,要转储具有混合大小写名称的单个表,您需要类似以下内容

$ pg_dump -t "\"MixedCaseName\"" mydb > mytab.sql

要转储所有名称以 mytable 开头的表,除了 mytable2 表,请指定一个名为 filter.txt 的过滤器文件,内容如下

include table mytable*
exclude table mytable2
$ pg_dump --filter=filter.txt mydb > db.sql

另请参见

pg_dumpallpg_restorepsql

提交更正

如果您在文档中发现任何不正确的内容,不符合您对特定功能的体验,或者需要进一步澄清,请使用 此表格 报告文档问题。