PostgreSQL 中文参考文档
🌐 英文原版 官方 ↗

pg_dump

pg_dump — 把一个 PostgreSQL 数据库导出为一个 SQL 脚本或者其他格式

Synopsis

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

描述

pg_dump 是一个用于导出 PostgreSQL 数据库的工具。即使数据库正在被并发使用,它也能做出一致的导出。pg_dump 不会阻塞其他访问数据库的用户(读者或写者)。但是请注意,除了简单的情况之外,pg_dump 通常不是对生产数据库进行常规备份的正确选择。进一步的讨论请参见 Chapter 25。

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

转储可以以脚本或者归档文件格式输出。脚本转储是纯文本文件,其中包含把数据库重建到它被保存时状态所需的 SQL 命令。要从这样的脚本恢复,可以将它提供给 psql。脚本文件甚至可以在其他机器和其他体系结构上重建数据库;稍加修改后,甚至可以在其他 SQL 数据库产品上使用。

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

当与某种归档文件格式一起使用并结合 pg_restore 时,pg_dump 提供了一种灵活的归档和传输机制。可以先用 pg_dump 导出整个数据库,然后用 pg_restore 来检查归档和/或选择数据库中要恢复的部分。最灵活的输出文件格式是“定制”格式(-Fc)和“目录”格式(-Fd)。它们允许对所有被归档的项目进行选择和重新排序,支持并行恢复,并且默认进行压缩。“目录”格式是唯一支持并行转储的格式。

在运行 pg_dump 时,应当检查输出中是否有任何警告(打印在标准错误上),尤其是结合下面列出的限制来看。

Warning

恢复一个转储会导致目标端执行由源端超级用户选择的任意代码。部分转储和部分恢复并不能限制这一点。如果源端超级用户不可信,则必须在恢复之前检查被转储的 SQL 语句。非纯文本的转储可以使用 pg_restore 的 --file 选项来检查。注意,运行转储和恢复的客户端不必信任源端或目标端的超级用户。

选项

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

dbname

指定要转储的数据库的名称。如果没有指定这个参数,那么将使用环境变量 PGDATABASE。如果那个也没有设置,则使用为连接指定的用户名。

-a
--data-only

只转储数据,不转储模式(数据定义)或统计信息。表数据、大对象和序列值会被转储。

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

-b
--large-objects
--blobs (deprecated)

在转储中包含大对象。除非指定了 --schema、--table、--schema-only、--statistics-only 或 --no-data,否则这是默认行为。因此,-b 开关只对在已请求特定模式或表的转储中添加大对象有用。注意,大对象被视为数据,因此在使用 --data-only 时会被包含,但在使用 --schema-only 或 --statistics-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 开关来选择多个扩展。pattern 参数会按照 psql 的 \d 命令所使用的相同规则被解释为一个模式(参见 Patterns),因此也可以通过在模式中编写通配符来选择多个扩展。使用通配符时,如需防止 shell 展开通配符,请小心地对模式加上引号。

由 pg_extension_config_dump 注册的任何配置关系,在其扩展被 --extension 指定的情况下会被包括在转储中。

Note

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

-E encoding
--encoding=encoding

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

-f file
--file=file

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

-F format
--format=format

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

p
plain

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

c
custom

输出一个适合作为 pg_restore 输入的定制格式归档。与目录输出格式一起,这是最灵活的输出格式,因为它允许在恢复期间手工选择和重新排序被归档的项目。这种格式默认也会进行压缩。

d
directory

输出一个适合作为 pg_restore 输入的目录格式归档。这会创建一个目录,其中被转储的每一个表和大对象都有一个对应的文件,另外还有一个所谓的目录(Table of Contents)文件,它以一种 pg_restore 能够读取的机器可读格式描述被转储的对象。目录格式归档可以用标准的 Unix 工具来操作;例如,未压缩归档中的文件可以用 gzip、lz4 或 zstd 工具来压缩。这种格式默认使用 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 命令所使用的相同规则被解释为一个模式(参见 Patterns),因此也可以通过在模式中编写通配符来选择多个模式。使用通配符时,如需防止 shell 展开通配符,请小心地对模式加上引号;参见下面的 Examples。

Note

指定 -n 时,pg_dump 不会尝试转储所选模式可能依赖的任何其他数据库对象。因此,无法保证针对特定模式的转储结果能够靠其自身成功地恢复到一个干净的数据库中。

Note

指定 -n 时,不会转储大对象之类的非模式对象。你可以使用 --large-objects 开关把大对象重新加回转储中。

-N pattern
--exclude-schema=pattern

不转储名称匹配 pattern 的任何模式。模式的解释遵循与 -n 相同的规则。可以多次给出 -N,以排除匹配若干模式中任意一个的模式。

