pgsql.cc 提供对 postgresql.org 官网内容的中文翻译,由 Pigsty 团队维护。
pg_restore — 从由 pg_dump 创建的归档文件中恢复 PostgreSQL 数据库
pg_restore [options...]
pg_restore 是一个用于从 pg_dump 以非纯文本格式创建的归档中恢复 PostgreSQL 数据库的工具。它会发出重新生成所有用户定义类型、函数、表、索引、聚集和操作符以及表中数据所需的命令。
归档文件包含供 pg_restore 重建数据库的信息,同时还允许 pg_restore 有选择地恢复其中的内容,甚至在恢复前重新排列各项的顺序。归档文件被设计为可跨体系结构移植。
pg_restore 可以以两种模式运行:如果指定了数据库名,归档会被直接恢复到该数据库中。否则,会创建一个包含重建数据库所需 SQL 命令的脚本(并写入文件或标准输出),这与 pg_dump 纯文本格式创建的脚本类似。因此,一些控制脚本输出的选项与 pg_dump 的选项类似。
显然,pg_restore 无法恢复归档文件中不存在的信息。例如,如果归档是使用“将数据转储为 INSERT 命令” 选项生成的, pg_restore 就不能使用 COPY 语句装载数据。
pg_restore 接受下列命令行参数。(长选项形式只在某些平台上可用。)
archive-name指定要恢复的归档文件的位置。如果没有指定,则使用标准输入。
-a--data-only只恢复数据,不恢复模式(定义)。
-c--clean在重新创建数据库对象之前清理(删除)它们。
-C--create在恢复之前先创建数据库。(使用此开关时,由 -d 指定的数据库仅用于发出初始的 CREATE DATABASE 命令。所有数据都会恢复到归档中出现的数据库名中。)
-d dbname--dbname=dbname连接到数据库 dbname 并直接恢复到该数据库中。大对象只能通过直接数据库连接来恢复。
-f filename--file=filename指定生成脚本的输出文件,或者在与 -l 一起使用时指定列表输出文件。默认为标准输出。
-F format--format=format指定归档的格式。没有必要指定格式,因为 pg_restore 会自动确定格式。如果指定,它可以是下列之一:
归档是一个 tar 归档。使用这种归档格式允许在恢复数据库时重排和/或排除模式元素,也可以限制恢复时重新装载哪些数据。
归档是 pg_dump 的自定义格式。这是最灵活的格式,因为它既允许重排数据装载也允许重排模式元素。这种格式默认还是压缩的。
-i--ignore-version忽略数据库版本检查。
-I index--index=index仅恢复指定名称 index 的定义。
-l--list列出归档的内容。此命令的输出可与 -L 选项一起使用,以限制并重排被恢复的项。
-L list-file--use-list=list-file仅恢复 list-file 中列出的元素,并按它们在文件中出现的顺序进行恢复。可以移动行,也可以通过在行首放置 ; 将其注释掉。
-N--orig-order按原始转储顺序恢复各项。默认情况下, pg_dump 会按对 pg_dump 方便的顺序转储各项,然后按修改过的 OID 顺序保存归档。此选项覆盖 OID 排序。
-o--oid-order按 OID 顺序恢复各项。默认情况下, pg_dump 会按对 pg_dump 方便的顺序转储各项,然后按修改过的 OID 顺序保存归档。此选项强制严格的 OID 排序。
-O--no-owner阻止任何恢复原始对象所有权的尝试。对象将属于用来连接数据库的用户名。
-P function-name(argtype [, ...])--function=function-name(argtype [, ...])指定要恢复的过程或函数。
-r--rearrange按修改过的 OID 顺序恢复各项。默认情况下, pg_dump 会按对 pg_dump 方便的顺序转储各项,然后按修改过的 OID 顺序保存归档。大多数对象会按 OID 顺序恢复,但有些东西(如规则和索引)会在过程结束时恢复,而不管它们的 OID 如何。此选项是默认值。
-R--no-reconnect在恢复归档时,pg_restore 通常不得不以不同的用户名多次重新连接数据库,以设置所创建对象的正确所有权。如果这不可取(例如,因为每次重新连接都需要手工交互(口令)),此选项可阻止 pg_restore 发出任何重新连接请求。(在纯文本模式下、未连接数据库时的连接请求,是通过发出 psql 的 \connect 命令完成的。)不过,此选项是相当 blunt 的工具,因为它会使 pg_restore 丢失所有对象所有权信息,除非你使用 -X use-set-session-authorization 选项。
-s--schema-only恢复模式(定义),不恢复数据。序列值会被重置。
-S username--superuser=username指定在禁用触发器时要使用的超级用户用户名。仅当使用 --disable-triggers 时才相关。
-t table--table=table只恢复 table 的模式/数据。
-T trigger--trigger=trigger仅恢复 trigger 的定义。
-v--verbose指定详细模式。
-x--no-privileges--no-acl阻止恢复访问权限(grant/revoke 命令)。
-X use-set-session-authorization--use-set-session-authorization通常,如果恢复归档需要更改当前数据库用户(例如设置正确的对象所有权),就必须打开一个新的数据库连接,这可能需要手工交互(例如口令)。如果你使用 -X use-set-session-authorization 选项, pg_restore 将改用 SET SESSION AUTHORIZATION 命令。这具有相同的效果,但它要求恢复归档的用户是数据库超级用户。此选项实际上覆盖了 -R 选项。
-X disable-triggers--disable-triggers这个选项只在执行仅数据恢复时相关。它指示 pg_restore 执行命令,在重新装入数据期间临时禁用目标表上的触发器。如果你在表上有不希望在重新装入数据期间调用的参照完整性检查或其他触发器,请使用此选项。
目前,为 --disable-triggers 发出的命令必须以超级用户身份执行。因此,你还应当用 -S 指定一个超级用户名,或者更好的是指定 --use-set-session-authorization 并以 PostgreSQL 超级用户身份运行 pg_restore。
pg_restore 还接受以下用于连接参数的命令行参数:
-h host--host=host指定服务器运行所在机器的主机名。如果 host 以斜杠开头,则它被用作 Unix 域套接字目录。
-p port--port=port指定服务器监听连接所使用的 Internet TCP/IP 端口或本地 Unix 域套接字文件扩展名。端口号默认为 5432,或 PGPORT 环境变量的值(如果已设置)。
-U username以给定用户身份连接。
-W强制提示口令。如果服务器要求口令认证,这应当自动发生。
PGHOSTPGPORTPGUSER默认连接参数。
Connection to database 'template1' failed.
connectDBStart() -- connect() failed: No such file or directory
Is the postmaster running locally
and accepting connections on Unix socket '/tmp/.s.PGSQL.5432'?
pg_restore 无法连接到指定主机和端口上的 PostgreSQL 服务器进程。如果你看到这条消息,请确保服务器运行在正确的主机上,并且你指定了正确的端口。如果你的站点使用认证系统,请确保你已获得所需的认证凭据。
当使用 -d 选项指定直接数据库连接时, pg_restore 会在内部执行 SQL 语句。如果运行 pg_restore 时遇到问题,请确保你能够使用例如 psql 从该数据库中查询信息。
如果你的安装在 template1 数据库中有任何本地添加内容, 请务必将 pg_restore 的输出装载到一个真正空的数据库中; 否则很可能会因为这些附加对象的重复定义而报错。要创建一个不带任何本地添加内容的空数据库, 应从 template0 而不是 template1 复制,例如:
CREATE DATABASE foo WITH TEMPLATE = template0;
pg_restore 的局限性详述如下。
当把数据恢复到一个预先存在的表中时, pg_restore 会在插入数据前发出查询禁用用户表上的触发器,然后在数据插入后再发出查询重新启用它们。如果恢复在中途停止, 系统目录可能会处于错误状态。
pg_restore 不会为单个表恢复大对象。如果归档中包含大对象,那么所有大对象都将被恢复。
关于 pg_dump 的局限性的细节也可参见 pg_dump 文档。
要转储一个数据库:
$pg_dump mydb > db.out
要重新装载这个数据库:
$psql -d database -f db.out
要把一个名为 mydb 的包含大对象的数据库转储到一个 tar 文件中:
$pg_dump -Ft -b mydb > db.tar
要把这个数据库(连同大对象)重新装载到一个已存在的名为 newdb 的数据库中:
$pg_restore -d newdb db.tar
要重新排列数据库项的顺序,首先需要转储归档的目录:
$pg_restore -l archive.file > archive.list
列表文件由一个头部和每个项各占一行的内容组成,例如:
; ; Archive created at Fri Jul 28 22:28:36 2000 ; dbname: birds ; 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 archive.list archive.file
pg_restore 工具最早出现在 PostgreSQL 7.1 中。
译文有误、术语不当或页面显示问题,请到译文仓库 pgsty/pgdoc 报告译文问题。 英文原文本身的问题,请在当前版本的对应页面向上游反馈;上游不再修订已结束维护的版本。