pg_restore

    描述

    pg_restore是一个用于从以一种非纯文本格式创建的归档中恢复数据库的工具。它将发出必要的命令将数据库重构为其被保存时的状态。归档文件还允许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选项以限制和重排序要恢复的项。

    -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数据库不支持用户定义的触发器。

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

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

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

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

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

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

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

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

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

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

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

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

      1. 10; 145433 TABLE map_resolutions postgres
      2. ;2; 145344 TABLE species postgres
      3. 6; 145402 TABLE species_records postgres

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

      pg_restore -L db.list db.dump

      另见