pg_restore

从pg_dump创建的归档文件恢复数据库。

概要

  1. pg_restore [connection_option ...] [restore_option ...] filename

描述

pg_restore是一个用于从pg_dump以一种非纯文本格式创建的归档中恢复数据库的工具。它将发出必要的命令将数据库重构为其被保存时的状态。归档文件还允许pg_restore有选择性地恢复,甚至重新排序被恢复的项。

pg_restore可以以两种模式操作。如果指定一个数据库名,归档会被直接恢复到该数据库中。否则,一个包含重建该数据库所需的SQL命令的脚本会被创建并且被写入到一个文件或者标准输出。该脚本输出等效于pg_dump的纯文本输出格式。因此控制该输出的一些选项类似于pg_dump的选项。

pg_restore无法恢复不存在于归档文件中的信息。例如,如果归档通过使用“将数据转储为INSERT命令”选项生成,pg_restore将无法使用COPY语句装载该数据。

注意: --ignore-version选项已被弃用并且将在未来的发行中被移除。

选项

filename

指定要被恢复的归档文件的位置。如果没有指定,将使用标准输入。

恢复选项

-a | —data-only

仅恢复数据而不恢复模式(数据定义)。

-c | —clean

在重新创建数据库对象之前清除(删除)它们。

-C | —create

在恢复到数据库之前先创建它(当这一选项被使用时,-d中提及的数据库仅被用来发出初始的CREATE DATABASE命令。所有数据会被恢复到归档中出现的数据库名中。)。

-d dbname | —dbname=dbname

连接到这个数据库并且直接恢复到这个数据库中。默认是使用PGDATABASE环境变量设置,或者使用与当前系统用户相同的名字。

-e | —exit-on-error

在发送SQL命令到数据库的过程中如果遇到错误就退出。默认是继续恢复并且在恢复结束时显示一个错误计数。

-f outfilename | —file=outfilename

为生成的脚本或者使用-l时的列表指定输出文件。默认是标准输出。

-F t |c | —format=tar | custom

pg_dump产生的归档的格式。没有必要指定该格式,因为pg_restore将自动判断格式。格式可以是tar或者custom。

-i | —ignore-version

注意: 这个选项已经被弃用并且将在未来的发行中被移除。

忽略数据库版本检查。

-I index | —index=index

只恢复提及的索引的定义。

-l | —list

列出该归档的内容。这一操作的输出可以被用于-L选项以限制和重排序要恢复的项。

-L list-file | —use-list=list-file

仅恢复list-file中的对象,并且按照它们出现在该文件中的顺序恢复。行可以被移除,也可以通过在行首放一个;将它注释掉。

-n schema | —schema=schema

仅恢复所提及方案中的对象。这可以与-t选项组合在一起来只恢复一个特定表。

-O | —no-owner

不要输出设置对象拥有关系的命令以匹配原始数据库。默认情况下,pg_dump会发出ALTER OWNER或者SET SESSION AUTHORIZATION语句以设置被创建的数据库对象的拥有关系。除非该脚本由超级用户(或者拥有脚本中所有对象的同一用户)启动,该脚本运行时这些语句将会失败。通过-O选项,任意用户名都可以被用于初始连接,并且该用户将拥有所有被创建的对象。

-P ‘function-name(argtype [, …])’ | —function=’function-name(argtype [, …])’

仅恢复提及的函数。函数名必须被封闭在引号中。要仔细地拼写函数名和参数,使它们和转储文件中的内容完全相同(如--list选项所示)。

-s | —schema-only

仅恢复模式(数据定义)而不恢复数据(表内容)。序列的当前值也将不会被恢复(不要把这个选项与--schema弄混,这两个选项使用了schema这个词的不同含义)。

-S username | —superuser=username

指定在禁用触发器时要使用的超级用户的用户名。仅当--disable-triggers被使用时,这个选项才相关。

注意: Greenplum数据库不支持用户定义的触发器。

-t table | —table=table

仅恢复被提及表的定义和/或数据。

-T trigger | —trigger=trigger

仅恢复提及的触发器。

注意: Greenplum数据库不支持用户定义的触发器。

-v | —verbose

指定详细模式。

-x | —no-privileges | —no-acl

防止恢复访问特权(GRANT/REVOKE命令)。

--disable-triggers

