PostgreSQL 中文参考文档
🌐 英文原版 官方 ↗

pg_restore

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

Synopsis

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

描述

pg_restore 是一个用于恢复 PostgreSQL 数据库的工具,其恢复来源是由 pg_dump 以非纯文本格式之一创建的归档。它将发出必要的命令,把数据库重建到它被保存时的状态。归档文件还允许 pg_restore 有选择地进行恢复,甚至在恢复之前对条目重新排序。归档文件被设计为可跨体系结构移植。

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

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

Warning

恢复一个转储会导致目的地执行由源超级用户任意选择的代码。部分转储和部分恢复并不能限制这一点。如果不信任源超级用户,则必须在恢复之前检查被转储的 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 DATABASE 和 CREATE DATABASE 命令。所有数据都会被恢复到归档中出现的那个数据库名中。

-d dbname
--dbname=dbname

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

-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 核数,但在许多情况下,比它更大的值也能带来更快的恢复速度。当然,过高的值会因为颠簸而导致性能下降。

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

-l
--list

列出归档的目录(table of contents)。此操作的输出可以用作 -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 OWNER 或 SET 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 选项混淆,后者以不同的含义使用 “模式” 一词。)

-S username
--superuser=username

指定在禁用触发器时要使用的超级用户名。只有在使用 --disable-triggers 时此选项才相关。

-t table
--table=table

只恢复指定表的定义和/或数据。就此选项而言,“表” 包括视图、物化视图、序列和外部表。可以通过写多个 -t 开关来选择多个表。此选项可以与 -n 选项结合使用,以指定特定模式中的表。

Note

当指定了 -t 时,pg_restore 不会尝试去恢复所选表可能依赖的任何其他数据库对象。因此,不能保证向一个干净的数据库进行特定表的恢复会成功。

Note

此标志的行为与 -t 标志在 pg_dump 中的行为并不完全相同。pg_restore 目前不支持任何通配符匹配,你也不能在其 -t 中包含模式名。而且,虽然 pg_dump 的 -t 标志也会转储所选表的附属对象(例如索引),但 pg_restore 的 -t 标志不包括这类附属对象。

Note

在 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_restore 改为把 row_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 关键字一起使用。

以 # 开头的行被视为注释并被忽略。注释也可以放在对象模式行的后面。空行同样会被忽略。有关如何在模式中执行加引号操作,请参见 Patterns。

--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 选项时指定。如果没有指定 restrict 密钥,pg_restore 将在需要时生成一个随机密钥。密钥只能包含字母和数字。

此选项主要用于测试目的以及需要可重复输出的其他场景(例如比较转储文件)。不建议在一般用途中使用它,因为预先知道该密钥的恶意服务器也许能够注入任意代码,这些代码将在使用该转储输出运行 psql 的机器上被执行。

--section=sectionname

只恢复指定的节。节名可以是 pre-data、data 或 post-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
--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

指定是否在诊断消息中使用颜色。可能的取值有 always、auto 和 never。

与大多数其他 PostgreSQL 工具一样,此工具也会使用 libpq 支持的环境变量(参见 Section 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 可能会很有用,这样优化器就有了可用的统计信息;更多信息请参见 Section 24.1.3 和 Section 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