pg_restore
pg_restore — 从由 pg_dump 创建的归档文件恢复 PostgreSQL 数据库
大纲
pg_restore [option...] [filename]
描述
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只恢复数据,不恢复模式(数据定义)。
-c--clean在重新创建数据库对象之前清理(删除)它们。
-C--create在恢复之前先创建数据库。(使用此选项时,由
-d指定的数据库仅用于发出初始的CREATE DATABASE命令。所有数据都会恢复到归档中出现的数据库名中。)-ddbname--dbname=dbname连接到数据库
dbname,并直接恢复到该数据库中。-e--exit-on-error在向数据库发送 SQL 命令时如果遇到错误就退出。默认行为是继续执行,并在恢复结束时显示错误计数。
-ffilename--file=filename指定生成脚本的输出文件,或者在与
-l一起使用时指定列表输出文件。默认为标准输出。-Fformat--format=format指定归档的格式。没有必要指定格式,因为pg_restore会自动确定格式。如果指定,它可以是下列之一:
ttar归档是
tar归档。ccustom归档采用 pg_dump 的自定义格式。
-i--ignore-version忽略数据库版本检查。
-Iindex--index=index仅恢复指定名称的索引的定义。
-l--list列出归档的内容。此操作的输出可用作
-L选项的输入。请注意,如果在-l中使用-n或-t等过滤开关,它们会限制被列出的项目。-Llist-file--use-list=list-file仅恢复在
list-file中列出的归档元素,并按它们在文件中出现的顺序进行恢复。请注意,如果在-L中使用-n或-t等过滤开关,它们还会进一步限制被恢复的项目。list-file通常是通过编辑先前-l操作的输出来创建的。可以移动或删除行,也可以通过在行首放置分号(;)将其注释掉。示例见下文。-nnamespace--schema=schema仅恢复指定模式中的对象。这可以与
-t选项结合使用,只恢复特定表。-O--no-owner不输出用于设置对象所有权以匹配原始数据库的命令。默认情况下, pg_restore 会发出
ALTER OWNER或SET SESSION AUTHORIZATION语句,为所创建的模式元素设置所有权。除非对数据库的初始连接由超级用户发起(或者由脚本中所有对象的同一所有者发起),否则这些语句会失败。使用-O时,初始连接可以使用任意用户名,并且该用户将拥有所有创建的对象。-Pfunction-name(argtype [, ...])--function=function-name(argtype [, ...])仅恢复指定函数。请务必按转储文件目录中显示的形式准确拼写函数名和参数。
-R--no-reconnect此选项已过时,但为了向后兼容仍然被接受。
-s--schema-only只恢复模式(数据定义),不恢复数据(表内容)。当前的序列值也不会被恢复。(不要将它与
--schema选项混淆,那里 “schema” 一词的含义不同。)-Susername--superuser=username指定在禁用触发器时要使用的超级用户用户名。仅当使用
--disable-triggers时才相关。-ttable--table=table只恢复指定表的定义和/或数据。
-Ttrigger--trigger=trigger仅恢复指定名称的触发器。
-v--verbose指定详细模式。
-x--no-privileges--no-acl阻止恢复访问权限(grant/revoke 命令)。
--disable-triggers此选项仅在执行仅数据恢复时才相关。它会指示 pg_restore 在恢复数据期间发出命令,临时禁用目标表上的触发器。如果你不希望在恢复数据期间触发表上的引用完整性检查或其他触发器,请使用此选项。
目前,为
--disable-triggers发出的命令必须以超级用户身份执行。因此,你还应通过-S指定超级用户用户名,或者更好的是,直接以 PostgreSQL 超级用户身份运行 pg_restore。--use-set-session-authorization输出符合 SQL 标准的
SET SESSION AUTHORIZATION命令,而不是使用ALTER OWNER命令来确定对象所有权。这样会使转储结果更符合标准,但根据转储中对象的历史,可能无法正确恢复。--no-data-for-failed-tables默认情况下,即使表的创建命令失败(例如因为表已经存在),表数据仍然会被恢复。使用此选项时,这类表的数据会被跳过。如果目标数据库已经包含所需的表内容,这种行为会很有用。例如,PostgreSQL 扩展(如 PostGIS)的辅助表可能已经装载到目标数据库中;指定此选项可以防止向这些表装载重复或过时的数据。
此选项仅在直接恢复到数据库时有效,而在生成 SQL 脚本输出时无效。
pg_restore还接受以下用于连接参数的命令行参数:
-hhost--host=host指定服务器运行所在机器的主机名。如果该值以斜杠开头,则它被用作 Unix 域套接字目录。默认值取自
PGHOST环境变量(如果已设置),否则会尝试使用 Unix 域套接字连接。-pport--port=port指定服务器监听连接所使用的 TCP 端口或本地 Unix 域套接字文件扩展名。默认值取自
PGPORT环境变量(如果已设置),否则使用编译时的默认值。-Uusername连接时使用的用户名。
-W强制提示输入密码。如果服务器要求密码认证,这应该会自动发生。
-1--single-transaction将恢复作为单个事务执行(也就是把发出的命令包裹在
BEGIN/COMMIT中)。这可确保要么所有命令都成功完成,要么不应用任何更改。此选项隐含--exit-on-error。
诊断
当使用 -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 不会为单个表恢复大对象。如果归档中包含大对象,那么所有大对象都会被恢复。
关于 pg_dump 的局限性的细节也可参见pg_dump文档。
恢复完成后,最好对每个恢复的表运行ANALYZE,以便优化器获得有用的统计信息。
示例
假设我们已经把一个名为 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
历史
pg_restore 工具最早出现在 PostgreSQL 7.1 中。