9.3 9.4 9.5 9.6 10 11 12 13 14 15
阿里云PostgreSQL 问题报告 纠错本页面

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可以被用来检查归档并/或选择数据库的哪些部分要被恢复。最灵活的输出文件格式是自定义格式(-Fc)和目录格式(-Fd)。它们允许选择和重排序所有已归档项、支持并行恢复并且默认是压缩的。目录格式是唯一一种支持并行转储的格式。

当运行pg_dump时,我们应该检查输出中有没有任何警告(打印在标准错误上),特别是考虑到下面列出的限制。

选项

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

dbname

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

-a
--data-only

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

这个选项类似于,但出于历史原因并不完全相同于,指定--section=data

-b
--blobs

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

-B
--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参数来选择多个扩展。 psql\d命令使用相同规则解释pattern参数 (请参阅Patterns), 因此也可以通过在模式中使用通配符来选择多个扩展。 使用通配符时,要小心引用模式,以防止shell扩展通配符。

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

注意

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

-E encoding
--encoding=encoding

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

-f file
--file=file

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

-F format
--format=format

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

p
plain

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

c
custom

输出一个适用于pg_restore输入的自定义格式归档。 与目录输出格式一起,这是最灵活的输出格式,允许在恢复期间手动选择和重新排序存档项。 此格式默认也进行了压缩。

d
directory

输出一个适用于pg_restore输入的目录格式归档。 这将创建一个目录,其中包含每个被转储的表和 blob 的一个文件,以及一个所谓的目录文件,描述了以机器可读格式的被转储对象,pg_restore可以读取。 目录格式归档可以使用标准的Unix工具进行操作;例如,未压缩归档中的文件可以使用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

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

注意

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

注意

非模式对象(如 blobs)在指定 -n 时不会被转储。您可以使用 --blobs 开关将 blobs 添加回转储文件中。

-N pattern
--exclude-schema=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

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

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

-n-N开关在使用-t时没有效果,因为被-t选择的表将被转储,而不管这些开关如何设置,非表对象将不会被转储。

注意

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

-T pattern
--exclude-table=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 0..9
--compress=0..9

指定要使用的压缩级别。零表示不压缩。 对于自定义和目录存档格式,这指定对个别表数据段进行压缩,默认情况下以适度级别压缩。 对于纯文本输出,设置非零压缩级别会导致整个输出文件被压缩,就像通过gzip处理一样;但默认情况下不压缩。 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-table-data=pattern

不要为任何匹配pattern的表转储数据。 该模式的解释方式与-t的规则相同。 可以多次使用--exclude-table-data来排除匹配任何几个模式的表。 当您需要特定表的定义但不需要其中的数据时,此选项非常有用。

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

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

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

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

--serializable-deferrable

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

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

如果在启动pg_dump时没有活动的读写事务,则此选项不会产生任何影响。如果有活动的读写事务, 则dump的开始可能会延迟一段不确定的时间。一旦运行,使用此开关与不使用开关时的性能是相同的。

--snapshot=snapshotname

在制作数据库转储时,请使用指定的同步快照(详细信息请参见表 9.92)。

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

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

--strict-names

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

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

--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(见第 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将生成使用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

要转储名称以east或者west开始并且以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

参见

pg_dumpall, pg_restore, psql