当同时给出 -n 和 -N 时,其行为是只转储匹配至少一个 -n 开关但不匹配任何 -N 开关的模式。如果出现 -N 而没有 -n,则匹配 -N 的模式会从原本正常的转储中被排除。

-O
--no-owner

不输出把对象所有权设置为与原数据库相匹配的命令。默认情况下,pg_dump 会发出 ALTER OWNER 或 SET SESSION AUTHORIZATION 语句来设置所创建数据库对象的所有权。除非脚本由超级用户(或者由拥有脚本中所有对象的同一个用户)启动,否则这些语句在脚本运行时将会失败。要产生一个能够由任意用户恢复、但会把所有对象的所有权授予该用户的脚本,请指定 -O。

在生成归档(非文本)输出文件时,这个选项会被忽略。对于归档格式,你可以在调用 pg_restore 时指定该选项。

-R
--no-reconnect

这个选项已过时,但为了向后兼容仍被接受。

-s
--schema-only

只转储对象定义(模式),不转储数据或统计信息。

这个选项不能与 --data-only 或 --statistics-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 命令所使用的相同规则被解释为一个模式(参见 Patterns),因此也可以通过在模式中编写通配符来选择多个表。使用通配符时,如需防止 shell 展开通配符,请小心地对模式加上引号;参见下面的 Examples。

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

-n 和 -N 开关在使用 -t 时不起作用,因为由 -t 选择的表无论这些开关如何都会被转储,而非表对象则不会被转储。

Note

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

指定要使用的压缩方法和/或压缩级别。压缩方法可以设置为 gzip、lz4、zstd,或者设置为 none 表示不压缩。可以选择性地指定一个压缩细节字符串。如果细节字符串是一个整数,它指定压缩级别。否则,它应当是一个以逗号分隔的列表,其中每一项的形式为 keyword 或 keyword=value。当前支持的键字是 level 和 long。

如果没有指定压缩级别,将使用默认的压缩级别。如果只指定了级别而没有提到算法,那么将使用 gzip 压缩(级别大于 0 时),而级别为 0 时不进行压缩。

对于定制和目录归档格式,这个选项指定对各个表数据段进行压缩,默认使用 gzip 以中等级别压缩。对于纯文本输出,设置一个非零的压缩级别会导致整个输出文件被压缩,就好像它被送入了 gzip、lz4 或 zstd 一样;但默认是不压缩。使用 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_dump 改为把 row_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 或 --statistics-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

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

--include-foreign-data=foreignserver

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

Note

在 --include-foreign-data 中使用通配符可能会导致访问意料之外的外部服务器。此外,为了安全地使用这个选项,请确保被指名的服务器拥有可信的拥有者。

Note

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

--inserts

以 INSERT 命令(而不是 COPY)的形式转储数据。这会让恢复变得非常慢;它主要用于制作能够被载入到非 PostgreSQL 数据库的转储。恢复期间发生的任何错误只会导致属于出问题的 INSERT 的那些行丢失,而不是整个表的内容。注意,如果你重新排列了列的顺序,恢复可能会完全失败。--column-inserts 选项对列顺序的变化是安全的,尽管它更慢。

--load-via-partition-root

在为表分区转储数据时,让 COPY 或 INSERT 语句以包含该分区的分区层次的根为目标,而不是以该分区本身为目标。这会导致在数据被载入时为每一行重新确定合适的分区。在把数据恢复到一台行未必总是像原始服务器那样落入相同分区的服务器上时,这可能有用。例如,如果分区列是 text 类型,而两个系统对用于排序分区列的排序规则有不同的定义,就可能发生这种情况。

--lock-wait-timeout=timeout

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

--no-comments

不转储 COMMENT 命令。

--no-data

不转储数据。

--no-policies

不转储行安全性策略。

--no-publications

不转储发布。

--no-schema

不转储模式(数据定义)。

--no-security-labels

不转储安全标签。

--no-statistics

不转储统计信息。这是默认行为。

--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 可以避免此类问题,代价是转储脚本更难阅读。

--restrict-key=restrict_key

把提供的字符串用作转储输出中 psql 的 \restrict 键。这个选项只能为纯文本转储指定,也就是说,仅当 --format 被设置为 plain 或者省略了 --format 选项时才能使用。如果没有指定 restrict 键,pg_dump 会根据需要生成一个随机的键。键只能包含字母数字字符。

这个选项主要用于测试目的以及需要可重复输出的其他场景(例如比较转储文件)。不建议一般性使用,因为预先知道该键的恶意服务器可能能够注入任意代码,这些代码将在运行 psql 处理转储输出的机器上执行。

--rows-per-insert=nrows

