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 工具来操作目录格式的归档文件;例如,可以使用 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
命令使用的相同规则解释为模式(请参见 模式),因此也可以通过在模式中写入通配符来选择多个模式。使用通配符时,请注意在必要时引用模式,以防止 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 OWNER
或 SET 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
]指定要使用的压缩方法和/或压缩级别。压缩方法可以设置为 gzip
、lz4
、zstd
或 none
表示不压缩。可以选择指定压缩详细信息字符串。如果详细信息字符串是整数,则指定压缩级别。否则,它应该是一个逗号分隔的项目列表,每个项目的形式为 keyword
或 keyword=value
。目前,支持的关键字是 level
和 long
。
如果未指定压缩级别,将使用默认压缩级别。如果仅指定级别而没有提及算法,如果级别大于 0
,将使用 gzip
压缩,如果级别为 0
,则不使用压缩。
对于自定义和目录归档格式,这指定对各个表数据段进行压缩,默认使用中等水平的 gzip
进行压缩。对于纯文本输出,设置非零压缩级别会导致整个输出文件被压缩,就像它通过 gzip、lz4 或 zstd 一样;但默认不压缩。使用 zstd 压缩时,long
模式可以提高压缩率,但会增加内存使用。
tar 归档格式当前完全不支持压缩。
--binary-upgrade
此选项供就地升级实用程序使用。不建议或不支持将其用于其他目的。该选项的行为可能会在未来的版本中更改,恕不另行通知。
--column-inserts
--attribute-inserts
将数据转储为带有显式列名的 INSERT
命令(INSERT INTO
)。这将使恢复速度非常慢;它主要用于制作可以加载到非 PostgreSQL 数据库的转储。恢复期间的任何错误都只会导致丢失问题 table
(column
, ...) VALUES ...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
。
--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
当转储表分区的数据时,使 COPY
或 INSERT
语句的目标为包含它的分区层次结构的根,而不是分区本身。这会导致在加载数据时为每一行重新确定适当的分区。当在行并不总是与原始服务器上的行属于同一分区的服务器上恢复数据时,这可能很有用。例如,如果分区列的类型为文本,并且两个系统对用于排序分区列的排序规则具有不同的定义,则可能会发生这种情况。
--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-data
、data
或 post-data
。可以多次指定此选项以选择多个节。默认情况下是转储所有节。
数据节包含实际的表数据、大对象内容和序列值。后数据项包括索引、触发器、规则和除已验证的检查约束之外的约束的定义。前数据项包括所有其他数据定义项。
--serializable-deferrable
使用 serializable
事务进行转储,以确保使用的快照与后续数据库状态一致;但通过等待事务流中不存在异常的点来执行此操作,这样就不会有转储失败或导致其他事务回滚并出现 serialization_failure
的风险。有关事务隔离和并发控制的更多信息,请参阅第 13 章。
此选项对于仅用于灾难恢复的转储没有好处。对于用于加载数据库副本以进行报告或其他只读负载共享的转储,这可能很有用,同时原始数据库会继续更新。如果没有它,转储可能会反映与最终提交的事务的任何串行执行不一致的状态。例如,如果使用批处理技术,则批次可能在转储中显示为已关闭,但并非批次中的所有项目都已出现。
如果在启动 pg_dump 时没有活动的读写事务,则此选项将没有任何影响。如果读写事务处于活动状态,则转储的启动可能会延迟不确定的时间长度。一旦运行,无论是否使用该开关,性能都是相同的。
--snapshot=快照名称
在转储数据库时使用指定的同步快照(有关更多详细信息,请参阅表 9.98)。
当需要将转储与逻辑复制槽(请参阅第 47 章)或并发会话同步时,此选项很有用。
在并行转储的情况下,将使用此选项定义的快照名称,而不是创建新的快照。
--strict-names
要求每个扩展 (-e
/--extension
)、模式 (-n
/--schema
) 和表 (-t
/--table
) 模式至少匹配要转储的数据库中的一个扩展/模式/表。这也适用于与 --filter
一起使用的过滤器。请注意,如果扩展/模式/表模式都没有找到匹配项,即使没有 --strict-names
,pg_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
指定是否在诊断消息中使用颜色。可能的值为 always
、auto
和 never
。
此实用程序与大多数其他 PostgreSQL 实用程序一样,也使用 libpq 支持的环境变量(请参阅第 32.15 节)。
pg_dump 在内部执行 SELECT
语句。如果您在运行 pg_dump 时遇到问题,请确保您能够使用例如 psql 从数据库中选择信息。此外,任何 libpq 前端库使用的默认连接设置和环境变量都将适用。
pg_dump 的数据库活动通常由累积统计系统收集。如果不需要这样,您可以通过 PGOPTIONS
或 ALTER 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
要转储名称以 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
和相关开关中指定大写或混合大小写的名称,您需要使用双引号引起来;否则它将被折叠为小写(请参阅 模式)。但是双引号对 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
如果您在文档中发现任何不正确、与您特定功能的使用经验不符或需要进一步澄清的内容,请使用此表单报告文档问题。