仅当执行只恢复数据的恢复时,这个选项才相关。它指示pg_restore在数据被重新装载时执行命令临时禁用目标表上的触发器。如果在表上有不想在数据重新装载时调用的触发器,就使用这个选项。为--disable-triggers发出的命令必须作为超级用户完成。因此,用户还应该用-S指定一个超级用户名,或者宁愿小心地作为超级用户启动结果脚本。

注意: Greenplum数据库不支持用户定义的触发器。

--no-data-for-failed-tables

默认情况下,即使表的创建命令失败(例如因为它已经存在),表数据也会被恢复。通过这一选项,这类表的数据将被跳过。当目标数据库可能已经包含想要的表内容时,这种行为很有用。指定这一选项可防止重复的或者过时的数据被装载。仅当直接恢复到数据库时这个选项才相关,而产生SQL脚本输出时这个选项不相关。

连接选项

-h host | —host host

指定Greenplum的Master数据库服务器在其上运行的机器的主机名。如果没有指定,会从环境变量PGHOST读取或者默认为localhost。

-p port | —port port

指定Greenplum的Master数据库服务器在其上监听连接的TCP端口。如果没有指定,会从环境变量PGPORT读取或者默认为5432。

-U username | —username username

要用其进行连接的数据库角色名。如果没有指定,会从环境变量PGUSER读取或者默认为当前系统用户名。

-W | —password

强制口令提示。

-1 | —single-transaction

将恢复作为一个单一事务执行。这能确保要么所有命令成功完成,要么什么更改也不发生。

注解

如果用户的安装对template1数据库有任何本地的附加物,装载pg_restore的输出到一个真正的空数据库中时要小心;否则用户很可能由于附加对象的重复定义而得到错误。要得到一个没有任何本地附加物的空数据库,从template0而非template1进行拷贝,例如:

  1. CREATE DATABASE foo WITH TEMPLATE template0;

在恢复数据到一个预先存在的表并且使用选项--disable-triggers时,pg_restore会在插入数据之前发出禁用用户表上触发器的命令,然后在数据被插入之后重新启用它们。如果恢复中途停止,系统目录可能会处于错误状态。

pg_restore将不会为单个表恢复大对象。如果一个归档包含大对象,那么所有的大对象都将被恢复。

pg_dump上限制的详情请见pg_dump的文档。

一旦完成恢复,在每个数据库上运行ANALYZE是明智的做法,这样查询规划器将会获得有用的统计信息。

示例

假定我们已经把一个名为mydb的数据库转储到一个自定义格式的转储文件中:

  1. pg_dump -Fc mydb > db.dump

删除该数据库并且从转储重建它:

  1. dropdb mydb
  2. pg_restore -C -d template1 db.dump

把该转储重新装载到一个新的名为newdb的数据库中。注意这里没有-C,我们是直接连接到要恢复到其中的数据库。还要注意,我们是从template0而不是template1克隆得到的新数据库,以确保它初始为空:

  1. createdb -T template0 newdb
  2. pg_restore -d newdb db.dump

为了重排序数据库项,首先需要转储该归档的内容表:

  1. pg_restore -l db.dump > db.list

该列表文件有一个头部和每一项的一行构成,例如:

  1. ; Archive created at Fri Jul 28 22:28:36 2006
  2. ; dbname: mydb
  3. ; TOC Entries: 74
  4. ; Compression: 0
  5. ; Dump Version: 1.4-0
  6. ; Format: CUSTOM
  7. ;
  8. ; Selected TOC Entries:
  9. ;
  10. 2; 145344 TABLE species postgres
  11. 3; 145344 ACL species
  12. 4; 145359 TABLE nt_header postgres
  13. 5; 145359 ACL nt_header
  14. 6; 145402 TABLE species_records postgres
  15. 7; 145402 ACL species_records
  16. 8; 145416 TABLE ss_old postgres
  17. 9; 145416 ACL ss_old
  18. 10; 145433 TABLE map_resolutions postgres
  19. 11; 145433 ACL map_resolutions
  20. 12; 145443 TABLE hs_old postgres
  21. 13; 145443 ACL hs_old

分号开始的是注释,行首的数字表示分配给每个项的内部归档ID。文件中的行可以被注释、删除和重排序。例如:

  1. 10; 145433 TABLE map_resolutions postgres
  2. ;2; 145344 TABLE species postgres
  3. ;4; 145359 TABLE nt_header postgres
  4. 6; 145402 TABLE species_records postgres
  5. ;8; 145416 TABLE ss_old postgres

该文件可以被用作pg_restore的输入并且仅会先恢复项10然后恢复项6:

pg_restore -L db.list db.dump

另见

pg_dump