以 INSERT 命令(而不是 COPY)的形式转储数据。它控制每条 INSERT 命令的最大行数。指定的值必须是大于零的数字。恢复期间发生的任何错误只会导致属于出问题的 INSERT 的那些行丢失,而不是整个表的内容。

--section=sectionname

只转储指定的节。节名可以是 pre-data、data 或 post-data。可以多次指定这个选项来选择多个节。默认转储所有节。

数据节包含实际的表数据、大对象内容、序列值,以及表、物化视图和外部表的统计信息。数据后(post-data)项目包括索引、触发器、规则的定义,索引的统计信息,以及除已验证的检查约束和非空约束之外的其他约束。数据前(pre-data)项目包括所有其他数据定义项目。

--sequence-data

在转储中包含序列数据。除非指定了 --no-data、--schema-only 或 --statistics-only,否则这是默认行为。

--serializable-deferrable

对转储使用 serializable 事务,以确保所使用的快照与之后的数据库状态一致;但这是通过等待事务流中不可能出现异常的一个点来实现的,从而不会有转储失败或者导致其他事务因 serialization_failure 而回滚的风险。有关事务隔离和并发控制的更多信息,请参见 Chapter 13。

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

如果 pg_dump 启动时没有活动的读写事务,这个选项不会产生任何差别。如果有活动的读写事务,转储的开始可能会被延迟一段不确定的时间。一旦开始运行,使用或不使用该开关的性能是相同的。

--snapshot=snapshotname

在转储数据库时使用指定的同步快照(更多细节请参见 Table 9.100)。

当需要把转储与逻辑复制槽(参见 Chapter 47)或并发会话同步时,这个选项很有用。

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

--statistics

转储优化器统计信息。

--statistics-only

只转储统计信息,不转储模式(数据定义)或数据。表、物化视图、外部表和索引的优化器统计信息会被转储。

--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 来要求操作系统同步包含归档目录的整个文件系统。请参见 recovery_init_sync_method,以了解使用 syncfs 时需要注意的注意事项。

当使用 --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 可以是一个 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 所需的特权、但可以切换到一个具有所需权限的角色时,这个选项很有用。一些安装有禁止直接以超级用户身份登录的策略,使用这个选项可以在不违反该策略的情况下进行转储。

环境

PGDATABASE
PGHOST
PGOPTIONS
PGPORT
PGUSER

默认连接参数。

PG_COLOR

指定是否在诊断消息中使用颜色。可能的值是 always、auto 和 never。

这个工具与其他大多数 PostgreSQL 工具一样,也使用 libpq 支持的环境变量(参见 Section 32.15)。

诊断

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

pg_dump 的数据库活动通常由累积统计系统收集。如果不希望这样,你可以把参数 track_counts 设置为 false,方法是使用 PGOPTIONS 或 ALTER USER 命令。

注记

如果你的数据库集群对 template1 数据库有任何本地添加,请小心地把 pg_dump 的输出恢复到一个真正空的数据库中;否则你很可能会因为被添加对象的重复定义而得到错误。要创建一个没有任何本地添加的空数据库,请从 template0 而不是 template1 复制,例如:

CREATE DATABASE foo WITH TEMPLATE template0;

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

指定 --statistics 时,pg_dump 会在产生的转储文件中包括大部分优化器统计信息。这并不包括所有统计信息,例如用 CREATE STATISTICS 显式创建的统计信息、由扩展添加的定制统计信息,或者由累积统计系统收集的统计信息。因此,在从转储文件恢复之后运行 ANALYZE 以确保最优性能可能仍然有用;更多信息请参见 Section 24.1.3 和 Section 24.1.6。

由于 pg_dump 被用来把数据传输到较新版本的 PostgreSQL,pg_dump 的输出可以被预期载入到 PostgreSQL 服务器版本中,这些版本比 pg_dump 自身的版本更新。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 选项会被订阅者自动启用,前提是订阅最初是以 two_phase = true 选项创建的。

一般建议在使用 -X(--no-psqlrc)选项的情况下从纯文本 pg_dump 脚本恢复数据库,以确保干净的恢复过程,并防止与非默认 psql 配置的潜在冲突。

示例

把名为 mydb 的数据库转储到一个 SQL 脚本文件中:

$ pg_dump mydb > db.sql

把这样的脚本重新载入到一个名为 newdb 的(新建的)数据库中:

$ psql -X -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

转储名称以 emp 开头且位于 detroit 模式中的所有表,但名为 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

要转储所有名称以 mytable 开头、但 mytable2 表除外的表,请像下面这样指定一个过滤文件 filter.txt:

include table mytable*
exclude table mytable2

$ pg_dump --filter=filter.txt mydb > db.sql

另请参阅

pg_dumpall, pg_restore, psql