↑↓ 选择 ↵ 打开 ⌫ 改范围 完整检索页

pgsql.cc 提供对 postgresql.org 官网内容的中文翻译,由 Pigsty 团队维护。

受支持版本: 当前版本 (18) / 17 / 16 / 15 / 14
测试与开发版本: 19 / devel
不受支持的版本: 13 / 12 / 11 / 10 / 9.6 / 9.5 / 9.4 / 9.3 / 9.2 / 9.1 / 9.0 / 8.4 / 8.3 / 8.2 / 8.1 / 8.0 / 7.4 / 7.3 / 7.2 / 7.1
历史版本PostgreSQL 7.4 已于 2010 年 10 月结束社区维护,本页译文保留供仍在使用旧版本的读者参考。新系统请看当前版本。

pg_restore

pg_restore — 从由 pg_dump 创建的归档文件中恢复 PostgreSQL 数据库

大纲

pg_restore [option...] [filename]

描述

pg_restore 是一个用于从 pg_dump 以非纯文本格式创建的归档中恢复 PostgreSQL 数据库的工具。它会发出必要的命令,将数据库重建为保存时的状态。 归档文件还允许 pg_restore 有选择地恢复其中的内容, 甚至在恢复前重新排列各项的顺序。归档文件被设计为可跨体系结构移植。

pg_restore 可以以两种模式运行:如果指定了数据库名,归档会被直接恢复到该数据库中。(大对象只能通过这种直接数据库连接来恢复。)否则,会创建一个包含重建数据库所需 SQL 命令的脚本(并写入文件或标准输出),这与 pg_dump 纯文本格式创建的脚本类似。因此,一些控制脚本输出的选项与 pg_dump 的选项类似。

显然,pg_restore 无法恢复归档文件中不存在的信息。 例如,如果归档是使用 “将数据转储为 INSERT 命令” 选项生成的, pg_restore 就不能使用 COPY 语句装载数据。

选项

pg_restore 接受下列命令行参数。

filename

指定要恢复的归档文件的位置。如果没有指定,则使用标准输入。

-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会自动确定格式。如果指定,它可以是下列之一:

t

归档是一个 tar 归档。

c

归档是 pg_dump 的自定义格式。

-i
--ignore-version

忽略数据库版本检查。

-I index
--index=index

仅恢复指定名称的索引的定义。

-l
--list

列出归档的内容。此操作的输出可用作 -L 选项的输入。注意,如果把 -n 或 -t 这样的过滤开关与 -l 一起使用,它们会限制被列出的项。

-L list-file
--use-list=list-file

仅恢复在 list-file 中列出的归档元素, 并按它们在文件中出现的顺序进行恢复。注意, 如果把 -n 或 -t 这样的过滤开关与 -L 一起使用,它们还会进一步限制被恢复的项目。

list-file 通常是通过编辑先前 -l 操作的输出来创建的。可以移动或删除行,也可以通过在行首放置分号 (;)将其注释掉。示例见下文。

-N
--orig-order

按 pg_dump 中最初生成各项的顺序恢复各项。这个选项没有已知的实际用途,因为 pg_dump 按对它方便的顺序生成各项,而这不太可能是恢复它们的安全顺序。(这不是各项最终在归档目录中列出的顺序。)另见 -r。

-o
--oid-order

按 OID 顺序恢复各项。这个选项的用处有限,因为 OID 只是原始创建顺序的一个近似指示。如果同时指定了 -N,本选项会覆盖它。另见 -r。

-O
--no-owner

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

-P function-name(argtype [, ...])
--function=function-name(argtype [, ...])

仅恢复指定函数。请务必按转储文件目录中显示的形式准确拼写函数名和参数。

-r
--rearrange

按对象类型重排各项(如果给出了 -N 或 -o,则重排发生在其排序之后)。重排的目的是获得尽可能好的恢复性能。

当 -N、-o 和 -r 都未出现时,pg_restore 按各项在转储目录中出现的顺序恢复它们;如果给出了 -L,则按各项在 list-file 中出现的顺序。-o 加 -r 的组合复现了 pg_dump 在创建转储目录之前所做的排序,因此通常没有必要指定它。

-R
--no-reconnect

此选项已过时,但为了向后兼容仍然被接受。

-s
--schema-only

只恢复模式(数据定义),不恢复数据。序列值将被重置。

-S username
--superuser=username

指定在禁用触发器时要使用的超级用户用户名。仅当使用 --disable-triggers 时才相关。

-t table
--table=table

只恢复指定表的定义和/或数据。

-T trigger
--trigger=trigger

仅恢复指定名称的触发器。

-v
--verbose

指定详细模式。

-x
--no-privileges
--no-acl

阻止恢复访问权限(grant/revoke 命令)。

-X use-set-session-authorization
--use-set-session-authorization

这个选项已废弃,但为了向后兼容仍然接受。pg_restore 现在总是按以前由此选项选择的方式行事。

-X disable-triggers
--disable-triggers

这个选项只在执行仅数据恢复时相关。它指示 pg_restore 执行命令,在重新装入数据期间临时禁用目标表上的触发器。如果你在表上有不希望在重新装入数据期间调用的参照完整性检查或其他触发器,请使用此选项。

目前,为 --disable-triggers 发出的命令必须以超级用户身份执行。因此,你还应当用 -S 指定一个超级用户名,或者更好的是直接以 PostgreSQL 超级用户身份运行 pg_restore。

pg_restore还接受以下用于连接参数的命令行参数:

-h host
--host=host

指定服务器运行所在机器的主机名。如果该值以斜杠开头,则它被用作 Unix 域套接字目录。 默认值取自 PGHOST 环境变量(如果已设置),否则会尝试使用 Unix 域套接字连接。

-p port
--port=port

指定服务器监听连接所使用的 TCP 端口或本地 Unix 域套接字文件扩展名。 默认值取自 PGPORT 环境变量(如果已设置),否则使用编译时的默认值。

-U username

以给定用户身份连接。

-W

强制提示口令。如果服务器要求口令认证,这应当自动发生。

环境

PGHOST
PGPORT
PGUSER

默认连接参数

诊断

当使用 -d 选项指定直接数据库连接时, pg_restore 会在内部执行 SQL 语句。 如果运行 pg_restore 时遇到问题,请确保你能够使用例如 psql 从该数据库中查询信息。

注解

如果你的安装在 template1 数据库中有任何本地添加内容, 请务必将 pg_restore 的输出装载到一个真正空的数据库中; 否则很可能会因为这些附加对象的重复定义而报错。要创建一个不带任何本地添加内容的空数据库, 应从 template0 而不是 template1 复制,例如:

CREATE DATABASE foo WITH TEMPLATE template0;

pg_restore 的局限性详述如下。

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

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

关于 pg_dump 的局限性的细节也可参见 pg_dump 文档。

恢复完成后,最好对每个恢复的表运行 ANALYZE,以便优化器获得有用的统计信息。

示例

要把一个名为 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 报告译文问题。 英文原文本身的问题,请在当前版本的对应页面向上游反馈;上游不再修订已结束维护的版本。