Note

pg_restore

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

Synopsis

pg_restore [ connection-option ...] [ option ...] [ filename ]

Description

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

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

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

Options

pg_restore 接受以下命令行参数。

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

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

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

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

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

当为相同的架构名称同时提供-n-N时,-N开关获胜,并且架构被排除。

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

(请勿将其与--schema选项混淆,该选项以不同的含义使用“模式”一词.)

Note

指定-t时,pg_restore 不会尝试还原所选表可能依赖的任何其他数据库对象。因此,不能保证将特定表还原到干净的数据库将成功。

Note

该标志的行为与 pg_dump 的-t标志不同。当前在 pg_restore 中没有通配符匹配的任何规定,也不能在其-t中包括模式名称。

Note

在 PostgreSQL 9.6 之前的版本中,此标志仅匹配表,而不匹配任何其他类型的关系。

当前,必须以超级用户身份执行为--disable-triggers发出的命令。因此,您还应该使用-S指定超级用户名,或者最好以 PostgreSQL 超级用户身份运行 pg_restore。

请注意,此选项当前还要求转储为INSERT格式,因为COPY FROM不支持行安全性。

此选项仅在直接还原到数据库中时才有效,而在生成 SQL 脚本输出时才有效。

数据部分包含实际的表数据以及大对象定义。数据后项目由索引,触发器,规则和约束(已验证的检查约束)以外的定义组成。前置数据项由所有其他数据定义项组成。

pg_restore 还接受以下命令行参数作为连接参数:

这个选项从来都不是必须的,因为如果服务器要求密码认证,pg_restore 会自动提示 Importing 密码。但是,pg_restore 会浪费连接尝试,发现服务器需要密码。在某些情况下,值得 Importing-W以避免额外的连接尝试。

Environment

与大多数其他 PostgreSQLUtil 一样,该 Util 也使用 libpq 支持的环境变量(请参见Section 33.14)。但是,当未提供数据库名称时,它不会读取PGDATABASE

Diagnostics

当使用-d选项指定直接数据库连接时,pg_restore 在内部执行 SQL 语句。如果您在运行 pg_restore 时遇到问题,请确保您能够使用例如psql从数据库中选择信息。同样,libpq 前端库使用的任何默认连接设置和环境变量都将适用。

Notes

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

CREATE DATABASE foo WITH TEMPLATE template0;

pg_restore 的限制在下面详述。

有关 pg_dump 限制的详细信息,另请参见pg_dump文档。

还原后,明智的做法是在每个还原的表上运行ANALYZE,以便优化器具有有用的统计信息。有关更多信息,请参见Section 24.1.3Section 24.1.6

Examples

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

$ pg_dump -Fc mydb > db.dump

删除数据库并从转储中重新创建它:

$ dropdb mydb
$ pg_restore -C -d postgres db.dump

-d开关中命名的数据库可以是集群中现有的任何数据库; pg_restore 仅使用它为mydb发出CREATE DATABASE命令。使用-C,数据总是还原到转储文件中显示的数据库名称中。

要将转储重新加载到名为newdb的新数据库中:

$ createdb -T template0 newdb
$ pg_restore -d newdb db.dump

注意,我们不使用-C,而是直接连接到要还原到的数据库。还要注意,我们从template0而不是template1克隆了新数据库,以确保它最初是空的。

要重新排序数据库项,首先必须转储归档文件的目录:

$ pg_restore -l db.dump > db.list

清单文件由标题和每一项的一行组成,例如:

;
; Archive created at Mon Sep 14 13:55:39 2009
;     dbname: DBDEMOS
;     TOC Entries: 81
;     Compression: 9
;     Dump Version: 1.10-0
;     Format: CUSTOM
;     Integer: 4 bytes
;     Offset: 8 bytes
;     Dumped from database version: 8.3.5
;     Dumped by pg_dump version: 8.3.8
;
;
; Selected TOC Entries:
;
3; 2615 2200 SCHEMA - public pasha
1861; 0 0 COMMENT - SCHEMA public pasha
1862; 0 0 ACL - public pasha
317; 1247 17715 TYPE public composite pasha
319; 1247 25899 DOMAIN public domain0 pasha

分号开始 Comments,行首的数字指代分配给每个项目的内部存档 ID。

文件中的行可以被 Comments 掉,删除和重新排序。例如:

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 的 Importing,并且只能按以下 Sequences 恢复项目 10 和 6:

$ pg_restore -L db.list db.dump

See Also

pg_dump, pg_dumpall, psql

上一章 首页 下一章