lt_distributed_restore.py — 从由 lt_distributed_dump.py 创建的归档文件中还原一个 LightDB 数据库。
lt_distributed_restore.py
[connection-option
...] [option
...]
lt_distributed_restore.py 是一个实用工具,用于从一个非普通文本格式的归档文件中还原一个 LightDB 数据库。该归档文件是由 lt_distributed_dump.py 创建的。它将发出必要的命令以将数据库重构为保存时的状态。归档文件还允许 lt_distributed_restore.py 有选择地恢复内容,甚至可以在恢复之前重新排序项目。归档文件旨在在不同体系结构之间进行移植。
显然,lt_distributed_restore.py.pyore 无法恢复归档文件中不存在的信息。例如,如果使用“将数据转储为INSERT
命令”的选项创建了归档,则 lt_distributed_restore.py 将无法使用COPY
语句加载数据。
lt_distributed_restore.py 接受以下命令行参数。
-f dirname
--folder=dirname
指定恢复的转储文件所在的目录。
-a
--data-only
仅还原数据,而不还原模式(数据定义)。如果在归档中存在,则还原表数据、大对象和序列值。
此选项类似于指定 --section=data
。
-c
--clean
在重新创建数据库对象之前清除(删除)这些对象。(除非使用 --if-exists
,否则如果在目标数据库中存在某些对象,则可能会生成一些无害的错误消息。)
-K
--recreate-schema
直接输出删除模式的命令(使用级联模式),然后输出创建模式的命令,比普通模式更快。
(除非也指定了 --if-exists
,否则如果在目标数据库中不存在某些对象,则还原过程可能会生成一些无害的错误消息。)
-d dbname
--dbname=dbname
连接到数据库 dbname
并直接还原到该数据库中。 dbname
不能是 连接字符串。
-e
--exit-on-error
对于由 lt_distributed_restore.py 调用的 lt_restore,如果在向数据库发送 SQL 命令时遇到错误,则退出。默认情况下,会继续执行,并在还原结束时显示错误计数。
-F format
--format=format
指定归档的格式。不必指定格式,因为 lt_restore 会自动确定格式。如果指定了格式,则可以是以下之一:
c
custom
归档以 lt_dump 的自定义格式为基础。
d
directory
归档是目录归档。
t
tar
归档是 tar
归档。
-I index
--index=index
目前不支持。
-j number-of-jobs
--jobs=number-of-jobs
并行运行 lt_restore 的最耗时步骤,包括加载数据、创建索引或创建约束等,最多使用 number-of-jobs
个并发会话。此选项可以大大缩短将大型数据库还原到运行在多处理器机器上的服务器所需的时间。在发出脚本而不是直接连接到数据库服务器时,此选项将被忽略。
每个作业是一个进程或一个线程,取决于操作系统,并使用单独的连接到服务器。
此选项的最佳值取决于服务器、客户端和网络的硬件设置。因素包括 CPU 核心数和磁盘设置。一个好的起点是服务器上的 CPU 核心数,但在许多情况下,比这个值更大的值也可以导致更快的还原时间。当然,值过高会因为抖动而导致性能下降。
此选项仅支持自定义和目录归档格式。输入必须是常规文件或目录(例如,不能是管道或标准输入)。
-l
--list
目前不支持。
-L list-file
--use-list=list-file
目前不支持。
-n schema
--schema=schema
仅还原指定模式中的对象。可以使用多个 -n
开关指定多个模式。可以与 -t
选项结合使用以仅还原特定表。
-N schema
--exclude-schema=schema
不还原指定模式中的对象。可以使用多个 -N
开关指定要排除的多个模式。
当给定了相同的模式名称时,-n
和 -N
,-N
开关胜出,并且该模式将被排除。
-O
--no-owner
不输出命令以设置对象的所有权以匹配原始数据库。默认情况下,lt_restore 发出 ALTER OWNER
或 SET SESSION AUTHORIZATION
语句来设置创建的模式元素的所有权。除非使用超级用户(或拥有脚本中所有对象的同一用户)进行与数据库的初始连接,否则这些语句将失败。使用 -O
,可以使用任何用户名进行初始连接,该用户将拥有所有创建的对象。
-P function-name(argtype [, ...])
--function=function-name(argtype [, ...])
目前不支持。
-s
--schema-only
仅还原模式(数据定义),而不是数据,只要归档中存在模式条目。
此选项是 --data-only
的相反。它类似于指定 --section=pre-data --section=post-data
。
(不要将此选项与 --schema
选项混淆,后者在不同的含义上使用单词 “schema”。)
-S username
--superuser=username
指定禁用触发器时要使用的超级用户用户名。只有在使用 --disable-triggers
时才相关。
-t table
--table=table
仅还原指定表的定义和/或数据。对于此目的,“table” 包括视图、序列和外部表。可以通过编写多个 -t
开关来选择多个表。可以与 -n
选项结合使用,以指定特定模式中的表。
当指定 -t
时,lt_distributed_restore.py 不会尝试还原所选表可能依赖的任何其他数据库对象。因此,不能保证将特定表还原到干净的数据库中将成功。
虽然 lt_distributed_dump.py 的 -t
标志也会转储所选表的附属对象(例如索引),但 lt_distributed_restore.py 的 -t
标志不包括这些附属对象。
-T trigger
--trigger=trigger
目前不支持。
-v
--verbose
指定详细模式。
-V
--version
打印 lt_distributed_restore.py 的版本并退出。
-x
--no-privileges
--no-acl
防止恢复访问权限(授权/撤销命令)。
-1
--single-transaction
目前不支持。
--disable-triggers
此选项仅在执行仅数据还原时才相关。它指示 lt_restore 在恢复数据时临时禁用目标表上的触发器。如果表上存在引用完整性检查或其他触发器,您不希望在数据还原期间调用它们,则使用此选项。
目前,为 --disable-triggers
发出的命令必须作为超级用户执行。因此,您还应使用 -S
指定超级用户名称或更好地作为 LightDB 超级用户运行 lt_distributed_restore.py。
--enable-row-security
此选项仅在还原具有行安全的表的内容时才相关。默认情况下,lt_restore 将设置 row_security 为 off,以确保将所有数据还原到表中。如果用户没有足够的权限绕过行安全,则会抛出错误。此参数指示 lt_restore 将 row_security 设置为 on,从而允许用户尝试启用行安全来还原表的内容。如果用户没有权利将转储中的行插入表中,则此操作仍可能失败。
请注意,此选项当前还要求转储以 INSERT
格式存在,因为 COPY FROM
不支持行安全。
--if-exists
使用条件命令(即添加 IF EXISTS
子句)删除数据库对象。除非还指定了 --clean
,否则此选项无效。
--no-comments
不要输出还原注释的命令,即使归档文件包含它们。
--no-data-for-failed-tables
尚未支持。
--no-publications
不要输出用于还原发布的命令,即使归档文件包含它们。
--no-security-labels
不要输出用于还原安全标签的命令,即使归档文件包含它们。
--no-subscriptions
不要输出用于还原订阅的命令,即使归档文件包含它们。
--no-tablespaces
不要输出用于选择表空间的命令。使用此选项,所有对象都将在还原期间的默认表空间中创建。
--section=sectionname
仅还原指定的部分。部分名称可以是 pre-data
、data
或 post-data
。此选项可以多次指定以选择多个部分。默认情况下,将恢复所有部分。
数据部分包含实际的表数据以及大对象定义。后数据项包括索引、触发器、规则和除已验证的检查约束之外的所有约束定义。预数据项包括所有其他数据定义项。
--strict-names
尚未支持。
--use-set-session-authorization
输出 SQL 标准的 SET SESSION AUTHORIZATION
命令,而不是 ALTER OWNER
命令来确定对象的所有权。这使得转储更符合标准,但是取决于转储中对象的历史,可能无法正确还原。
--table_exists_action
告诉 lt_distributed_restore.py 如果它要创建的表已经存在该怎么办。 table_exists_action 有四个选项:skip、append、truncate 或 replace,可能的取值具有以下效果:
skip
skip
保留表不变并继续处理下一个对象。
append
append
从源加载行并保留现有行不变。
truncate
truncate
删除现有行,然后从源加载行。
replace
replace
删除现有行,然后从源加载行。
当使用 truncate
或 replace
时,请确保受影响的表中的行不是任何参照约束的目标。
当使用 append
或 truncate
时,请确保在执行任何操作之前,来自源的行与现有表兼容。
--parallel-num=number-of-lt_restore
并行执行 lt_restore
。
--help
显示有关 lt_distributed_restore.py 命令行参数的帮助信息,并退出。
lt_distributed_restore.py 还接受以下用于连接参数的命令行参数:
-h host
--host=host
指定运行服务器的机器的主机名。如果值以斜杠开头,则将其用作Unix域套接字的目录。如果设置了 LTHOST
环境变量,则使用其默认值,否则使用 'localhost'。
-p port
--port=port
指定服务器正在侦听连接的 TCP 端口或本地 Unix 域套接字文件扩展名。如果设置了 LTPORT
环境变量,则使用其默认值,否则使用 '5432'。
-U username
--username=username
要连接的用户名。如果设置了 LTUSER
环境变量,则使用其默认值,否则使用当前用户。
-w
--no-password
永远不要提示输入密码。如果服务器需要密码身份验证,而又没有其他方式(例如 .pgpass
文件)提供密码,则连接尝试将失败。此选项在批处理作业和脚本中非常有用,在这些作业和脚本中没有用户可以输入密码。
-W
--password
强制 lt_distributed_restore.py 在连接到数据库之前提示输入密码。
--role=rolename
指定要用于执行还原的角色名。此选项使 lt_restore 在连接到数据库之后发出 SET ROLE
rolename
命令。当经过身份验证的用户(由 -U
指定)缺少 lt_restore 需要的权限时,它非常有用,但可以切换到具有所需权限的角色。某些安装不允许直接以超级用户身份登录,使用此选项可以允许在不违反策略的情况下执行还原。
以下命令行选项控制日志参数。
-l log-directory
--log-directory=log-directory
指定日志目录路径。默认为 '/tmp/ltAdminLogs'。
--log-level-console=log-level-console
指定控制台日志级别。
--log-level-file=log-level-file
指定文件日志级别。
--log-filename=log-filename
指定日志文件名。默认为 'lt_distributed_restore-%Y-%m-%d.log'。
LTHOST
LTOPTIONS
LTPORT
LTUSER
默认连接参数
如果您在运行 lt_distributed_restore.py 时遇到问题,请确保您能够使用例如 ltsql 选择来自数据库的信息。此外,libpq 前端库使用的任何默认连接设置和环境变量都将适用。
如果您的安装中有任何对 template1
数据库的本地添加,请小心使用 '--lt-exclude-lightdb-objects' 选项进行转储。
lt_distributed_restore.py 的限制如下。
当将数据恢复到现有表中,并使用选项 --disable-triggers
时,lt_distributed_restore.py 调用 lt_restore 发出命令,在插入数据之前禁用用户表上的触发器,然后发出命令在插入数据后重新启用它们。如果恢复在中途停止,则系统目录可能处于错误的状态。
lt_distributed_restore.py 无法有选择地恢复大对象;例如,仅针对特定表格。如果存档包含大对象,则将恢复所有大对象,如果它们通过 -t
或其他选项排除,则不恢复任何大对象。
有关 lt_distributed_restore.py 限制的详细信息,请参见 lt_distributed_dump.py 文档。
恢复完成后,最好对每个恢复的表运行 ANALYZE
,以便优化器具有有用的统计信息;有关更多信息,请参见 Section 23.1.3 和 Section 23.1.6。
假设我们已将名为 mydb
的数据库转储到自定义格式的转储文件中:
$
lt_dump -Fc -d mydb -f dumpdir --lt-exclude-lightdb-objects
注意,我们需要使用 '--lt-exclude-lightdb-objects' 进行转储以排除扩展。
将转储还原到名为 newdb
的新分布式数据库中:
$
lt_restore -d newdb -f dumpdir