pg_restore

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

概要

  1. pg_restore [connection-option ...] [restore_option ...] filename
  2. pg_restore -? | --help
  3. pg_restore -V | --version

描述

pg_restore是一种工具,用于从pg_dump创建的非明文格式之一的存档中恢复数据库。 它将发出将数据库重建到保存时所处状态的必要命令。 存档文件还允许pg_restore对恢复的内容具有选择性,甚至可以在恢复之前对项目进行重新排序。

pg_restore可以在两种模式下运行。 如果指定了数据库名称,则存档将直接还原到数据库中。 否则,将创建一个脚本,该脚本包含重建数据库所需的SQL命令,并将其写入文件或标准输出。 脚本输出等效于pg_dump的纯文本输出格式。 因此,控制输出的某些选项类似于pg_dump选项。

pg_restore无法恢复存档文件中不存在的信息。 例如,如果使用“将数据作为INSERT命令转储”选项进行归档,则pg_restore将无法使用COPY语句加载数据。

Note: --ignore-version选项已弃用,在以后的版本中将被删除。

选项

filename

指定要还原的档案文件的位置(或目录,对于目录格式归档)。 如果未指定,则使用标准输入。

恢复选项

-a | —data-only

仅转储数据,而不转储模式(数据定义)。表数据和序列值将转储,如果在归档文件中有的话。

此选项与--section=data相似,但由于历史原因不同。

-c | —clean

在重新创建数据库对象之前,先对其进行清理(删除)。 (如果目标数据库中不存在任何对象,则恢复可能会生成一些无害的错误消息。)

-C | —create

在还原到数据库之前先创建它。 如果还指定了--clean,请在连接到目标数据库之前删除并重新创建目标数据库。

使用此选项时,以-d命名的数据库仅用于发出初始DROP DATABASE和CREATE DATABASE命令。 所有数据都将还原到存档中显示的数据库名称中。

-d dbname | —dbname=dbname

连接到该数据库,然后直接还原到该数据库。 与大多数其他Greenplum数据库工具一样,该工具也使用libpq支持的环境变量。 但是,如果未提供数据库名称,它将不会读取PGDATABASE。

-e | —exit-on-error

如果在向数据库发送SQL命令时遇到错误,则退出。 默认设置为继续并在还原结束时显示错误计数。

-f outfilename | —file=outfilename

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

-F c|d|t | —format={custom | directory | tar}

pg_dump生成的归档文件格式。 无需指定格式,因为pg_restore将自动确定格式。 格式可以是custom,directory或tar。

-i | —ignore-version

Note: 此选项已被弃用,并将在以后的版本中删除。

忽略数据库版本检查。

-I index | —index=index

仅还原命名索引的定义。

-j | —number-of-jobs | —jobs=number-of-jobs

使用多个并发作业运行pg_restore中最耗时的部分 - 加载数据,创建索引或创建约束的部分。 此选项可以大大减少将大型数据库还原到多处理器计算机上运行的服务器的时间。

每个作业是一个进程或一个线程,具体取决于操作系统,并使用与服务器的单独连接。

此选项的最佳值取决于服务器,客户端和网络的硬件设置。 影响因素包括CPU内核数和磁盘设置。 一个不错的起点是服务器上的CPU内核数量,但是在许多情况下,大于该数量的值也可以缩短还原时间。 当然,太高的值会由于抖动而导致性能下降。

此选项仅支持自定义存档格式。 输入文件必须是常规文件(例如,不是管道)。 发出脚本而不是直接连接到数据库服务器时,将忽略此选项。 另外,不能将多个作业与--single-transaction选项一起使用。

-l | —list

列出归档的内容。 此操作的输出可与-L选项一起使用,以限制和重新排序要还原的项目。

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

仅还原list-file中的元素,并还原它们在文件中出现的顺序。 请注意,如果将-n或-t之类的过滤开关与-L一起使用,它们将进一步限制恢复的项目。

通常,通过编辑先前的-l操作的输出来创建list-file。 可以移动或删除行,也可以通过在行的开头放置分号(;)来注释掉行。 请参阅下面的示例。

-n schema | —schema=schema

仅还原命名模式中的对象。 可以将其与-t选项结合使用以仅还原特定表。

-O | —no-owner

不要输出命令来设置对象的所有权以匹配原始数据库。 默认情况下,pg_restore发出ALTER OWNER或SET SESSION AUTHORIZATION语句来设置所创建模式元素的所有权。 除非由超级用户(或拥有脚本中所有对象的同一用户)建立与数据库的初始连接,否则这些语句将失败。 使用-O,可以将任何用户名用于初始连接,并且该用户将拥有所有创建的对象。

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

仅还原命名函数。 函数名称必须用引号引起来。 注意,函数名称和参数的拼写必须与转储文件的目录中的拼写完全相同(如--list选项所示)。

-s | —schema-only

如果模式条目存在于归档中,则仅还原模式(数据定义),而不还原数据。

