## 皮克\_恢复 皮克\_restore — 从 pg 创建的归档文件中恢复 PostgreSQL 数据库\_倾倒 ## 概要 `pg_restore` [*`连接选项`*...][*`option`*...] [*`文件名`*] ## 描述 皮克\_restore 是一个实用程序,用于从由[皮克\_倾倒](app-pgdump.html)以非纯文本格式之一。它将发出必要的命令,将数据库重建到保存时的状态。存档文件还允许 pg_restore 以选择性地选择要恢复的内容,甚至在恢复之前重新排序项目。存档文件被设计为可跨体系结构移植。 皮克\_restore 可以在两种模式下运行。如果指定了数据库名称,pg_restore 连接到该数据库并将存档内容直接恢复到数据库中。否则,将创建包含重建数据库所需的 SQL 命令的脚本并将其写入文件或标准输出。这个脚本输出相当于pg的纯文本输出格式\_倾倒。因此,一些控制输出的选项类似于 pg\_转储选项。 显然,pg_restore 无法恢复存档文件中不存在的信息。例如,如果存档是使用“dump data as`插入`命令”选项,pg\_恢复将无法使用加载数据`复制`陈述。 ## 选项 皮克\_restore 接受以下命令行参数。 *`文件名`* 指定要恢复的存档文件(或目录,对于目录格式存档)的位置。如果未指定,则使用标准输入。 `-一种`\ `--仅数据` 仅恢复数据,而不是模式(数据定义)。如果存档中存在表数据、大对象和序列值,则会恢复。 此选项类似于,但由于历史原因不完全相同,指定`--section=数据`. `-c`\ `- 干净的` 在重新创建它们之前清理(删除)数据库对象。(除非`--如果存在`使用时,如果目标数据库中不存在任何对象,这可能会生成一些无害的错误消息。) `-C`\ `- 创造` 在还原到数据库之前创建数据库。如果`- 干净的`也指定,在连接到它之前删除并重新创建目标数据库。 和`- 创造`, pg_restore 还会恢复数据库的注释(如果有)以及特定于该数据库的任何配置变量设置,即任何`更改数据库...设置...`和`改变角色...在数据库中...设置...`提及此数据库的命令。数据库本身的访问权限也会恢复,除非`--no-acl`被指定。 使用此选项时,以`-d`仅用于发出初始`删除数据库`和`创建数据库`命令。所有数据都恢复到存档中出现的数据库名称中。 `-d *`数据库名称`*`\ `--dbname=*`数据库名称`*` 连接到数据库*`数据库名称`*并直接还原到数据库中。这*`数据库名称`*可以是一个[连接字符串](libpq-connect.html#LIBPQ-CONNSTRING).如果是这样,连接字符串参数将覆盖任何冲突的命令行选项。 `-e`\ `--exit-on-error` 如果在向数据库发送 SQL 命令时遇到错误,则退出。默认设置是继续并在恢复结束时显示错误计数。 `-f *`文件名`*`\ `--文件=*`文件名`*` 为生成的脚本指定输出文件,或者在使用时为列表指定输出文件`-l`.采用`-`对于标准输出。 `-F *`格式`*`\ `--格式=*`格式`*` 指定存档的格式。不需要指定格式,因为 pg_restore 将自动确定格式。如果指定,它可以是以下之一: `c`\ `风俗` 存档是 pg 的自定义格式\_倾倒。 `d`\ `目录` 存档是目录存档。 `吨`\ `柏油` 存档是一个`柏油`档案。 `-一世 *`指数`*`\ `--索引=*`指数`*` 仅恢复命名索引的定义。可以使用多个指定多个索引`-一世`开关。 `-j *`工作数量`*`\ `--工作=*`工作数量`*` 运行pg最耗时的步骤\_restore — 加载数据、创建索引或创建约束的那些 — 并发,最多使用*`工作数量`*并发会话。此选项可以显着减少将大型数据库恢复到运行在多处理器机器上的服务器的时间。发出脚本而不是直接连接到数据库服务器时,将忽略此选项。 每个作业是一个进程或一个线程,具体取决于操作系统,并使用与服务器的单独连接。 此选项的最佳值取决于服务器、客户端和网络的硬件设置。因素包括 CPU 内核的数量和磁盘设置。一个好的起点是服务器上的 CPU 内核数量,但在许多情况下,大于该数量的值也会导致更快的恢复时间。当然,过高的值会因为抖动而导致性能下降。 此选项仅支持自定义和目录归档格式。输入必须是常规文件或目录(例如,不是管道或标准输入)。此外,多个作业不能与该选项一起使用`--单笔交易`. `-l`\ `- 列表` 列出档案的目录。该操作的输出可以作为输入`-L`选项。请注意,如果过滤开关如`-n`要么`-t`与`-l`,他们将限制列出的项目。 `-L *`列表文件`*`\ `--使用列表=*`列表文件`*` 只恢复那些在*`列表文件`*,并按照它们在文件中出现的顺序恢复它们。请注意,如果过滤开关如`-n`或者`-t`与`-L`,他们将进一步限制恢复的项目。 *`列表文件`*通常是通过编辑以前的输出来创建的`-l`手术。可以移动或删除行,也可以通过放置分号 (`;`) 在行首。请参阅下面的示例。 `-n *`图式`*`\ `--schema=*`图式`*` 仅恢复命名模式中的对象。可以使用多个指定多个模式`-n`开关。这可以与`-t`仅恢复特定表的选项。 `-N *`图式`*`\ `--排除模式=*`图式`*` 不要恢复命名模式中的对象。可以使用多个指定要排除的多个模式`-N`开关。 当两个`-n`和`-N`为相同的模式名称给出,`-N`switch 获胜并且模式被排除在外。 `-O`\ `--no-owner` 不要输出命令来设置对象的所有权以匹配原始数据库。默认情况下,pg\_恢复问题`改变所有者`或者`设置会话授权`语句来设置创建的模式元素的所有权。除非超级用户(或拥有脚本中所有对象的同一用户)建立与数据库的初始连接,否则这些语句将失败。和`-O`,任何用户名都可以用于初始连接,并且该用户将拥有所有创建的对象。 `-P *`函数名(参数类型[, ...])`*`\ `--函数=*`函数名(参数类型[, ...])`*` 仅恢复命名函数。注意函数名称和参数的拼写与转储文件的目录中出现的完全相同。多个函数可以用多个指定`-P`开关。 `-R`\ `--no-reconnect` 此选项已过时,但仍被接受以实现向后兼容性。 `-s`\ `--schema-only` 仅恢复模式(数据定义),而不是数据,直到模式条目存在于存档中。 此选项与`--仅数据`.它类似于,但由于历史原因不完全相同,指定`--section=pre-data --section=后数据`. (不要将此与`--模式`选项,它以不同的含义使用“模式”这个词。) `-S *`用户名`*`\ `--超级用户=*`用户名`*` 指定禁用触发器时要使用的超级用户用户名。仅当`--禁用触发器`用来。 `-t *`桌子`*`\ `--表=*`桌子`*` 仅恢复命名表的定义和/或数据。为此,“表”包括视图、物化视图、序列和外部表。可以通过写多个来选择多个表`-t`开关。此选项可以与`-n`在特定模式中指定表的选项。 ### 笔记 什么时候`-t`已指定,pg_restore 不会尝试恢复所选表可能依赖的任何其他数据库对象。因此,无法保证将特定表还原到干净的数据库中会成功。 ### 笔记 此标志的行为与`-t`pg的标志\_倾倒。目前在 pg 中没有任何通配符匹配的规定\_恢复,也不能在其内包含模式名称`-t`.而且,虽然 pg\_垃圾场`-t`flag 还将转储所选表的附属对象(例如索引),pg\_恢复的`-t`flag 不包括此类附属对象。 ### 笔记 在 PostgreSQL 9.6 之前的版本中,此标志仅匹配表,而不匹配任何其他类型的关系。 `-T *`扳机`*`\ `--触发器=*`扳机`*` 仅恢复命名触发器。可以使用多个指定多个触发器`-T`开关。 `-v`\ `--详细` 指定详细模式。这将导致 pg\_恢复以将详细的对象注释和开始/停止时间输出到输出文件,并将消息进展到标准错误。重复该选项会导致额外的调试级别消息出现在标准错误上。 `-V`\ `- 版本` 打印 pg\_恢复版本并退出。 `-x`\ `--无特权`\ `--no-acl` 防止恢复访问权限(授予/撤销命令)。 `-1`\ `--单笔交易` 将还原作为单个事务执行(即将发出的命令包装在`开始`/`犯罪`)。这可确保所有命令都成功完成,或者不应用任何更改。这个选项意味着`--exit-on-error`. `--禁用触发器` 此选项仅在执行仅数据还原时相关。它指示 pg_restore 执行命令以在重新加载数据时临时禁用目标表上的触发器。如果您不想在数据重新加载期间调用的表上有参照完整性检查或其他触发器,请使用此选项。 目前,发出的命令`--禁用触发器`必须以超级用户身份完成。因此,您还应该指定一个超级用户名`-S`或者,最好运行 pg\_恢复为 PostgreSQL 超级用户。 `--启用行安全` 此选项仅在恢复具有行安全性的表的内容时才相关。默认情况下,pg\_恢复将设置[排\_安全](runtime-config-client.html#GUC-ROW-SECURITY)关闭,以确保所有数据都恢复到表中。如果用户没有足够的权限绕过行安全,则会引发错误。该参数指示 pg\_恢复设置[排\_安全](runtime-config-client.html#GUC-ROW-SECURITY)改为 on,允许用户尝试在启用行安全性的情况下恢复表的内容。如果用户无权将转储中的行插入表中,这可能仍然会失败。 请注意,此选项当前还要求转储位于`插入`格式,如`复制自`不支持行安全。 `--如果存在` 使用条件命令(例如,添加一个`如果存在`子句)删除数据库对象。此选项无效,除非`- 干净的`也被指定。 `- 暂无评论` 不要输出命令来恢复评论,即使存档包含它们。 `--no-data-for-failed-tables` 默认情况下,即使表的创建命令失败(例如,因为它已经存在),也会恢复表数据。使用此选项,将跳过此类表的数据。如果目标数据库已包含所需的表内容,则此行为很有用。例如,PostgreSQL 扩展(如 PostGIS)的辅助表可能已经加载到目标数据库中;指定此选项可防止将重复或过时的数据加载到其中。 此选项仅在直接还原到数据库时有效,而不是在生成 SQL 脚本输出时有效。 `--无出版物` 不要输出命令来恢复出版物,即使存档包含它们。 `--无安全标签` 不要输出命令来恢复安全标签,即使存档包含它们。 `--无订阅` 不要输出命令来恢复订阅,即使存档包含它们。 `--无表空间` 不要输出命令来选择表空间。使用此选项,所有对象都将在还原期间的默认表空间中创建。 `--节=*`节名`*` 仅恢复命名部分。部分名称可以是`前数据`,`数据`, 或者`发布数据`.可以多次指定此选项以选择多个部分。默认是恢复所有部分。 数据部分包含实际的表数据以及大对象定义。后数据项包括索引、触发器、规则和约束的定义,而不是经过验证的检查约束。前数据项由所有其他数据定义项组成。 `--严格名称` 要求每个模式 (`-n`/`--模式`) 和表 (`-t`/`- 桌子`) 限定符匹配备份文件中的至少一个模式/表。 `--use-set-session-authorization` 输出 SQL 标准`设置会话授权`命令而不是`改变所有者`命令来确定对象的所有权。这使转储更符合标准,但根据转储中对象的历史记录,可能无法正确恢复。 `-?`\ `- 帮助` 显示关于 pg 的帮助\_恢复命令行参数,然后退出。 皮克\_restore 还接受以下命令行参数作为连接参数: `-h *`主持人`*`\ `--主机=*`主持人`*` 指定运行服务器的机器的主机名。如果该值以斜杠开头,则将其用作 Unix 域套接字的目录。默认值取自`PGHOST`环境变量,如果设置,则尝试 Unix 域套接字连接。 `-p *`港口`*`\ `--端口=*`港口`*` 指定服务器正在侦听连接的 TCP 端口或本地 Unix 域套接字文件扩展名。默认为`PGPORT`环境变量(如果设置)或编译的默认值。 `-U *`用户名`*`\ `--用户名=*`用户名`*` 要连接的用户名。 `-w`\ `--无密码` 永远不要发出密码提示。如果服务器需要密码验证,而密码无法通过其他方式获得,例如`.pgpass`文件,连接尝试将失败。此选项在没有用户输入密码的批处理作业和脚本中很有用。 `-W`\ `- 密码` 强制 pg_restore 以在连接到数据库之前提示输入密码。 这个选项从来都不是必需的,因为 pg\_如果服务器要求密码验证,restore 将自动提示输入密码。然而,pg_restore 将浪费一次连接尝试,发现服务器需要密码。在某些情况下,值得输入`-W`以避免额外的连接尝试。 `--角色=*`角色名`*` 指定用于执行还原的角色名称。此选项导致 pg\_恢复发行`设定角色` *`角色名`*连接数据库后的命令。当经过身份验证的用户(由`-U`) 缺少 pg 所需的权限\_恢复,但可以切换到具有所需权限的角色。某些安装具有禁止直接以超级用户身份登录的策略,使用此选项允许在不违反策略的情况下执行恢复。 ## 环境 `PGHOST`\ `选项`\ `PGPORT`\ `PG用户` 默认连接参数 `PG_COLOR` 指定是否在诊断消息中使用颜色。可能的值为`总是`,`汽车`和`绝不`. 与大多数其他 PostgreSQL 实用程序一样,此实用程序也使用 libpq 支持的环境变量(请参阅[第 34.15 节](libpq-envars.html))。然而,它不读`PG数据库`当未提供数据库名称时。 ## 诊断 当使用指定直接数据库连接时`-d`选项,pg_restore 在内部执行 SQL 语句。如果您在运行 pg 时遇到问题\_恢复,确保您能够从数据库中选择信息,例如,[psql](app-psql.html).此外,libpq 前端库使用的任何默认连接设置和环境变量都将适用。 ## 笔记 如果您的安装有任何本地添加到`模板1`数据库,小心加载pg的输出\_恢复到一个真正空的数据库;否则,由于添加的对象的重复定义,您可能会遇到错误。要创建一个没有任何本地添加的空数据库,请从`模板0`不是`模板1`, 例如: ``` CREATE DATABASE foo WITH TEMPLATE template0; ``` pg的局限性\_下面详细介绍恢复。 - 将数据还原到预先存在的表和选项时`--禁用触发器`被使用,pg_restore 在插入数据之前发出命令以禁用用户表上的触发器,然后在插入数据后发出命令以重新启用它们。如果还原在中间停止,系统目录可能会处于错误状态。 - 皮克\_restore 不能选择性地恢复大对象;例如,只有特定表的那些。如果存档包含大对象,则将恢复所有大对象,如果通过以下方式排除它们,则不会恢复它们`-L`,`-t`,或其他选项。 另见[皮克\_倾倒](app-pgdump.html)有关 pg 限制的详细信息的文档\_倾倒。 恢复后,明智的做法是运行`分析`在每个恢复的表上,以便优化器有有用的统计信息;看[第 25.1.3 节](routine-vacuuming.html#VACUUM-FOR-STATISTICS)和[第 25.1.6 节](routine-vacuuming.html#AUTOVACUUM)了解更多信息。 ## 例子 假设我们已经转储了一个名为`数据库`到自定义格式的转储文件中: ``` $ pg_dump -Fc mydb > db.dump ``` 要删除数据库并从转储中重新创建它: ``` $ dropdb mydb $ pg_restore -C -d postgres db.dump ``` 中命名的数据库`-d`switch 可以是集群中存在的任何数据库;皮克\_restore 仅使用它来发出`创建数据库`命令`数据库`.和`-C`, 数据总是恢复到出现在转储文件中的数据库名称中。 将转储重新加载到名为的新数据库中`新数据库`: ``` $ createdb -T template0 newdb $ pg_restore -d newdb db.dump ``` 注意我们不使用`-C`,而是直接连接到要恢复的数据库。另请注意,我们从克隆新数据库`模板0`不是`模板1`,以确保它最初是空的。 要重新排序数据库项目,首先需要转储存档的目录: ``` $ 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 ``` ## 也可以看看 [皮克\_倾倒](app-pgdump.html),[皮克\_饺子](app-pg-dumpall.html),[psql](app-psql.html)