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
命令使用的规则相同(请参阅 模式),因此也可以通过在模式中编写通配符字符来选择多个扩展。使用通配符时,如果需要防止 shell 展开通配符,请小心地引用模式。
由 pg_extension_config_dump
注册的任何配置关系都将包含在转储中,如果其扩展由 --extension
指定。
当指定 -e
时,pg_dump 不会尝试导出所选扩展可能依赖的任何其他数据库对象。因此,不能保证可以通过将特定扩展转储的结果自行成功恢复到干净的数据库中。
-E encoding
--encoding=encoding
以指定的字符集编码创建转储。默认情况下,转储在数据库编码中创建。(获得相同结果的另一种方法是将 PGCLIENTENCODING
环境变量设置为所需的转储编码。)第 23.3.1 节 中介绍了支持的编码。
-f file
--file=file
将输出发送到指定的文件。对于基于文件的输出格式,可以省略此参数,在这种情况下,将使用标准输出。但是,对于目录输出格式,必须提供此参数,它指定目标目录而不是文件。在这种情况下,目录由 pg_dump
创建,并且之前不得存在。
-F format
--format=format
选择输出格式。format
可以是下列之一
p
plain
输出纯文本SQL脚本文件(默认值)。
c
custom
输出一个自定义格式的存档,以便 pg_restore 输入。这与目录输出格式一起,是最灵活的输出格式,因为它允许在还原期间手动选择和重新排序已归档的项目。此格式在默认情况下也会被压缩。
d
目录
输出一个目录格式的存档,以便 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 领导进程请求对工作进程将会在稍后转储的对象进行共享锁(访问共享),以确保在转储运行时没有人员删除它们,并使它们消失。如果其他客户端随后请求某个表上的独占锁,将不会授予该锁,但将排队等待领导进程的共享锁被释放。因此,对该表的任何其他访问都将不会被授予,并将排在独占锁请求之后。其中包括正在尝试转储表的某个工作进程。如果没有采取任何预防措施,这将是经典的死锁情况。为了检测该冲突,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 用户名
--superuser=用户名
禁用触发器时指定要使用的超级用户用户名。仅在使用 --disable-triggers
时才与之相关。(通常最好省略此项,而以超级用户身份启动生成脚本。)
-t 模式
--table=模式
仅转储名称与 模式
匹配的表。可通过编写多个 -t
开关来选择多张表。模式
参数将根据 psql 的 \d
命令(参见 模式)所用的规则进行模式化解析,因此也可以通过在该模式中书写通配符来选择多张表。在使用通配符时,谨慎使用引用来避免 shell 扩展掉通配符;参见下面的 示例。
此选项除了表以外,可用于转储匹配视图、物化视图、外部表和序列的定义。它不会转储视图或物化视图的内容,并且仅当使用 --include-foreign-data
指定了相应的外置服务器时,才会转储外部表的内容。
使用 -t
时,-n
和 -N
开关无效,因为由 -t
选择的表将无论这些开关的使用情况如何进行转储,并且不会转储非表对象。
在指定 -t
时,pg_dump 不会尝试转储所选表可能依赖的任何其他数据库对象。因此,无法保证特定表转储的结果可通过自身成功地恢复到干净的数据库中。
-T 模式
--exclude-table=模式
不转储任何与 模式
匹配的表。模式的解析与 -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
]指定要使用的压缩方法和/或压缩级别。压缩方法可以设置为 gzip
、lz4
、zstd
或 none
(表示不压缩)。还可以选择指定压缩详细字符串。如果详细字符串为整数,则它指定压缩级别。否则,它应该是由以下形式的每个项目组成的逗号分隔列表:keyword
或 keyword=value
。目前支持的关键字为 level
和 long
。
如果没有指定压缩级别,则会使用默认压缩级别。如果只指定了一个级别,没有提及算法,如果该级别大于 0
,则会使用 gzip
压缩,如果该级别等于 0
,则不使用压缩。
对于自定义和目录存档格式,这将指定各个表数据段的压缩,而默认行为是使用中等程度的 gzip
进行压缩。对于纯文本输出,设定一个非零压缩级别会让整个输出文件被压缩,就像它已经通过 gzip、lz4 或 zstd 一样;但是,默认行为是不压缩。使用 zstd 压缩,“长模式”可能以增加内存使用为代价提升压缩比率。
目前,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 设置为关闭,以确保从表中转储所有数据。如果用户没有足够权限以绕过行安全性,那么将抛出一个错误。此参数指示 pg_dump 将 row_security 设置为打开,使用户可以转储他们有权访问的表内容部分。
请注意,如果您当前使用此选项,您可能还希望转储采用 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
使用 DROP ... IF EXISTS
命令在 --clean
模式下删除对象。这会抑制可能报告的“不存在” 错误。除非指定了 --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=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
向 INSERT
命令添加 ON CONFLICT DO NOTHING
。除非还指定 --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
、data
或 post-data
。此选项可以指定多次,以选择多个节。默认情况下,转储所有节。
数据节包含实际的表数据、大对象内容和序列值。Post-data 项目包括索引、触发器、规则以及除经过验证的检查约束之外的约束的定义。Pre-data 项目包括所有其他数据定义项。
--serializable-deferrable
对转储使用 serializable
事务,以确保所使用的快照与数据库的后继状态一致;但通过这样做的方式是等待事务流中不会出现任何异常的某个点,以避免转储失败的风险,或导致其他事务因 serialization_failure
而回滚。有关事务隔离和并发控制的更多信息,请参见第 13 章。
对于仅用作灾难恢复的转储,此选项并无益处。它对于用于加载数据库的副本,以用于报表或其他只读负载共享(同时原始数据库继续更新),非常有用。如果没有它,转储可能反映的状态与最终提交的事务的任何串行执行不一致。例如,如果使用了批处理技术,则批处理可能在转储中显示为已关闭状态,而批处理中出现的所有项目均未显示。
如果 pg_dump 启动时没有正在运行的读写事务,此选项将不起作用。如果读写事务处于活动状态,则转储的开始可能会延迟不定的时间。在运行中,无论是否切换开关,性能都是相同的。
--snapshot=snapshotname
在对数据库进行转储时使用指定的同步快照(有关更多详细信息,请参阅 表 9.98)。
当需要将转储与逻辑复制槽(参见 第 47 章)或并发会话同步时,此选项非常有用。
在并行转储的情况下,将使用此选项定义的快照名称,而不是采用新快照。
--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
要求操作系统同步包含存档目录的整个文件系统。有关使用 syncfs
时要注意的注意事项,请参见 recovery_init_sync_method。
使用 --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
可以是 连接字符串。如果是这样,连接字符串参数将覆盖任何冲突的命令行选项。
-h host
--host=host
指定运行服务器的机器的主机名。如果值以斜杠开头,则会将其用作 Unix 域套接字的目录。如果设置了 PGHOST
环境变量,则使用它的默认值,否则会尝试建立 Unix 域套接字连接。
-p port
--port=port
指定服务器侦听连接的 TCP 端口或本地 Unix 域套接字文件扩展名。如果没有设置,则默认为 PGPORT
环境变量,或编译中定义的默认值。
-U 用户名
--username=用户名
用于连接的用户名。
-w
--no-password
从不提示输入密码。如果服务器需要密码身份验证而无法通过其他方式(如 .pgpass
文件)获取密码,连接尝试将失败。此选项可用于无人输入密码的批处理作业和脚本。
-W
--password
强制 pg_dump 在连接到数据库之前提示输入密码。
此选项并不是必须的,因为如果服务器要求进行密码身份验证,pg_dump 将自动提示输入密码。但是,pg_dump 会尝试连接以查明服务器是否要求输入密码,这会浪费一次连接尝试。在某些情况下,值得键入 -W
以避免额外的连接尝试。
--role=角色名
指定用于创建转储的角色名。此选项会导致 pg_dump 在连接到数据库后发出 SET ROLE
rolename
命令。此选项在经过身份验证的用户(由 -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