Postgresql 中文操作指南

pg_dump

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

Synopsis

pg_dump [ connection-option …​] [ option …​] [ dbname ]

Description

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 时,应当检查输出中的任何警告(在标准错误中打印),尤其是根据下面列出的限制。

Options

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

  • dbname

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

  • -a_—​data-only_

    • 仅转储数据,而不是架构(数据定义)。表数据、大对象和序列值将被转储。

    • 此选项类似于指定 —​section=data ,但出于历史原因,两者并不相同。

  • -b—​large-objects_—​blobs_ (deprecated)

    • 在转储中包括大对象。除了指定了 —​schema—​table—​schema-only 之外,这是默认行为。因此, -b 开关仅对向已请求特定架构或表的转储添加大对象有用。请注意,大对象被视为数据,因此在使用 —​data-only 时将包括大对象,而在使用 —​schema-only 时不会。

  • -B—​no-large-objects_—​no-blobs_ (deprecated)

    • 在转储中排除大对象。

    • -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 开关,选择多个扩展。会根据 psql \d 命令使用的相同规则,将 pattern 参数解释为模式(请参见 Patterns ),因此也可以通过在模式中编写通配符的方式选择多个扩展。当使用通配符时,请注意需要时引号模式,以防止 Shell 展开通配符。

    • 如果 pg_extension_config_dump 注册了任何配置关系,当它的扩展由 —​extension 指定时,就会将其包含在转储中。

  • -E _encoding—​encoding=_encoding

    • 以指定字符集编码创建转储。默认情况下,转储会使用数据库编码创建。另一种获得相同结果的方式是将 PGCLIENTENCODING 环境变量设置为所需的转储编码。 Section 24.3.1 中介绍了受支持的编码。

  • -f _file—​file=_file

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

  • -F _format—​format=_format

    • 选择输出格式。 format 可以是下列之一:

  • -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 开关,选择多个模式。会根据 psql \d 命令使用的相同规则,将 pattern 参数解释为模式(请参见 Patterns ),因此也可以通过在模式中编写通配符的方式选择多个模式。当使用通配符时,请注意需要时引号模式,以防止 Shell 展开通配符;请参见下面的 Examples

  • -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 开关,选择多个表格。会根据 psql \d 命令使用的相同规则,将 pattern 参数解释为模式(请参见 Patterns ),因此也可以通过在模式中编写通配符的方式选择多个表格。当使用通配符时,请注意需要时引号模式,以防止 Shell 展开通配符;请参见下面的 Examples

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

    • 当使用 -t 时, -n-N 开关不起作用,因为由 -t 选择的表格将无论这些开关如何都将被转储,且非表格对象不会被转储。

  • -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 中等程度压缩。对于纯文本输出,设置非零压缩级别会导致整个输出文件被压缩,就像通过 gzip、lz4 或 zstd 供给数据一样;但是,默认是不压缩。使用 zstd 压缩, long 模式可能会以增加内存使用的代价提高压缩率。

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

  • —​binary-upgrade

    • 此选项供就地升级实用程序使用。不建议或不支持将其用于其他用途。此选项的行为可能会在未来版本中不经通知而改变。

  • —​column-inserts_—​attribute-inserts_

    • 以带有明确列名 ( INSERT INTO _table ( column , …​) VALUES …​) 的 _INSERT 命令形式转储数据。这会使还原非常缓慢;它主要用于制作可以加载到非 PostgreSQL 数据库中的转储。还原期间发生的任何错误将仅导致有问题的 INSERT 中的行丢失,而不是整个表的内容。

  • —​disable-dollar-quoting

    • 此选项禁用对函数正文使用美元符号引用,并强制使用 SQL 标准字符串语法对其进行引用。

  • —​disable-triggers

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

    • 当前,为 —​disable-triggers 发出的命令必须以超级用户身份执行。因此,你还应与 -S 一起指定一个超级用户名,或最好谨慎地以超级用户身份启动生成的脚本。

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

  • —​enable-row-security

    • 该选项仅在转储具有行安全性的表的相关内容时相关。默认情况下,pg_dump 将 row_security 设置为关闭,以确保从表中转储所有数据。如果用户没有足够的权限绕过行安全性,则会引发错误。此参数指示 pg_dump 将 row_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_

    • 转储与 foreign server 匹配 foreignserver 模式的任何外键表的任何数据。可以通过编写多个 —​include-foreign-data 交换来选择多个 foreign server。此外, foreignserver 参数的解释规则与 psql 的 \d 命令所使用的规则相同(请参见 Patterns ),因此还可以通过在模式中编写通配符来选择多个 foreign server。在使用通配符时,请小心引用模式(如果需要的话),以防止 shell 展开通配符;请参见下文 Examples 。唯一的例外是不允许出现空模式。

  • —​inserts

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

  • —​load-via-partition-root

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

  • —​lock-wait-timeout=_timeout_

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

  • —​no-comments

    • Do not dump comments.

  • —​no-publications

    • Do not dump publications.

  • —​no-security-labels

    • 不要转储安全标签。

  • —​no-subscriptions

    • Do not dump 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=_sectionname_

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

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

  • —​serializable-deferrable

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

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

    • 如果 pg_dump 启动时没有活跃的读写事务,此选项将不会产生任何影响。如果活动读写事务,转储的开始可能会延迟不确定时间。一旦运行,带有或不带有此开关的性能是相同的。

  • —​snapshot=_snapshotname_

    • 在对数据库进行转储时,使用指定的同步快照(有关更多详细信息,请参见 Table 9.94 )。

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

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

  • —​strict-names

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

    • 此选项对 -N / —​exclude-schema-T / —​exclude-table—​exclude-table-data 无影响。排斥模式未能匹配任何对象不被视为是错误。

  • —​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 命令行参数的帮助,然后退出。