此选项与--data-only相反。 它类似于--section=pre-data —section=post-data,但由于历史原因不同。

(不要将此与--schema选项混淆,该选项以不同的含义使用“schema”一词。)

-S username | —superuser=username

指定禁用触发器时要使用的超级用户名。 仅在使用--disable-triggers时才有意义。

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

-t table | —table=table

仅还原命名表的定义和/或数据。 可以使用多个-t开关指定多个表。 可以将它与-n选项结合使用以指定模式。

-T trigger | —trigger=trigger

仅还原命名触发器。

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

-v | —verbose

指定详细模式。

-V | —version

打印pg_restore版本并退出。

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

防止转储访问权限(GRANT/REVOKE命令)。

-1 | —single-transaction

作为单个事务执行还原。 这样可以确保所有命令都成功完成,或者不应用任何更改。

--disable-triggers

仅当创建仅数据恢复时,此选项才相关。 它指示pg_restore在重载数据时执行命令以临时禁用目标表上的触发器。 如果不想在数据重装期间调用的表上有触发器,请使用此选项。 为--disable-triggers发出的命令必须以超级用户身份执行。 因此,您还应该使用-S指定超级用户名,或者最好以超级用户身份运行pg_restore。

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

--no-data-for-failed-tables

默认情况下,即使表的创建命令失败(例如,因为它已经存在),表数据也将还原。 使用此选项,将跳过此类表的数据。 当目标数据库可能已经包含所需的表内容时,此行为很有用。 指定此选项可防止加载重复或过时的数据。 该选项仅在直接还原到数据库中时才有效,在生成 SQL 脚本输出时无效。

--no-security-labels

即使存档包含安全标签,也不要输出命令以还原安全标签。

--no-tablespaces

不输出命令以选择表空间。 使用此选项,将在还原期间的默认表空间中创建所有对象。

--section=sectionname

仅还原命名节。 节名称可以是pre-data,data或post-data。 可以多次指定此选项以选择多个节。

默认为还原所有节。

--use-set-session-authorization

输出SQL标准的SET SESSION AUTHORIZATION命令而不是ALTER OWNER命令来确定对象所有权。 这使转储更加符合标准,但是依赖转储中对象的历史记录,可能无法正确还原。

-? | —help

显示有关pg_restore命令行参数的帮助,然后退出。

连接选项

-h host | —host host

运行Greenplum数据库master数据库服务器的计算机的主机名。 如果未指定,则从环境变量PGHOST读取或默认为localhost。

-p port | —port port

Greenplum master数据库服务器正在侦听连接的TCP端口。 如果未指定,则从环境变量PGPORT读取或默认为5432。

-U username | —username username

要用作连接的数据库角色名称。 如果未指定,则从环境变量PGUSER读取或默认为当前系统角色名称。

-w | —no-password

不发出密码提示。 如果服务器要求密码验证,而其他方式(例如.pgpass文件)无法使用密码,则连接尝试将失败。 此选项在没有用户输入密码的批处理作业和脚本中很有用。

-W | —password

强制输入密码提示。

--role=rolename

指定用于执行还原的角色名称。 此选项使pg_restore在连接到数据库后发出SET ROLE rolename命令。 当通过身份验证的用户(由-U指定)缺少pg_restore所需的特权,但可以切换到具有所需权限的角色时,此功能很有用。 某些安装有禁止直接以超级用户身份登录的策略,并且使用此选项可以在不违反策略的情况下进行还原。

注解

如果您的安装对template1数据库有任何本地添加,请小心将pg_restore的输出加载到一个真正的空数据库中; 否则,由于添加对象的重复定义,您很可能会出错。 要创建没有任何本地添加的空数据库,请从template0而不是template1复制,例如:

  1. CREATE DATABASE foo WITH TEMPLATE template0;

当将数据恢复到预先存在的表并使用选项--disable-triggers时, pg_restore在插入数据之前发出命令以禁用用户表上的触发器,然后在插入数据后发出命令以重新启用它们。 如果还原在中间停止,则系统catalog可能处于错误状态。

另请参阅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 Mon Sep 14 13:55:39 2009
  2. ; dbname: DBDEMOS
  3. ; TOC Entries: 81
  4. ; Compression: 9
  5. ; Dump Version: 1.10-0
  6. ; Format: CUSTOM
  7. ; Integer: 4 bytes
  8. ; Offset: 8 bytes
  9. ; Dumped from database version: 8.3.5
  10. ; Dumped by pg_dump version: 8.3.8
  11. ;
  12. ; Selected TOC Entries:
  13. ;
  14. 3; 2615 2200 SCHEMA - public pasha
  15. 1861; 0 0 COMMENT - SCHEMA public pasha
  16. 1862; 0 0 ACL - public pasha
  17. 317; 1247 17715 TYPE public composite pasha
  18. 319; 1247 25899 DOMAIN public domain0 pasha2

分号开始注释,行开头的数字指代分配给每个项目的内部档案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:

  1. pg_restore -L db.list db.dump

另见

pg_dump