Postgresql 中文操作指南
Description
pg_restore 是一个用于从 pg_dump 以非纯文本格式创建的存档中还原 PostgreSQL 数据库的实用程序。它将发出必要的命令,以将数据库恢复到其保存时的状态。存档文件还允许 pg_restore 对还原内容进行选择,甚至可以在还原之前重新排列项目。存档文件被设计为可跨体系结构移植。
pg_restore 可以以两种模式运行。如果指定了数据库名称,pg_restore 将连接到该数据库,并将存档内容直接还原到该数据库。否则,将创建一个包含用于重建数据库的 SQL 命令的脚本,并将此脚本写入文件或标准输出。此脚本输出等效于 pg_dump 的纯文本输出格式。因此,用于控制输出的一些选项与 pg_dump 的类似。
显而易见的是,pg_restore 无法还原存档文件中不存在的信息。例如,如果使用“将数据转储为 INSERT 命令”选项创建存档,pg_restore 将无法使用 COPY 语句加载数据。
Options
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 会自动确定格式。如果指定,则可以是以下格式之一:
-
-
-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 选项的输入。请注意,如果使用 -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 的反向选项。它与指定 —​section=pre-data --section=post-data 类似,但在历史原因上并不相同。
-
(不要将此与 —​schema 选项混淆, —​schema 选项的“模式”一词有不同的含义。)
-
-
-S _username—superuser=_username
-
当禁用触发器时,指定要使用的超级用户用户名称。这仅在使用 —​disable-triggers 时才相关。
-
-
-t _table—table=_table
-
仅还原指定表的定义和/或数据。在此目的中,“表”包括视图、物化视图、序列和外部表。可通过编写多个 -t 开关来选择多个表。此选项可以与 -n 选项相结合,以在特定模式中指定的表。
-
-
-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
-
使用 DROP …​ IF EXISTS 命令以 —​clean 模式删除对象。这会抑制可能报告的“不存在”错误。除非同时指定 —​clean ,否则此选项无效。
-
-
—no-comments
-
不要输出命令来恢复注释,即使归档包含这些注释。
-
-
—no-data-for-failed-tables
-
默认情况下,即使表的创建命令失败(例如,因为它已存在),表数据也会被恢复。使用此选项后将跳过此类表的数据。如果目标数据库已包含所需的表内容,则此行为非常有用。例如,PostGIS 等 PostgreSQL 扩展的辅助表可能已加载到目标数据库中;指定此选项可防止将重复或过时数据加载到其中。
-
此选项仅在直接还原到数据库中时有效,而不是在生成 SQL 脚本输出时有效。
-
-
—no-publications
-
不要输出命令来恢复发布,即使归档包含它们。
-
-
—no-security-labels
-
不要输出命令来恢复安全标签,即使归档包含它们。
-
-
—no-subscriptions
-
不要输出命令来恢复订阅,即使归档包含它们。
-
-
—no-table-access-method
-
不要输出命令来选择表访问方法。使用此选项,所有对象都将使用在恢复期间为默认项的任何访问方法创建。
-
-
—no-tablespaces
-
不要输出命令来选择表空间。使用此选项,所有对象都将在恢复期间为默认项的任何表空间中创建。
-
-
—section=_sectionname_
-
仅还原命名的部分。部分名称可以是 pre-data 、 data 或 post-data 。可以多次指定此选项以选择多个部分。默认值是还原所有部分。
-
数据部分包含实际表数据及大对象定义。Post-data 项由索引、触发器、规则和非验证检查约束等定义组成。Pre-data 项由所有其他数据定义项组成。
-
-
—strict-names
-
要求每个架构 ( -n / —​schema ) 和表 ( -t / —​table ) 限定符至少匹配备份文件中的一个架构/表。
-
-
—use-set-session-authorization
-
输出 SQL 标准 SET SESSION AUTHORIZATION 命令,而非 ALTER OWNER 命令,以确定对象所属权。这样能让转储更多兼容于标准,但根据转储中的对象的历史记录,可能无法正确恢复。
-
-
-?_—help_
-
显示有关 pg_restore 命令行参数的帮助,然后退出。
-
-
c__custom
-
该档案采用 pg_dump 的自定义格式。
-
-
d__directory
-
该档案是一个目录档案。
-
-
t__tar
-
该档案是一个 tar 档案。
-
Note
此标志的行为与 pg_dump 的 -t 标志并不完全相同。目前 pg_restore 中未提供通配符匹配的规定,也无法在其 -t 中包含架构名。并且,尽管 pg_dump 的 -t 标志还会转储选定表的子对象(如索引),但 pg_restore 的 -t 标志不包括此类子对象。
Note
在 PostgreSQL 9.6 之前的版本中,此标志仅匹配表,不匹配任何其他类型的关联。
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 所需的权限,但可以切换到拥有所需权限的角色时,此选项很有用。某些安装程序有禁止直接以超级用户的身份登录的策略,而使用此选项允许执行恢复,而不会违反该策略。
-
Environment
-
PGHOST_PGOPTIONS_PGPORT__PGUSER
-
Default connection parameters
-
-
PG_COLOR
-
指定是否在诊断消息中使用颜色。可能的值为 always 、 auto 和 never 。
-
此实用程序与大多数其他 PostgreSQL 实用程序一样,也使用 libpq 所支持的环境变量(请参阅 Section 34.15 )。但是,当未提供数据库名称时,它不读取 PGDATABASE 。
Diagnostics
当使用 -d 选项指定直接数据库连接时,pg_restore 会在内部执行 SQL 语句。如果您在运行 pg_restore 时遇到问题,请确保您能够使用 SQL 从数据库中选择信息,例如使用 psql 。此外,libpq 前端库使用的任何默认连接设置和环境变量都将适用。
Notes
如果你的安装在 template1 数据库中有任何本地内容,请谨慎将 pg_restore 的输出加载到一个真正的空数据库中;否则,由于添加对象有重复定义,你可能会遇到错误。若要生成没有任何本地内容的空数据库,请从 template0 中复制,不要从 template1 中复制,例如:
CREATE DATABASE foo WITH TEMPLATE template0;
pg_restore 的局限性如下。
另请参阅 pg_dump 文档,了解 pg_dump 的局限性详情。
恢复后,最好对每个已恢复的表格运行 ANALYZE ,以便优化器有有用的统计信息;请参阅 Section 25.1.3 和 Section 25.1.6 了解更多信息。
Examples
假设我们已将名为 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
See Also
pg_dump 、 pg_dumpall 、 psql