pg_restore
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语句装载该数据。
选项
- 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