2024年9月26日: PostgreSQL 17 发布!
支持版本:当前 (17) / 16 / 15 / 14 / 13 / 12
开发版本:devel
不受支持的版本: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

pg_restore

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

概要

pg_restore [连接选项...] [选项...] [文件名]

描述

pg_restore 是一个实用程序,用于从 pg_dump 以非纯文本格式创建的归档文件中恢复 PostgreSQL 数据库。它将发出重建数据库以使其恢复到保存时的状态所需的命令。归档文件还允许 pg_restore 选择性地恢复内容,甚至在恢复之前重新排序项目。归档文件旨在跨架构移植。

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

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

选项

pg_restore 接受以下命令行参数。

文件名

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

-a
--data-only

仅恢复数据,而不恢复模式(数据定义)。如果归档文件中存在,则恢复表数据、大对象和序列值。

此选项类似于(但由于历史原因与之不完全相同)指定 --section=data

-c
--clean

在恢复数据库对象之前,发出命令以 DROP 所有将要恢复的对象。此选项对于覆盖现有数据库很有用。如果目标数据库中不存在任何对象,则将报告可忽略的错误消息,除非还指定了 --if-exists

-C
--create

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

使用 --createpg_restore 还将恢复数据库的注释(如果有),以及特定于此数据库的任何配置变量设置,即,任何提及此数据库的 ALTER DATABASE ... SET ...ALTER ROLE ... IN DATABASE ... SET ... 命令。还将恢复数据库本身的访问权限,除非指定了 --no-acl

使用此选项时,使用 -d 命名的数据库仅用于发出初始 DROP DATABASECREATE DATABASE 命令。所有数据都将恢复到归档文件中出现的数据库名称。

-d dbname
--dbname=dbname

连接到数据库 dbname 并直接恢复到数据库中。 dbname 可以是 连接字符串。如果是这样,连接字符串参数将覆盖任何冲突的命令行选项。

-e
--exit-on-error

如果在将 SQL 命令发送到数据库时遇到错误,则退出。默认情况下,将继续并显示恢复结束时的错误计数。

-f filename
--file=filename

指定生成的脚本的输出文件,或与 -l 一起使用时的列表。使用 - 表示 stdout

--filter=filename

指定要从中读取模式的文件名,以从恢复中排除或包含对象。这些模式根据与 -n/--schema 相同的规则进行解释,以包含模式中的对象,-N/--exclude-schema 以排除模式中的对象,-P/--function 以恢复命名的函数,-I/--index 以恢复命名的索引,-t/--table 以恢复命名的表或 -T/--trigger 以恢复触发器。要从 STDIN 读取,请使用 - 作为文件名。 --filter 选项可以与上面列出的选项结合使用以包含或排除对象,并且可以多次指定以用于多个过滤器文件。

该文件每行列出一个数据库模式,格式如下

{ include | exclude } { function | index | schema | table | trigger } PATTERN

第一个关键字指定模式匹配的对象是包含还是排除。第二个关键字指定使用模式过滤的对象类型

  • function:函数,工作方式与 -P/--function 选项相同。此关键字只能与 include 关键字一起使用。

  • index:索引,工作方式与 -I/--indexes 选项相同。此关键字只能与 include 关键字一起使用。

  • schema:模式,工作方式与 -n/--schema-N/--exclude-schema 选项相同。

  • table:表,工作方式与 -t/--table 选项相同。此关键字只能与 include 关键字一起使用。

  • trigger:触发器,工作方式与 -T/--trigger 选项相同。此关键字只能与 include 关键字一起使用。

# 开头的行被视为注释并被忽略。注释也可以放在对象模式行的后面。空行也被忽略。有关如何在模式中执行引用的方法,请参见 模式

-F format
--format=format

指定归档文件的格式。无需指定格式,因为 pg_restore 将自动确定格式。如果指定,则可以是以下之一

c
custom

归档文件采用 pg_dump 的自定义格式。

d
directory

归档文件是一个目录归档文件。

t
tar