Note

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

  • p__plain

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

  • c__custom

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

  • d__directory

    • 生成一个适合用于输入 pg_restore 的目录格式归档文件。这将创建一个目录,其中每个表和正在转储的大对象有一个文件,加上一个名为目录表的描述了已转储对象的可机器读取格式的文件,pg_restore 可以读取该文件。可以使用标准 Unix 工具操作目录格式的归档文件;例如,可以使用 gzip、lz4 或 zstd 工具压缩未压缩归档文件中的文件。此格式默认使用 gzip 进行压缩,还支持并行转储。

  • t__tar

    • 生成一个适合用于输入 pg_restore 的 tar 格式归档文件。tar 格式与目录格式兼容:提取 tar 格式归档文件会生成一个有效的目录格式归档文件。但是,tar 格式不支持压缩。此外,在使用 tar 格式时,表数据项的相对顺序在还原期间不能更改。

Note

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

Note

在指定了 -n 时,不会转储诸如大对象之类的非架构对象。可以使用 —​large-objects 开关将大对象重新添加到转储中。

Note

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

Note

当指定了 —​include-foreign-data 时,pg_dump 不会检查外键表是否可写。因此无法保证可以成功还原外键表转储的结果。

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

  • -d _dbname—​dbname=_dbname

    • 指定所要连接的数据库的名称。相当于在命令行中将 dbname 指定为第一个非选项参数。 dbname 可以是 connection string 。如果是这样,连接字符串参数将覆盖任何有冲突的命令行选项。

  • -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 所需的权限,但可以切换到具有所需权限的角色时,它非常有用。一些安装禁止直接以超级用户身份登录,而使用此选项允许在不违反该策略的情况下进行转储。

Environment

  • PGDATABASE_PGHOST_PGOPTIONS_PGPORT_PGUSER

    • Default connection parameters.

  • PG_COLOR

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

此实用程序与大多数其他 PostgreSQL 实用程序一样,还使用 libpq 支持的环境变量(请参阅 Section 34.15 )。

Diagnostics

pg_dump 在内部执行 SELECT 语句。如果你在运行 pg_dump 时遇到问题,请确保你可以使用以下命令从数据库中选择信息,例如 psql 。此外,libpq 前端库使用的所有默认连接设置和环境变量都将适用。

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

Notes

如果你的数据库集群在 template1 数据库中添加了任何本地内容,请务必将 pg_dump 的输出还原到一个真正空的数据库;否则,你可能会由于重复定义的添加对象而收到错误。若要创建不带任何本地内容的空数据库,从 template0 复制,不要从 template1 复制,例如:

CREATE DATABASE foo WITH TEMPLATE template0;

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

pg_dump 生成的转储文件不包含优化器决策查询计划时所使用的统计信息。因此,建议在从转储文件中还原后运行 ANALYZE 以确保最优性能;请参阅 Section 25.1.3Section 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 选项将由订阅者自动启用。

Examples

若要将名为 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

See Also