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

pg_restore

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

概要

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

描述

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

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

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

警告

恢复转储会导致目标执行源超级用户选择的任意代码。部分转储和部分恢复不限制这一点。如果源超级用户不受信任,则必须在恢复之前检查转储的 SQL 语句。可以使用 pg_restore--file 选项检查非纯文本转储。请注意,运行转储和恢复的客户端不必信任源或目标超级用户。

选项

pg_restore 接受以下命令行参数。

filename

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

-a
--data-only

仅恢复数据,不恢复模式(数据定义)或统计信息。如果归档中存在,则恢复表数据、大型对象和序列值。

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

-c
--clean

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

-C
--create

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

使用 --create 时,pg_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

-F format
--format=format

指定归档的格式。没有必要指定格式,因为 pg_restore 会自动确定格式。如果指定,它可以是以下之一:

c
custom

pg_dump 的归档格式是自定义格式。

d
directory

归档是目录归档。

t
tar

归档是 tar 归档。

-I index
--index=index

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

-j number-of-jobs
--jobs=number-of-jobs

并发运行 pg_restore 中耗时最多的步骤 — 即加载数据、创建索引或创建约束 — 使用最多 number-of-jobs 个并发会话。此选项可以大大缩短在多处理器计算机上运行的服务器上恢复大型数据库的时间。在生成脚本而不是直接连接到数据库服务器时,将忽略此选项。

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

此选项的最佳值取决于服务器、客户端和网络的硬件配置。因素包括 CPU 核心数和磁盘设置。一个好的起点是服务器上的 CPU 核心数,但在许多情况下,大于此值的值也能带来更快的恢复时间。当然,值太高会导致性能下降,因为会发生颠簸。

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

-l
--list

列出归档的内容表。此操作的输出可以用作 -L 选项的输入。请注意,如果与 -l 一起使用诸如 -n-t 之类的过滤开关,它们将限制列出的项目。

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

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

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--statistics-only 一起使用。它与指定 --section=pre-data --section=post-data --no-statistics 类似,但由于历史原因并不完全相同。

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

-S username
--superuser=username

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

-t 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

阻止恢复访问权限(GRANT/REVOKE 命令)。

-1
--single-transaction

将恢复作为单个事务执行(即,将发出的命令包装在 BEGIN/COMMIT 中)。这确保了要么所有命令都成功完成,要么不应用任何更改。此选项意味着 --exit-on-error

--disable-triggers

此选项仅在执行不带模式的恢复时相关。它指示 pg_restore 在恢复数据时执行命令以暂时禁用目标表上的触发器。如果存在引用完整性检查或其他触发器,并且您不希望在数据恢复期间触发它们,请使用此选项。

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

--enable-row-security

此选项仅在恢复具有行安全性的表内容时相关。默认情况下,pg_restore 会将 row_security 设置为 off,以确保所有数据都恢复到表中。如果用户没有绕过行安全性的足够权限,则会引发错误。此参数指示 pg_restorerow_security 设置为 on,允许用户尝试在启用行安全性的情况下恢复表内容。如果用户没有将转储中的行插入表的权限,这仍然可能会失败。

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

--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 关键字一起使用。

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

--if-exists

使用 DROP ... IF EXISTS 命令来删除 --clean 模式中的对象。这会抑制可能报告的“不存在”错误。此选项仅在也指定了 --clean 时才有效。

--no-comments

即使归档包含注释,也不输出恢复注释的命令。

--no-data

即使归档包含数据,也不输出恢复数据的命令。

--no-data-for-failed-tables

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

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

--no-policies

即使归档包含行安全策略,也不输出恢复它们的命令。

--no-publications

即使归档包含发布,也不输出恢复它们的命令。

--no-schema

即使归档包含模式(数据定义),也不输出恢复它们的命令。

--no-security-labels

即使归档包含安全标签,也不输出恢复它们的命令。

--no-statistics

即使归档包含统计信息,也不输出恢复它们的命令。

--no-subscriptions

即使归档包含订阅,也不输出恢复它们的命令。

--no-table-access-method

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

--no-tablespaces

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

--restrict-key=restrict_key

将提供的字符串用作转储输出中的 psql \restrict 键。这只能为 SQL 脚本输出指定,即使用 --file 选项时。如果未指定限制键,pg_restore 将根据需要生成一个随机的限制键。键只能包含字母数字字符。

此选项主要用于测试目的和其他需要可重复输出(例如,比较转储文件)的场景。不建议常规使用,因为带有密钥预知能力的恶意服务器可能能够注入任意代码,这些代码将在运行 psql 并使用转储输出的机器上执行。

--section=sectionname

仅恢复命名部分。部分名称可以是 pre-datadatapost-data。可以多次指定此选项以选择多个部分。默认是恢复所有部分。

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

--statistics

输出恢复统计信息的命令,如果归档包含它们。这是默认值。

--statistics-only

仅恢复统计信息,不恢复模式(数据定义)或数据。

--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=主机

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

-p 端口
--port=端口

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

-U 用户名
--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 文档。

默认情况下,pg_restore 将恢复优化器统计信息(如果包含在转储文件中)。如果并非所有统计信息都已恢复,则最好在每个恢复的表上运行 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 仅使用它来发出 CREATE DATABASE 命令以创建 mydb。使用 -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_dump, pg_dumpall, psql

提交更正

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