Skip to content

pg_dump

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

概要

pg_dump[connection-option...] [option...] [dbname]

说明

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

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

转储可以输出为脚本或存档文件格式。脚本转储是纯文本文件,其中包含重建数据库到保存时状态所需的 SQL 命令。要从这样的脚本中恢复,请将其提供给psql。脚本文件可用于在其他机器和其他架构上重建数据库;经过一些修改,甚至可以在其他 SQL 数据库产品上重建数据库。

替代的存档文件格式必须与pg_restore一起使用才能重建数据库。它们允许pg_restore选择性地还原内容,甚至在还原之前重新排序项目。存档文件格式设计为跨架构可移植。

当与其中一种存档文件格式一起使用并与pg_restore结合使用时,pg_dump提供了一种灵活的存档和传输机制。pg_dump可用于备份整个数据库,然后pg_restore可用于检查存档和/或选择要还原的数据库部分。最灵活的输出文件格式是“custom”格式 (-Fc) 和“directory”格式 (-Fd)。它们允许选择和重新排序所有存档的项目,支持并行还原,并且默认情况下进行压缩。“directory”格式是唯一支持并行转储的格式。

在运行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 pattern
--extension=pattern

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

如果通过 pg_extension_config_dump 注册了任何配置关系,则当其扩展通过 --extension 指定时,该关系将包含在转储中。

注意

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

-E encoding
--encoding=encoding

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

-f file
--file=file

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

-F format
--format=format

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

p
plain

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

c
custom

输出适合输入 pg_restore 的自定义格式存档。结合目录输出格式,这是最灵活的输出格式,因为它允许在还原期间手动选择和重新排序存档的项目。此格式默认情况下也已压缩。

d
directory

输出适合输入 pg_restore 的目录格式存档。这将创建一个目录,其中每个表和正在转储的大对象有一个文件,外加一个描述以 pg_restore 可以读取的机器可读格式转储对象的所谓目录文件。可以使用标准 Unix 工具操作目录格式存档;例如,可以使用 gziplz4zstd 工具压缩未压缩存档中的文件。此格式默认使用 gzip 进行压缩,并且还支持并行转储。

t
tar

输出适合输入 pg_restoretar 格式存档。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

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

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

请注意,如果您当前使用此选项,您可能还希望转储采用 INSERT 格式,因为还原期间的 COPY FROM 不支持行安全性。

--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 值,而不是最大可用精度。为备份目的进行的常规转储不应使用此选项。

--if-exists

使用 DROP ... IF EXISTS 命令在 --clean 模式下删除对象。这会禁止报告可能出现的 不存在 错误。此选项仅在同时指定 --clean 时才有效。

--include-foreign-data=foreignserver

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

注意

当指定 --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

不输出用于设置压缩方法的命令。使用此选项,所有列都将使用默认压缩设置还原。

--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=sectionname

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

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

--serializable-deferrable

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

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

如果在启动 pg_dump 时没有活动读写事务,此选项将不起作用。如果活动读写事务,转储的开始可能会延迟不确定的时间。一旦运行,使用或不使用此开关的性能是相同的。

--snapshot=快照名称

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

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

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

--strict-names

要求每个扩展 (-e/--extension)、架构 (-n/--schema) 和表 (-t/--table) 模式至少与要转储的数据库中的一个扩展/架构/表匹配。请注意,如果扩展/架构/表模式均未找到匹配项,则即使没有 --strict-namespg_dump 也会生成错误。

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

--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 可以是 连接字符串。如果是这样,连接字符串参数将覆盖任何冲突的命令行选项。

-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=角色名

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

环境

PGDATABASE
PGHOST
PGOPTIONS
PGPORT
PGUSER

默认连接参数。

PG_COLOR

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

此实用程序与大多数其他PostgreSQL实用程序一样,也使用libpq支持的环境变量(请参阅第 34.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以确保最佳性能;有关更多信息,请参见第 25.1.3 节第 25.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

另请参阅

pg_dumpallpg_restorepsql