pg_restore
从pg_dump创建的归档文件恢复数据库。
概要
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进行拷贝,例如:
CREATE DATABASE foo WITH TEMPLATE template0;
在恢复数据到一个预先存在的表并且使用选项--disable-triggers时,pg_restore会在插入数据之前发出禁用用户表上触发器的命令,然后在数据被插入之后重新启用它们。如果恢复中途停止,系统目录可能会处于错误状态。
pg_restore将不会为单个表恢复大对象。如果一个归档包含大对象,那么所有的大对象都将被恢复。
pg_dump上限制的详情请见pg_dump的文档。
一旦完成恢复,在每个数据库上运行ANALYZE是明智的做法,这样查询规划器将会获得有用的统计信息。
示例
假定我们已经把一个名为mydb的数据库转储到一个自定义格式的转储文件中:
pg_dump -Fc mydb > db.dump
删除该数据库并且从转储重建它:
dropdb mydb
pg_restore -C -d template1 db.dump
把该转储重新装载到一个新的名为newdb的数据库中。注意这里没有-C,我们是直接连接到要恢复到其中的数据库。还要注意,我们是从template0而不是template1克隆得到的新数据库,以确保它初始为空:
createdb -T template0 newdb
pg_restore -d newdb db.dump
为了重排序数据库项,首先需要转储该归档的内容表:
pg_restore -l db.dump > db.list
该列表文件有一个头部和每一项的一行构成,例如:
; Archive created at Fri Jul 28 22:28:36 2006
; dbname: mydb
; TOC Entries: 74
; Compression: 0
; Dump Version: 1.4-0
; Format: CUSTOM
;
; Selected TOC Entries:
;
2; 145344 TABLE species postgres
3; 145344 ACL species
4; 145359 TABLE nt_header postgres
5; 145359 ACL nt_header
6; 145402 TABLE species_records postgres
7; 145402 ACL species_records
8; 145416 TABLE ss_old postgres
9; 145416 ACL ss_old
10; 145433 TABLE map_resolutions postgres
11; 145433 ACL map_resolutions
12; 145443 TABLE hs_old postgres
13; 145443 ACL hs_old
分号开始的是注释,行首的数字表示分配给每个项的内部归档ID。文件中的行可以被注释、删除和重排序。例如:
10; 145433 TABLE map_resolutions postgres
;2; 145344 TABLE species postgres
;4; 145359 TABLE nt_header postgres
6; 145402 TABLE species_records postgres
;8; 145416 TABLE ss_old postgres
该文件可以被用作pg_restore的输入并且仅会先恢复项10然后恢复项6:
pg_restore -L db.list db.dump