从pg_dump
创建的归档文件恢复数据库。
概要
pg_restore [connection_option ...] [restore_option ...] filename
描述
pg_restore
是一个用于从[pg_dump](pg_dump.html#topic1)
以一种非纯文本格式创建的归档中恢复数据库的工具。它将发出必要的命令将数据库重构为其被保存时的状态。归档文件还允许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_dump.html#topic1)
产生的归档的格式。没有必要指定该格式,因为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
另见
[pg_dump](pg_dump.html#topic1)