lt_distributed_dump.py — 提取一个分布式LightDB数据库到一个目录中,包括脚本文件或其他存档文件。
lt_distributed_dump.py
[connection-option
...] [option
...]
lt_distributed_dump 是用于备份分布式 LightDB 数据库的实用程序。只有在数据库没有并发使用时,它才能进行一致的备份。使用 lt_distributed_dump 不会阻止其他用户访问数据库(读者或写入者)。
lt_distributed_dump 使用 lt_dump 来转储数据库。
lt_distributed_dump 仅转储单个分布式数据库。
转储可以以脚本或存档文件格式输出。不推荐使用脚本格式,因为对于分布式数据库,在协调器中创建分布式表之后,纯文本文件中的分布式子表名称将与工作节点中的子表名称不同。
脚本转储是包含重建数据库所需的 SQL 命令的纯文本文件,以使其恢复到保存时的状态。要从此脚本中恢复,请将其提供给 ltsql。脚本文件可用于在其他计算机和其他体系结构上重建数据库;通过一些修改,甚至可用于其他 SQL 数据库产品。
另一种备份文件格式必须与 lt_distributed_restore.py 结合使用以重建数据库。它们允许 lt_distributed_restore.py 选择性地恢复内容,甚至在恢复之前重新排序项目。存档文件格式旨在在不同体系结构之间移植。
当与其中一种存档文件格式结合使用,并与 lt_distributed_restore.py 结合使用时,lt_distributed_dump.py 提供了一种灵活的归档和传输机制。可以使用 lt_distributed_dump.py 备份整个数据库,然后使用 lt_distributed_restore.py 来检查存档和/或选择要恢复的数据库部分。最灵活的输出文件格式是“custom”格式(-Fc
)和“directory”格式(-Fd
)。它们允许选择和重新排序所有存档项目,支持并行恢复,并默认进行压缩。只有“directory”格式支持并行转储。
lt_distributed_dump.py 支持转储 pl/sql 包和过程,例如转储表等。
运行 lt_distributed_dump.py 时,应检查输出是否存在任何警告(打印在标准错误上),特别是考虑到下面列出的限制。
下面的命令行选项控制输出的内容和格式。 使用“--folder”指定一个目录来存储转储文件。该目录必须不存在。 不支持“--create”,因为对于分布式数据库,恢复必须有数据库存在。
-a
--data-only
仅转储工作节点的数据和模式
此选项类似于指定 --section=data
。
-b
--blobs
将大型对象包含在转储中。这是默认行为,除非指定了 --schema
、--table
或 --schema-only
。因此,-b
开关只有在请求特定模式或表的转储中添加大型对象时才有用。请注意,BLOB 被视为数据,因此在使用 --data-only
时将包含它们,但在使用 --schema-only
时不会包含它们。
-B
--no-blobs
在转储中排除大型对象。
当同时使用 -b
和 -B
时,行为是在转储数据时输出大型对象,请参阅 -b
文档。
-K
--recreate-schema
在输出创建命令之前直接输出删除模式的命令(使用级联模式),比普通模式更快。
(除非也指定了 --if-exists
,否则如果在目标数据库中不存在任何对象,则恢复可能会生成一些无害的错误消息。)
在发出存档(非文本)输出文件时,将忽略此选项。对于存档格式,可以在调用 lt_distributed_restore.py
时指定选项。
-E encoding
--encoding=encoding
使用指定的字符集编码创建转储。默认情况下,转储是使用数据库编码创建的。(获得相同结果的另一种方法是将 LTCLIENTENCODING
环境变量设置为所需的转储编码。)
-f dirname
--folder=dirname
将输出发送到指定的目录。该目录由 lt_distributed_dump.py
创建,必须在之前不存在。
-F format
--format=format
选择输出的格式。
format
可以是以下之一:
p
plain
输出一个纯文本的 SQL 脚本文件。
c
custom
输出适用于输入到 lt_restore 的自定义格式存档。 与目录输出格式一起,这是最灵活的输出格式,因为它允许在恢复过程中手动选择和重新排序存档项。此格式默认也是压缩的。
d
directory
输出适用于输入到 lt_distributed_restore.py(默认值)的目录格式存档。这将创建一个目录,其中每个被转储的表和 BLOB 都有一个文件,以及一个所谓的目录文件,以机器可读的格式描述被转储的对象,lt_distributed_restore.py 可以读取该目录文件。目录格式存档可以使用标准 Unix 工具进行操作;例如,未压缩的存档中的文件可以使用 gzip 工具进行压缩。此格式默认也是压缩的,还支持并行转储。
t
tar
输出适用于输入到 lt_distributed_restore.py 的 tar
格式存档。
tar 格式与目录格式兼容:提取 tar 格式存档会产生一个有效的目录格式存档。但是,tar 格式不支持压缩。此外,在使用 tar 格式时,无法在恢复过程中更改表数据项的相对顺序。
-j njobs
--jobs=njobs
使用并行方式运行转储,同时转储 njobs
个表。
此选项可能会减少执行转储所需的时间,但也会增加数据库服务器的负载。只能在目录输出格式下使用此选项,因为这是唯一一个多个进程可以同时写入其数据的输出格式。
lt_dump 将打开 njobs
+ 1 个连接到数据库,
因此请确保您的 max_connections 设置足够高,以容纳所有连接。
在运行并行转储时,请求数据库对象的排他锁可能会导致转储失败。
原因是 lt_dump 主进程请求要在工作进程稍后将要转储的对象上共享锁,以确保在转储运行时没有人删除它们并使其消失。
如果另一个客户端然后请求一个表的排他锁,该锁将不会被授予,但将在等待主进程的共享锁被释放时排队。
因此,对表的任何其他访问也不会被授予,并将在排他锁请求之后排队。这包括试图转储表的工作进程。
没有任何预防措施,这将是一个经典的死锁情况。为了检测到此冲突,lt_dump 工作进程使用 NOWAIT
选项请求另一个共享锁。
如果工作进程没有被授予此共享锁,那么在此期间其他人必须已经请求了排他锁,因此无法继续转储,因此 lt_dump 没有选择而只能中止转储。
为了进行一致的备份,数据库服务器需要支持同步快照。
使用此功能,数据库客户端可以确保他们看到相同的数据集,即使他们使用不同的连接。
lt_distributed_dump.py -j
使用多个数据库连接;它用主进程连接到数据库,然后对每个工作任务再连接一次。
如果没有同步快照功能,不同的工作任务不能保证在每个连接中看到相同的数据,这可能导致备份不一致。
-n name
--schema=name
仅转储与 name
匹配的模式;这将选择模式本身以及其包含的所有对象。
当未指定此选项时,将转储目标数据库中的所有非系统模式。
可以通过编写多个 -n
开关来选择多个模式。请参见下面的 Examples。
当指定 -n
时,lt_distributed_dump.py 不会尝试转储所选模式可能依赖的任何其他数据库对象。
因此,不能保证特定模式的转储结果可以成功地单独还原到干净的数据库中。
当指定 -n
时,不会转储诸如 blob 等非模式对象。您可以使用 --blobs
开关将 blob 添加回转储中。
-N name
--exclude-schema=name
不要转储与 name
匹配的任何模式。
该模式的解释方式与 -n
相同。
可以多次给出 -N
来排除匹配多个模式的模式。
当同时给出 -n
和 -N
时,行为是仅转储与至少一个 -n
开关匹配但不匹配任何 -N
开关的模式。
如果 -N
在没有 -n
的情况下出现,则与否则正常转储的模式匹配的模式都将被排除。
-O
--no-owner
不输出命令以使对象的所有权与原始数据库匹配。
默认情况下,lt_distributed_dump.py 发出 ALTER OWNER
或 SET SESSION AUTHORIZATION
语句来设置创建的数据库对象的所有权。
除非由超级用户(或拥有脚本中所有对象的用户)启动脚本,否则这些语句将在运行脚本时失败。
要创建可以由任何用户还原的脚本,但将赋予该用户所有对象的所有权,请指定 -O
。
在发出存档(非文本)输出文件时,此选项将被忽略。
对于存档格式,可以在调用 lt_distributed_restore.py
时指定该选项。
-R
--no-reconnect
此选项已过时,但仍然被接受以保持向后兼容性。
-s
--schema-only
仅在协调器节点中转储对象定义(模式),不包括数据。不会转储工作节点。
该选项是 --data-only
的反向选项。
它类似于指定 --section=pre-data --section=post-data
。
(不要将其与 --schema
选项混淆,该选项使用单词“schema”具有不同的含义。)
-S username
--superuser=username
指定在禁用触发器时使用的超级用户用户名。
这仅在使用 --disable-triggers
时相关。
(通常最好将其省略,而是以超级用户身份启动生成的脚本。)
-t name
--table=name
仅转储名称与 name
匹配的表。可以通过写多个 -t
开关来选择多个表,详情见下面的 Examples。
此选项除了表外,还可用于转储匹配的视图、外部表和序列的定义。它不会转储视图的内容。
当使用 -t
时,-n
和 -N
开关不起作用,因为由 -t
选择的表将被转储,无论这些开关如何,而非表对象不会被转储。
当指定 -t
时,lt_distributed_dump.py 不会尝试转储选定表所依赖的任何其他数据库对象。因此,无法保证特定表的转储结果可以自行成功地还原到干净的数据库中。
写入 -t tab
将转储默认搜索路径中可见的任何一个表。您必须编写类似 -t sch.tab
的内容才能选择特定模式中的表。
-T name
--exclude-table=name
不要转储与 name
匹配的任何表。可以多次使用 -T
来排除匹配多个模式的表。
当同时使用 -t
和 -T
时,行为是仅转储至少匹配一个 -t
开关但不匹配任何 -T
开关的表。如果 -T
在没有 -t
的情况下出现,则将排除与否则正常转储的表匹配的表。
-v
--verbose
指定详细模式。这将导致 lt_dump 将详细的对象注释和开始/结束时间输出到转储文件中,并将进度消息输出到标准错误中。这也将导致 lt_distributed_dump.py 输出调试日志级别。
-V
--version
打印版本信息并退出。
-x
--no-privileges
--no-acl
防止转储访问权限(授予/撤销命令)。
-Z 0..9
--compress=0..9
指定要使用的压缩级别。零表示不压缩。 对于定制和目录存档格式,这指定了单个表数据段的压缩,而默认情况下是以适度的水平压缩。 对于纯文本输出,设置非零压缩级别会导致整个输出文件被压缩,就像它已经通过 gzip 处理一样;但默认情况下不压缩。 tar 存档格式目前根本不支持压缩。
--binary-upgrade
目前不支持
--column-inserts
--attribute-inserts
将数据转储为带有显式列名的 INSERT
命令(INSERT INTO
)。这将使还原非常缓慢;它主要用于制作可以加载到非 LightDB 数据库中的转储。还原过程中发生任何错误将仅导致丢失问题 table
(column
, ...) VALUES ...INSERT
的行,而不是整个表内容。
--disable-dollar-quoting
此选项禁用函数正文的美元引用,并强制使用 SQL 标准字符串语法进行引用。
--disable-triggers
仅在创建仅数据转储时,此选项才相关。它指示 lt_distributed_dump.py 在恢复数据时包括命令以临时禁用目标表上的触发器。如果表上有引用完整性检查或其他触发器,您不想在数据还原期间调用它们,请使用此选项。
目前,对于 --disable-triggers
发出的命令必须由超级用户执行。因此,您还应该使用 -S
指定超级用户名称,或者最好小心地以超级用户身份启动生成的脚本。
在发出存档(非文本)输出文件时,此选项将被忽略。对于存档格式,您可以在调用 lt_restore
时指定此选项。
--enable-row-security
仅在转储具有行安全性的表的内容时才相关。默认情况下,lt_distributed_dump.py 调用的 lt_dump 将 row_security 设置为关闭,以确保从表中转储所有数据。如果用户没有足够的特权来绕过行安全性,则会抛出错误。此参数指示 lt_distributed_dump.py 调用的 lt_dump 将 row_security 设置为打开,允许用户转储他们可以访问的表内容的部分。
请注意,如果您当前使用此选项,则可能还希望将转储格式设置为 INSERT
,因为还原期间的 COPY FROM
不支持行安全性。
--exclude-table-data=pattern
目前不支持。
--extra-float-digits=ndigits
在转储浮点数据时,使用指定值的 extra_float_digits
,而不是最大可用精度。为备份目的制作的常规转储不应使用此选项。
--if-exists
在清理数据库对象时使用条件命令(即添加一个 IF EXISTS
子句)。除非还指定了 --clean
,否则此选项无效。
--include-foreign-data=foreignserver
目前不支持。
--lt-exclude-lightdb-objects
排除 LightDB 在转储中创建的所有内置对象。
对于 LightDB 创建的内置表或模式,当同时给出 -t
或 -n
时,在转储数据时,行为是忽略表或模式,请参见 -t
和 -n
文档。
--lt-dump-lightdb-tables
目前不支持。
--lt-disable-auto-analyze
转储索引时不自动收集统计信息。 (有关详细信息,请参见 CREATE INDEX)。
--inserts
将数据转储为 INSERT
命令(而不是 COPY
)。这将使还原非常缓慢;它主要用于制作可以加载到非 LightDB 数据库中的转储。还原过程中发生任何错误将仅导致丢失问题 INSERT
的行,而不是整个表内容。请注意,如果您重新排列列顺序的话,还原可能会完全失败。 --column-inserts
选项对列顺序更改是安全的,但速度更慢。
--load-via-partition-root
当为表分区转储数据时,使 COPY
或 INSERT
语句的目标是包含它的分区层次结构的根,而不是分区本身。这将导致在加载数据时为每行重新确定适当的分区。当在行不总是落入与原始服务器上相同的分区的服务器上还原数据时,这可能很有用。例如,如果分区列的类型为 text,并且两个系统对用于对分区列进行排序的排序规则的定义不同,则可能会发生这种情况。
最好不要在从使用此选项创建的归档还原时使用并行性,因为 lt_restore 将不知道给定归档数据项将加载数据到哪个分区(或哪些分区)。这可能会导致由于并行作业之间的锁冲突而导致效率低下,或者由于在加载所有相关数据之前设置了外键约束而导致还原失败。
--lock-wait-timeout=timeout
在转储开始时不要永远等待以获取共享表锁。相反,如果在指定的 timeout
内无法锁定表,则失败。超时可以以任何格式指定,这取决于您从中进行转储的服务器版本,但所有版本都接受以整数毫秒数为单位的超时。
--no-comments
不转储注释。
--no-publications
不转储发布。
--no-security-labels
不转储安全标签。
--no-subscriptions
不转储订阅。
--no-sync
默认情况下,lt_distributed_dump.py 调用的 lt_dump
将等待所有文件安全写入磁盘。此选项会导致 lt_distributed_dump.py 调用的 lt_dump
在不等待的情况下返回,这样速度更快,但意味着后续的操作系统崩溃可能会导致转储数据损坏。通常,此选项适用于测试,但在从生产安装转储数据时不应使用。
--no-tablespaces
不输出选择表空间的命令。使用此选项,所有对象都将在还原期间默认的表空间中创建。
在发出存档(非文本)输出文件时,此选项将被忽略。对于存档格式,您可以在调用 lt_distributed_restore.py
时指定此选项。
--no-unlogged-table-data
不转储无记录表的内容。此选项对于是否转储表定义(模式)没有影响;它只会禁止转储表数据。从备用服务器转储时,无记录表中的数据始终被排除。
--on-conflict-do-nothing
将 ON CONFLICT DO NOTHING
添加到 INSERT
命令中。除非也指定了 --inserts
、--column-inserts
或 --rows-per-insert
,否则此选项无效。
--quote-all-identifiers
强制引用所有标识符。当从其主要版本与 lt_distributed_dump.py 调用的 lt_dump 不同的服务器转储数据库,或者输出旨在加载到不同主要版本的服务器时,建议使用此选项。默认情况下,lt_dump 仅引用其自己主要版本中的保留字标识符。这有时会导致与其他版本的服务器处理时可能具有略有不同的保留字集的兼容性问题。使用 --quote-all-identifiers
可以避免这些问题,但会导致生成的转储脚本难以阅读。
--rows-per-insert=nrows
将数据转储为 INSERT
命令(而不是 COPY
)。控制每个 INSERT
命令的最大行数。指定的值必须是大于零的数字。还原期间的任何错误都将导致仅丢失有问题的 INSERT
的一部分行,而不是整个表的内容。
--section=sectionname
仅转储指定的部分。部分名称可以是 pre-data
、data
或 post-data
。可以多次指定此选项以选择多个部分。默认情况下,会转储所有部分。
数据部分包含实际的表数据、大对象内容、序列值和工作节点中的数据定义项。Post-data 项包括索引、触发器、规则和除验证的检查约束之外的约束定义,它们位于协调器节点中。Pre-data 项包括协调器节点中的所有其他数据定义项。
--serializable-deferrable
尚不支持
--snapshot=snapshotname
尚不支持
--strict-names
尚不支持
--use-set-session-authorization
输出 SQL 标准的 SET SESSION AUTHORIZATION
命令,而不是 ALTER OWNER
命令来确定对象的所有权。这使得转储更符合标准,但取决于转储中对象的历史记录,可能无法正确还原。此外,使用 SET SESSION AUTHORIZATION
的转储肯定需要超级用户权限才能正确还原,而 ALTER OWNER
则需要较低的权限。
--parallel-num=number-of-lt_dump
并行执行 lt_dump
。
--help
显示关于 lt_distributed_dump.py 命令行参数的帮助信息,并退出。
下面的命令行选项控制数据库连接参数。
-d dbname
--dbname=dbname
指定要连接和转储的数据库的名称。 dbname
不能是 连接字符串。
如果未指定,则使用环境变量 LTDATABASE
。如果未设置该变量,则使用为连接指定的用户名。
-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_dump.py 在连接到数据库之前提示输入密码。
--role=rolename
指定要用于创建转储的角色名称。此选项会导致 lt_distributed_dump.py 调用的 lt_dump 在连接到数据库后发出 SET ROLE
rolename
命令。当经过身份验证的用户(由 -U
指定)缺少 lt_dump 所需的权限时,但可以切换到具有所需权限的角色时,此选项很有用。一些安装程序禁止直接登录超级用户,使用此选项允许在不违反策略的情况下进行转储。
以下命令行选项控制日志记录参数。
-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_dump-%Y-%m-%d.log'。
LTDATABASE
LTHOST
LTOPTIONS
LTPORT
LTUSER
默认连接参数。
lt_distributed_dump.py 内部调用的 lt_dump 执行
SELECT
语句。如果您运行 lt_dump 时遇到问题,请确保您能够使用例如 ltsql 从数据库中选择信息。此外,libpq 前端
库使用的任何默认连接设置和环境变量也将适用。
lt_dump 的数据库活动通常由统计收集器收集。如果不想这样做,您可以通过 LTOPTIONS
或 ALTER
USER
命令将参数 track_counts
设置为 false。
如果您的数据库群集对 template1
数据库有任何本地添加,
则要小心使用 '--lt-exclude-lightdb-objects' 进行转储。
当选择数据转储并使用选项 --disable-triggers
时,
lt_dump 会发出命令,在插入数据之前禁用用户表上的触发器,
然后在插入数据后重新启用它们的命令。如果还原在中途停止,系统目录可能会处于错误的状态。
由 lt_distributed_dump.py 生成的转储文件不包含优化器用于制定查询计划决策的统计信息。
因此,最好在从转储文件还原后运行 ANALYZE
,以确保最佳性能;
有关更多信息,请参见 Section 23.1.3 和 Section 23.1.6。
由于 lt_distributed_dump.py 用于传输数据到较新版本的 LightDB,
因此可以预期其输出将加载到比 lt_dump 的版本较新的 LightDB 服务器版本中。
lt_distributed_dump.py 还可以从比其自身版本旧的 LightDB 服务器转储。
但是,lt_distributed_dump.py 不能从比其自身主要版本新的 LightDB 服务器转储;
它将拒绝尝试,而不是冒险制作无效的转储。
此外,不能保证 lt_distributed_dump.py 的输出可以加载到较旧主要版本的服务器中 -
即使转储是从该版本的服务器中获取的。将转储文件加载到较旧的服务器中可能需要手动编辑转储文件,
以删除较旧服务器不理解的语法。在跨版本情况下推荐使用选项 --quote-all-identifiers
,
因为它可以防止在不同的 LightDB 版本中出现不同的保留字列表引起的问题。
在转储逻辑复制订阅时,lt_distributed_dump.py 将生成使用 connect = false
选项的 CREATE SUBSCRIPTION
命令,以便还原订阅不会为创建复制槽或初始表复制而进行远程连接。
这样,可以在不需要访问远程服务器的情况下还原转储。然后,由用户自行选择适当的方式重新激活订阅。
如果涉及的主机已更改,则可能必须更改连接信息。在启动新的完整表复制之前,截断目标表可能也是适当的。
将数据库转储为自定义格式存档文件:
$
lt_distributed_dump.py -Fc --folder dumpdir -d mydb --lt-exclude-lightdb-objects
将数据库转储为目录格式存档:
$
lt_distributed_dump.py -Fd --folder dumpdir -d mydb --lt-exclude-lightdb-objects
并行将数据库转储为目录格式存档,使用 5 个工作线程:
$
lt_distributed_dump.py -Fd --folder dumpdir -d mydb -j 5 --lt-exclude-lightdb-objects
将存档文件重新加载到名为 newdb
的(新创建的)数据库中:
$
lt_distributed_restore.py -d newdb --folder dumpdir
将存档文件重新加载到与其来自同一个数据库中,丢弃该数据库的当前内容:
$
lt_distributed_restore.py -d postgres --clean --create --folder dumpdir
转储名为 mytab
的单个表:
$
lt_distributed_dump.py -t mytab -d mydb --folder dumpdir --lt-exclude-lightdb-objects