归档文件是一个 tar 归档文件。

-I index
--index=index

仅恢复命名索引的定义。可以使用多个 -I 开关指定多个索引。

-j 作业数
--jobs=作业数

并发运行 pg_restore 最耗时的步骤——加载数据、创建索引或创建约束的步骤,使用多达 作业数 个并发会话。此选项可以大大减少将大型数据库恢复到运行在多处理器机器上的服务器所需的时间。在发出脚本而不是直接连接到数据库服务器时,将忽略此选项。

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

此选项的最佳值取决于服务器、客户端和网络的硬件设置。因素包括 CPU 内核数量和磁盘设置。一个好的起点是服务器上的 CPU 内核数量,但在许多情况下,更大的值也可能导致更快的恢复时间。当然,过高的值会导致性能下降,因为会出现争用。

此选项仅支持自定义和目录归档格式。输入必须是常规文件或目录(例如,不能是管道或标准输入)。此外,多个作业不能与选项--single-transaction一起使用。

-l
--list

列出归档文件的目录结构。此操作的输出可以用作-L选项的输入。请注意,如果将-n-t等过滤开关与-l一起使用,它们将限制列出的项目。

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

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

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

-n schema
--schema=schema

仅还原命名模式中的对象。可以使用多个-n开关指定多个模式。这可以与-t选项结合使用,以仅还原特定表。

-N schema
--exclude-schema=schema

不还原命名模式中的对象。可以使用多个-N开关指定多个要排除的模式。

如果同时为同一个模式名称指定了-n-N,则-N开关优先,并且该模式将被排除。

-O
--no-owner

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

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

仅还原命名的函数。请确保函数名称和参数与转储文件目录结构中显示的完全相同。可以使用多个-P开关指定多个函数。

-R
--no-reconnect

此选项已过时,但出于向后兼容性考虑仍然接受。

-s
--schema-only

仅还原模式(数据定义),而不还原数据,前提是模式条目存在于归档文件中。

此选项与--data-only相反。它类似于(但由于历史原因不完全相同)指定--section=pre-data --section=post-data

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

-S username
--superuser=username

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

-t table
--table=table

仅还原命名表的定义和/或数据。为此,table包括视图、物化视图、序列和外部表。可以通过编写多个-t开关来选择多个表。此选项可以与-n选项结合使用以指定特定模式中的表。

注意

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

注意

此标志的行为与pg_dump-t标志并不完全相同。pg_restore目前没有通配符匹配的规定,也不能在其-t中包含模式名称。并且,虽然pg_dump-t标志还会转储所选表的辅助对象(例如索引),但pg_restore-t标志不包括此类辅助对象。

注意

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

-T trigger
--trigger=trigger

仅还原命名的触发器。可以使用多个-T开关指定多个触发器。

-v
--verbose

指定详细模式。这将导致pg_restore将详细的对象注释和启动/停止时间输出到输出文件,并将进度消息输出到标准错误。重复此选项会导致其他调试级别消息出现在标准错误中。

-V
--version

打印pg_restore版本并退出。

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

阻止还原访问权限(授予/撤销命令)。

-1
--single-transaction

将还原作为单个事务执行(即,将发出的命令包装在BEGIN/COMMIT中)。这可确保所有命令都成功完成,或者不应用任何更改。此选项暗示--exit-on-error

--disable-triggers

此选项仅在执行仅数据还原时才相关。它指示pg_restore执行命令以在还原数据时暂时禁用目标表上的触发器。如果您在表上具有引用完整性检查或其他触发器,并且不想在数据还原期间调用这些触发器,请使用此选项。

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

--enable-row-security

此选项仅在还原具有行安全性的表的內容时才相关。默认情况下,pg_restore会将row_security设置为关闭,以确保所有数据都还原到表中。如果用户没有足够的权限绕过行安全性,则会抛出错误。此参数指示pg_restore改为将row_security设置为打开,允许用户尝试在启用行安全性的情况下还原表的內容。如果用户没有权将转储中的行插入表中,则此操作仍然可能失败。

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

