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
不转储与 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
选项混淆,该选项使用单词“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
不导出任何与 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
)。这将使恢复过程非常缓慢;主要用于创建可以加载到非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-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
当为表分区转储数据时,使COPY
或INSERT
语句
指向包含它的分区层次结构的根,而不是分区本身。这会导致在加载数据时为每一行重新确定适当的分区。
当在一个服务器上恢复数据时,这可能很有用,因为行不总是落入与原始服务器上相同的分区中。
例如,如果分区列是文本类型,并且两个系统对用于对分区列进行排序的排序规则的定义不同。
--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-data
,data
,或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
规定在诊断消息中是否使用颜色。可能的值为always
、 auto
、never
。.
和大部分其他PostgreSQL工具相似,这个工具也使用libpq(见第 34.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
来确保最优性能是明智的,详见第 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