支持的版本:当前 (17) / 16 / 15 / 14 / 13
开发版本:devel
不支持的版本:12 / 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 时,应检查输出中是否有任何警告(在标准错误上打印),尤其是在考虑到下面列出的限制时。

选项

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

dbname

指定要转储的数据库的名称。如果未指定此项,则使用环境变量 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

输出一种 tar 格式的归档文件,适用于输入到 pg_restore 中。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 命令使用的相同规则解释为模式(请参见 模式),因此也可以通过在模式中写入通配符来选择多个模式。使用通配符时,请注意在必要时引用模式,以防止 shell 扩展通配符;请参见下面的 示例

注意

如果指定了 -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 选项混淆,该选项以不同的含义使用单词“模式”。)

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

-S username
--superuser=username

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

-t pattern
--table=pattern

仅转储名称与 pattern 匹配的表。可以通过写入多个 -t 开关来选择多个表。 pattern 参数将根据 psql\d 命令使用的相同规则解释为模式(请参见 模式),因此也可以通过在模式中写入通配符来选择多个表。使用通配符时,请注意在必要时引用模式,以防止 shell 扩展通配符;请参见下面的 示例

除了表之外,此选项还可用于转储匹配的视图、物化视图、外部表和序列的定义。它不会转储视图或物化视图的内容,并且只有在使用 --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

阻止转储访问权限(grant/revoke 命令)。

-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 设置为 off,以确保从表中转储所有数据。如果用户没有足够的权限绕过行安全性,则会抛出错误。此参数指示 pg_dumprow_security 设置为 on,允许用户转储他们有权访问的表内容部分。

请注意,如果您当前使用此选项,您可能还需要转储采用 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 选项。

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

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

--if-exists

--clean 模式下使用 DROP ... IF EXISTS 命令删除对象。这将抑制可能报告的 不存在 错误。仅当还指定了 --clean 时,此选项才有效。

--include-foreign-data=foreignserver

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

注意

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

注意

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

--inserts

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

--load-via-partition-root

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

--lock-wait-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

ON CONFLICT DO NOTHING 添加到 INSERT 命令。除非还指定了 --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=节名称

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

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

--serializable-deferrable

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

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

如果在启动 pg_dump 时没有活动的读写事务,则此选项将没有任何影响。如果读写事务处于活动状态,则转储的启动可能会延迟不确定的时间长度。一旦运行,无论是否使用该开关,性能都是相同的。

--snapshot=快照名称

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

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

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

--strict-names

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

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

--sync-method=方法

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

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

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

--table-and-children=模式

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

--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=主机

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

-p 端口
--port=端口

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

-U 用户名
--username=用户名

要连接的用户名。

-w
--no-password

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

-W
--password

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

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

--role=角色名称

指定用于创建转储的角色名称。此选项会导致 pg_dump 在连接到数据库后发出 SET ROLE 角色名称 命令。当经过身份验证的用户(由 -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 将生成使用 connect = false 选项的 CREATE SUBSCRIPTION 命令,以便恢复订阅不会为了创建复制槽或进行初始表复制而建立远程连接。这样,就可以在不需要网络访问远程服务器的情况下恢复转储。然后,由用户以适当的方式重新激活订阅。如果涉及的主机已更改,则可能需要更改连接信息。在启动新的完整表复制之前,截断目标表也可能是合适的。如果用户打算在刷新期间复制初始数据,则必须使用 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 和相关开关中指定大写或混合大小写的名称,您需要使用双引号引起来;否则它将被折叠为小写(请参阅 模式)。但是双引号对 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

提交更正

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