pg_dump
pg_dump — 将 PostgreSQL 数据库导出为 SQL 脚本或其他格式
大纲
pg_dump [option...] [dbname]
描述
pg_dump是一个用于备份PostgreSQL数据库的工具。即使数据库正在被并发使用,它也能生成一致的备份。pg_dump不会阻塞其他用户访问数据库(无论读还是写)。
转储可以输出为脚本格式或归档文件格式。脚本转储是纯文本文件,包含把数据库重建到保存时状态所需的 SQL 命令。要从这样的脚本恢复,只需将其交给psql。脚本文件甚至可以在其他机器和其他体系结构上用于重建数据库;经过一些修改后,甚至也可以用于其他 SQL 数据库产品。
另一类归档文件格式必须结合pg_restore来重建数据库。它们允许 pg_restore 有选择地恢复某些内容,甚至在恢复之前重新排列条目。归档文件格式被设计为可跨体系结构移植。
当使用一种归档文件格式并与pg_restore结合使用时,pg_dump提供了一种灵活的归档和传输机制。pg_dump可以用来备份整个数据库,然后pg_restore可以用来检查归档和/或选择要恢复数据库的哪些部分。最灵活的输出文件格式是“custom”格式(-Fc)。它允许选择和重新排序所有归档条目,并且默认会被压缩。tar格式(-Ft)不压缩,而且在装载时无法对数据重新排序,但在其他方面相当灵活;此外,它可以用标准的 Unix 工具(如tar)来处理。
运行 pg_dump 时,应检查输出中是否有任何警告(打印到标准错误),尤其要结合下面列出的限制来查看。
选项
下列命令行选项控制输出的内容和格式。
dbname指定要转储的数据库名称。如果未指定,则使用环境变量
PGDATABASE。如果未设置该变量,则使用连接指定的用户名。-a--data-only只转储数据,不转储模式(数据定义)。
此选项只对纯文本格式有意义。对于归档格式,可以在调用
pg_restore时指定该选项。-c--clean输出在创建数据库对象之前清除(删除)它们的命令。
此选项只对纯文本格式有意义。对于归档格式,可以在调用
pg_restore时指定该选项。-C--create让输出以创建数据库本身并重新连接到新建数据库的命令开始。(使用这种形式的脚本时,在运行脚本之前连接到哪个数据库无关紧要。)
此选项只对纯文本格式有意义。对于归档格式,可以在调用
pg_restore时指定该选项。-d--inserts将数据转储为
INSERT命令(而不是COPY)。这会使恢复非常缓慢;它主要用于生成可以装入非PostgreSQL数据库的转储。注意,如果重新安排了列顺序,恢复可能会彻底失败。-D选项更安全一些,但速度也更慢。另外,虽然这个选项在遇到无效数据时会生成错误,但它允许其他INSERT继续向表中装载数据。-D--column-inserts--attribute-inserts将数据转储为带显式列名的
INSERT命令(INSERT INTO)。这会使恢复非常缓慢;它主要用于生成可以装入非PostgreSQL数据库的转储。另外,虽然这个选项在遇到无效数据时会生成错误,但它允许其他table(column, ...) VALUES ...INSERT继续向表中装载数据。-Eencoding--encoding=encoding在指定的字符集编码中创建转储。默认情况下,转储将以数据库编码创建。(获得相同结果的另一种方法是将
PGCLIENTENCODING环境变量设置为所需的转储编码。)-ffile--file=file把输出发送到指定的文件。如果省略,则使用标准输出。
-Fformat--format=format选择输出的格式。
format可以是下列之一:plain输出纯文本 SQL 脚本文件(默认)
t输出一个适合输入到pg_restore的
tar归档。使用这种归档格式,可以在恢复数据库时重新排序和/或排除数据库对象。还可以限制恢复时重新装载哪些数据。c输出适合供 pg_restore 使用的 custom 归档。这是最灵活的输出格式,因为它既允许对装载的数据进行重新排序,也允许对对象定义进行重新排序。这种格式默认也会压缩。
-i--ignore-version忽略pg_dump与数据库服务器之间的版本不匹配。
pg_dump可以处理以前版本PostgreSQL的数据库,但非常老的版本不再受支持(目前是 7.0 之前的版本)。如果需要跳过版本检查,可使用此选项(如果pg_dump随后失败,别怪我们没有提醒你)。
-nschema--schema=schema只转储
schema的内容。未指定此选项时,将转储目标数据库中的所有非系统模式。注意
在这种模式下,pg_dump不会尝试转储所选模式中的对象可能依赖的任何其他数据库对象。因此,不能保证单模式转储的结果能够单独成功恢复到一个干净的数据库中。
-o--oids将对象标识符(OID)作为每个表的数据的一部分进行转储。如果应用程序以某种方式引用OID列(例如在外键约束中),请使用此选项。否则,不应使用此选项。
-O--no-owner不输出用于把对象所有权设置成与原始数据库一致的命令。默认情况下, pg_dump 会发出
ALTER OWNER或SET SESSION AUTHORIZATION语句来设置新建数据库对象的所有权。除非脚本由超级用户(或拥有脚本中所有对象的同一用户)启动,否则这些语句会在运行脚本时报错。若要创建一个可由任意用户恢复、并让该用户拥有所有对象的脚本,请指定-O。此选项只对纯文本格式有意义。对于归档格式,可以在调用
pg_restore时指定该选项。-R--no-reconnect这个选项已经过时,但仍然被接受以保持向后兼容性。
-s--schema-only只转储对象定义(模式),不转储数据或统计信息。
-Susername--superuser=username指定在禁用触发器时要使用的超级用户名。这只在使用
--disable-triggers时相关。(通常最好省略它,而是以超级用户身份运行生成的脚本。)-ttable--table=table只转储
table的数据。不同模式中可能存在多个同名的表;如果是这种情况,所有匹配的表都会被转储。要只选择一个表,可以同时指定--schema和--table。注意
在这种模式下,pg_dump不会尝试转储所选表可能依赖的任何其他数据库对象。因此,不能保证单表转储的结果能够单独成功恢复到一个干净的数据库中。
-v--verbose指定详细模式。这会使 pg_dump 将详细的对象注释、开始/停止时间写入转储文件,并把进度消息写到标准错误。
-x--no-privileges--no-acl不转储访问权限(grant/revoke 命令)。
-X disable-dollar-quoting--disable-dollar-quoting此选项禁用函数体中的 dollar quoting,并强制改用 SQL 标准字符串语法对它们进行引用。
-X disable-triggers--disable-triggers此选项只在创建包含数据但不包含模式的转储时才相关。它指示 pg_dump 在输出中包含一些命令,以便在恢复数据时临时禁用目标表上的触发器。如果这些表上存在不希望在数据恢复期间触发的引用完整性检查或其他触发器,请使用此选项。
目前,为
--disable-triggers输出的这些命令必须由超级用户执行。因此,还应通过-S指定一个超级用户名,或者更好的做法是谨慎地以超级用户身份运行生成的脚本。此选项只对纯文本格式有意义。对于归档格式,可以在调用
pg_restore时指定该选项。-X use-set-session-authorization--use-set-session-authorization输出符合 SQL 标准的
SET SESSION AUTHORIZATION命令,而不是ALTER OWNER命令来确定对象所有权。这会让转储更符合标准,但根据转储中对象的历史,可能无法正确恢复。另外,使用SET SESSION AUTHORIZATION的转储肯定需要超级用户权限才能正确恢复,而ALTER OWNER只需较低权限。-Z0..9--compress=0..9指定所用的压缩级别。零表示不压缩。对于自定义格式归档,该选项指定对各个表数据段的压缩,默认以适中的级别压缩。对于纯文本输出,设置非零压缩级别会压缩整个输出文件,就像将其传给gzip处理一样;但默认不压缩。tar 归档格式目前完全不支持压缩。
下列命令行选项控制数据库连接参数。
-hhost--host=host指定运行服务器的机器的主机名。如果该值以斜杠开头,则将其用作 Unix 域套接字的目录。默认值取自
PGHOST环境变量(如果已设置);否则会尝试使用 Unix 域套接字连接。-pport--port=port指定服务器正在监听连接的 TCP 端口,或本地 Unix 域套接字文件扩展名。默认值取自
PGPORT环境变量(如果已设置),否则使用编译时默认值。-Uusername连接时使用的用户名。
-W强制提示输入密码。如果服务器要求密码认证,这应该会自动发生。
环境
PGDATABASEPGHOSTPGPORTPGUSER默认连接参数。
诊断
pg_dump 在内部执行 SELECT
语句。如果运行 pg_dump 时遇到问题,请确认能够例如使用psql从数据库中查询信息。
注意
如果数据库集簇在 template1 数据库中有任何本地添加的内容,要小心把 pg_dump 的输出恢复到一个真正空的数据库中;否则很可能因为这些新增对象的重复定义而报错。要创建一个不含任何本地添加的空数据库,应从 template0 而不是
template1 复制,例如:
CREATE DATABASE foo WITH TEMPLATE template0;
pg_dump有一些限制:
当选择仅数据转储并使用
--disable-triggers选项时, pg_dump会在插入数据前发出命令禁用用户表上的触发器,并在数据插入完成后发出命令重新启用它们。如果恢复在中途停止,系统目录可能会保持在错误状态。
tar 归档的成员被限制为小于 8 GB 的尺寸。(这是 tar 文件格式固有的限制。)因此,如果任何一个表的文本表示超过了这个尺寸,就不能使用这种格式。tar 归档和任何其他输出格式的总大小没有限制,除非操作系统有限制。
pg_dump生成的转储文件不包含优化器用于决定查询计划的统计信息。因此,明智的做法是在从转储文件恢复后运行ANALYZE,以保证良好的性能。
由于pg_dump常被用来把数据转移到更新版本的PostgreSQL,可以期望pg_dump的输出能够装载到比pg_dump自身版本更新的PostgreSQL服务器版本中。pg_dump也可以从比它自身版本更旧的PostgreSQL服务器上转储。(目前支持回到 7.0 版本的服务器。)然而,pg_dump不能从比它自身主版本更新的PostgreSQL服务器上转储;它甚至会拒绝尝试,而不冒生成无效转储的风险。此外,不能保证pg_dump的输出能够装载到更旧主版本的服务器中—即使转储正是从该版本的服务器上取得的。把转储文件装载到较旧的服务器时,可能需要手工编辑转储文件,以移除较旧服务器不理解的语法。
示例
要转储一个数据库:
$pg_dump mydb > db.out
要重新装载这个数据库:
$psql -d database -f db.out
要把一个名为 mydb 的数据库转储到 tar
文件中:
$pg_dump -Ft mydb > db.tar
要把这个转储重新装载到一个名为 newdb 的现有数据库中:
$pg_restore -d newdb db.tar
历史
pg_dump 工具最早出现在 Postgres95 的 0.02 版中。非纯文本输出格式是在 PostgreSQL 7.1 版中引入的。