--if-exists

--clean模式下,使用DROP ... IF EXISTS命令删除对象。这会抑制可能报告的不存在错误。除非也指定了--clean,否则此选项无效。

--no-comments

即使归档文件包含注释,也不输出还原注释的命令。

--no-data-for-failed-tables

默认情况下,即使表的创建命令失败(例如,因为它已存在),也会还原表数据。使用此选项,将跳过此类表的数据。如果目标数据库已包含所需表的內容,则此行为很有用。例如,PostgreSQL扩展(如PostGIS)的辅助表可能已加载到目标数据库中;指定此选项可防止将重复或过时的數據加载到其中。

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

--no-publications

即使归档文件包含发布,也不输出还原发布的命令。

--no-security-labels

即使归档文件包含安全标签,也不输出还原安全标签的命令。

--no-subscriptions

即使归档文件包含订阅,也不输出还原订阅的命令。

--no-table-access-method

不输出选择表访问方法的命令。使用此选项,所有对象都将使用还原期间的默认表访问方法创建。

--no-tablespaces

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

--section=sectionname

仅还原命名的部分。部分名称可以是pre-datadatapost-data。可以多次指定此选项以选择多个部分。默认情况下,还原所有部分。

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

--strict-names

要求每个模式(-n/--schema)和表(-t/--table)限定符至少与备份文件中的一个模式/表匹配。

--transaction-size=N

将还原作为一系列事务执行,每个事务最多处理N个数据库对象。此选项暗示--exit-on-error

--transaction-size提供了默认行为(每个SQL命令一个事务)和-1/--single-transaction(所有还原的对象一个事务)之间的中间选择。虽然--single-transaction的开销最小,但对于大型数据库而言,它可能不切实际,因为事务将对每个还原的对象进行锁定,这可能会耗尽服务器的锁表空间。使用--transaction-size并将大小设置为几千个对象可以提供几乎相同的效果,同时限制所需的锁表空间量。

--use-set-session-authorization

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

-?
--help

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

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

-h host
--host=host

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

-p port
--port=port

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

-U username
--username=username

要连接的用户名称。

-w
--no-password

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

-W
--password

强制 pg_restore 在连接到数据库之前提示输入密码。

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

--role=rolename

指定用于执行恢复的角色名称。此选项会导致 pg_restore 在连接到数据库后发出 SET ROLE rolename 命令。当经过身份验证的用户(由 -U 指定)缺少 pg_restore 所需的权限但可以切换到具有所需权限的角色时,此选项很有用。某些安装具有禁止直接以超级用户身份登录的策略,使用此选项允许执行恢复而不会违反该策略。

环境变量

PGHOST
PGOPTIONS
PGPORT
PGUSER

默认连接参数

PG_COLOR

指定是否在诊断消息中使用颜色。可能的值为 alwaysautonever

此实用程序与大多数其他 PostgreSQL 实用程序一样,也使用 libpq 支持的环境变量(请参阅 第 32.15 节)。但是,当未提供数据库名称时,它不会读取 PGDATABASE

诊断信息

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

备注

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

CREATE DATABASE foo WITH TEMPLATE template0;

pg_restore 的限制在下面详细说明。

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

  • pg_restore 无法选择性地还原大对象;例如,仅还原特定表的那些对象。如果归档包含大对象,则将还原所有大对象,或者如果通过 -L-t 或其他选项将其排除,则不还原任何大对象。

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

还原后,建议对每个还原的表运行 ANALYZE,以便优化器拥有有用的统计信息;有关更多信息,请参阅 第 24.1.3 节第 24.1.6 节

示例

假设我们已将名为 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

分号开始注释,行开头的数字是指分配给每个项目的内部归档 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 db.list db.dump

另请参阅

pg_dumppg_dumpallpsql

提交更正

如果您在文档中看到任何不正确的内容、与您对特定功能的体验不符的内容或需要进一步澄清的内容,请使用 此表单 报告文档问题。