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 接受以下命令行参数。
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
可以是 连接字符串。如果是这样,连接字符串参数将覆盖任何冲突的命令行选项。
-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=索引
仅恢复指定索引的定义。 可以使用多个 -I
开关指定多个索引。
-j 作业数
--jobs=作业数
使用最多 作业数
个并发会话,并发运行 pg_restore 中最耗时的步骤 — 加载数据、创建索引或创建约束。 此选项可以显著减少将大型数据库恢复到运行在多处理器计算机上的服务器的时间。 当发出脚本而不是直接连接到数据库服务器时,此选项将被忽略。
每个作业都是一个进程或一个线程,具体取决于操作系统,并使用与服务器的单独连接。
此选项的最佳值取决于服务器、客户端和网络的硬件设置。 因素包括 CPU 核心数和磁盘设置。 一个好的起点是服务器上的 CPU 核心数,但在许多情况下,大于该值的值也可以带来更快的恢复时间。 当然,值过高会导致由于颠簸而导致性能下降。
此选项仅支持自定义和目录归档格式。 输入必须是常规文件或目录(例如,不是管道或标准输入)。 此外,不能将多个作业与 --single-transaction
选项一起使用。
-l
--list
列出归档文件的目录。 此操作的输出可以用作 -L
选项的输入。 请注意,如果将诸如 -n
或 -t
之类的过滤开关与 -l
一起使用,它们将限制列出的项。
-L 列表文件
--use-list=列表文件
仅恢复 列表文件
中列出的那些归档元素,并按照它们在文件中出现的顺序恢复它们。 请注意,如果将诸如 -n
或 -t
之类的过滤开关与 -L
一起使用,它们将进一步限制恢复的项。
列表文件
通常是通过编辑先前 -l
操作的输出来创建的。 可以移动或删除行,也可以通过在行首放置分号(;
)来注释掉行。 请参见下面的示例。
-n 模式
--schema=模式
仅恢复指定模式中的对象。 可以使用多个 -n
开关指定多个模式。 这可以与 -t
选项结合使用,以仅恢复特定的表。
-N 模式
--exclude-schema=模式
不恢复指定模式中的对象。 可以使用多个 -N
开关指定要排除的多个模式。
如果为同一模式名称同时给出了 -n
和 -N
,则 -N
开关获胜,并且该模式被排除。
-O
--no-owner
不输出命令来设置对象的所有权以匹配原始数据库。 默认情况下,pg_restore 会发出 ALTER OWNER
或 SET SESSION AUTHORIZATION
语句来设置创建的模式元素的所有权。 除非由超级用户(或拥有脚本中所有对象的同一用户)建立到数据库的初始连接,否则这些语句将失败。 使用 -O
,任何用户名都可以用于初始连接,并且此用户将拥有所有创建的对象。
-P 函数名(参数类型 [, ...])
--function=函数名(参数类型 [, ...])
仅恢复指定的函数。 请小心地拼写函数名称和参数,使其与转储文件的目录中的拼写完全一致。 可以使用多个 -P
开关指定多个函数。
-R
--no-reconnect
此选项已过时,但为了向后兼容仍然接受。
-s
--schema-only
仅恢复模式(数据定义),而不恢复数据,前提是归档文件中存在模式条目。
此选项与 --data-only
相反。 它类似于,但由于历史原因与指定 --section=pre-data --section=post-data
不完全相同。
(请勿将其与 --schema
选项混淆,该选项以不同的含义使用 “模式” 一词。)
-S 用户名
--superuser=用户名
指定禁用触发器时要使用的超级用户用户名。 这仅在使用了 --disable-triggers
时才相关。
-t 表
--table=表
仅恢复指定表的定义和/或数据。 为此,“表” 包括视图、物化视图、序列和外部表。 可以通过编写多个 -t
开关来选择多个表。 此选项可以与 -n
选项结合使用,以指定特定模式中的表。
当指定了 -t
时,pg_restore 不会尝试恢复选定表可能依赖的任何其他数据库对象。 因此,无法保证将特定表恢复到干净的数据库中会成功。
此标志的行为与 pg_dump 的 -t
标志不完全相同。pg_restore 中当前没有任何用于通配符匹配的规定,也不能在其 -t
中包含模式名称。 并且,虽然 pg_dump 的 -t
标志也会转储选定表的辅助对象(例如索引),但是 pg_restore 的 -t
标志不包括此类辅助对象。
在 PostgreSQL 9.6 之前的版本中,此标志仅匹配表,而不匹配任何其他类型的关系。
-T 触发器
--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
使用 DROP ... IF EXISTS
命令在 --clean
模式下删除对象。 这会抑制可能以其他方式报告的 “不存在” 错误。 除非还指定了 --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-data
、data
或 post-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
指定是否在诊断消息中使用颜色。可能的值为 always
、auto
和 never
。
与大多数其他 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 仅使用它来发出 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
如果您在文档中看到任何不正确、与特定功能体验不符或需要进一步澄清的内容,请使用此表单报告文档问题。