文档主页
MySQL 8.4 参考手册
相关文档 下载本手册
PDF (US Ltr) - 39.9Mb
PDF (A4) - 40.0Mb
手册页 (TGZ) - 258.5Kb
手册页 (Zip) - 365.5Kb
Info (Gzip) - 4.0Mb
Info (Zip) - 4.0Mb


MySQL 8.4 参考手册  /  ...  /  ndb_restore — 恢复 NDB Cluster 备份

25.5.23 ndb_restore — 恢复 NDB Cluster 备份

NDB Cluster 恢复程序以单独的命令行实用程序 ndb_restore 实现,通常可在 MySQL 的 bin 目录中找到。该程序读取备份创建时生成的备份文件,并将存储的信息插入数据库。

对于 ndb_restore,必须对每个备份文件执行一次,这些文件是通过用于创建备份的 START BACKUP 命令创建的(请参阅 第 25.6.8.2 节,“使用 NDB Cluster 管理客户端创建备份”)。这与创建备份时群集中的数据节点数量相同。

注意

在使用 ndb_restore 之前,建议群集以单用户模式运行,除非您要并行恢复多个数据节点。有关更多信息,请参阅 第 25.6.6 节,“NDB Cluster 单用户模式”

下表显示了可与 ndb_restore 一起使用的选项。其他描述位于表格之后。

  • --allow-pk-changes

    命令行格式 --allow-pk-changes[=0|1]
    类型 整数
    默认值 0
    最小值 0
    最大值 1

    当此选项设置为 1 时,ndb_restore 允许表定义中的主键与备份中同一表的定义不同。当在具有一个或多个表的不同架构版本之间进行备份和恢复时,这可能很有用,并且使用 ndb_restore 执行恢复操作似乎比在恢复表架构和数据后发出许多 ALTER TABLE 语句更简单或更高效。

    --allow-pk-changes 支持以下主键定义更改

    • 扩展主键:备份中表架构中存在的一个不可为空的列将成为表主键的一部分。

      重要

      扩展表的主键时,任何成为主键一部分的列在执行备份时都不得更新;ndb_restore 发现的任何此类更新都会导致恢复操作失败,即使没有发生任何值更改。在某些情况下,可以使用 --ignore-extended-pk-updates 选项来覆盖此行为;有关更多信息,请参阅此选项的描述。

    • 缩短主键 (1):备份架构中已经作为表主键一部分的列不再是主键的一部分,但仍保留在表中。

    • 缩短主键 (2):备份架构中已经作为表主键一部分的列已完全从表中删除。

    这些差异可以与 ndb_restore 支持的其他架构差异相结合,包括需要使用暂存表进行 blob 和文本列更改。

    以下是使用主键架构更改的典型方案中的基本步骤

    1. 使用 ndb_restore --restore-meta 恢复表架构

    2. 更改架构以满足需要,或创建架构

    3. 备份所需的架构

    4. 使用上一步中创建的备份运行 ndb_restore --disable-indexes,以删除索引和约束

    5. 运行 ndb_restore --allow-pk-changes(可能与 --ignore-extended-pk-updates--disable-indexes 以及其他可能需要的选项一起使用)以恢复所有数据

    6. 运行 ndb_restore --rebuild-indexes,使用具有所需架构的备份来重建索引和约束

    扩展主键时,ndb_restore 可能需要在恢复操作期间使用一个临时的辅助唯一索引,以从旧的主键映射到新的主键。仅当需要将备份日志中的事件应用于具有扩展主键的表时,才会创建此类索引。此索引名为 NDB$RESTORE_PK_MAPPING,并创建在每个需要它的表上;如果需要,它可以由并行运行的多个 ndb_restore 实例共享。(在恢复过程结束时运行 ndb_restore --rebuild-indexes 会导致删除此索引。)

  • --append

    命令行格式 --append

    当与 --tab--print-data 选项一起使用时,这会导致数据追加到任何具有相同名称的现有文件。

  • --backup-path=dir_name

    命令行格式 --backup-path=path
    类型 目录名称
    默认值 ./

    需要备份目录的路径;这使用 --backup-path 选项提供给 ndb_restore,并且必须包括与要恢复的备份的 ID 备份相对应的子目录。例如,如果数据节点的 DataDir/var/lib/mysql-cluster,则备份目录为 /var/lib/mysql-cluster/BACKUP,并且 ID 为 3 的备份的备份文件可以在 /var/lib/mysql-cluster/BACKUP/BACKUP-3 中找到。路径可以是相对于 ndb_restore 可执行文件所在的目录的绝对路径或相对路径,并且可以选择用 backup-path= 作为前缀。

    可以将备份恢复到与创建备份时不同的配置的数据库。例如,假设在具有两个存储节点的群集(节点 ID 为 23)中创建的备份 ID 为 12 的备份要恢复到具有四个节点的群集。然后,必须运行 ndb_restore 两次——一次用于创建备份的群集中的每个存储节点。但是,ndb_restore 并不总是能够将从运行一个版本的 MySQL 的群集创建的备份恢复到运行不同 MySQL 版本的群集。有关更多信息,请参阅 第 25.3.7 节,“升级和降级 NDB Cluster”

    重要

    无法使用旧版本的 ndb_restore 恢复从更新版本的 NDB Cluster 创建的备份。您可以将从更新版本的 MySQL 创建的备份恢复到旧的群集,但必须使用来自更新的 NDB Cluster 版本的 ndb_restore 副本才能执行此操作。

    例如,要将从运行 NDB Cluster 8.4.0 的群集创建的群集备份恢复到运行 NDB Cluster 8.0.38 的群集,您必须使用随 NDB Cluster 8.0.38 发行版提供的 ndb_restore

    为了更快的恢复,可以并行恢复数据,前提是存在足够的群集连接。也就是说,当并行恢复到多个节点时,您必须在群集的 config.ini 文件中为每个并发的 ndb_restore 进程提供一个 [api][mysqld] 部分。但是,数据文件必须始终在日志之前应用。

  • --backup-password=password

    命令行格式 --backup-password=password
    类型 字符串
    默认值 [无]

    此选项指定使用 --decrypt 选项解密加密备份时要使用的密码。这必须与用于加密备份的密码相同。

    密码必须是 1 到 256 个字符,并且必须用单引号或双引号括起来。它可以包含任何字符代码为 32、35、38、40-91、93、95 和 97-126 的 ASCII 字符;换句话说,它可以使用除 !'"$%\^ 之外的任何可打印的 ASCII 字符。

    可以省略密码,在这种情况下,ndb_restore 将等待从 stdin 中获取密码,就像使用 --backup-password-from-stdin 时一样。

  • --backup-password-from-stdin[=TRUE|FALSE]

    命令行格式 --backup-password-from-stdin

    当用作 --backup-password 的替代时,此选项允许从系统 shell (stdin) 输入备份密码,类似于在使用 mysql 时,在命令行上不提供密码的情况下,以交互方式提供密码时的方式。

  • --backupid=#, -b

    命令行格式 --backupid=#
    类型 数字
    默认值

    此选项是必需的;它用于指定备份的 ID 或序列号,与管理客户端在备份完成后显示的 Backup backup_id completed 消息中显示的数字相同。(参见 第 25.6.8.2 节,“使用 NDB Cluster 管理客户端创建备份”。)

    重要

    在恢复集群备份时,必须确保从具有相同备份 ID 的备份中恢复所有数据节点。使用来自不同备份的文件会导致集群恢复到不一致的状态,甚至可能完全失败。

  • --character-sets-dir

    命令行格式 --character-sets-dir=path

    包含字符集的目录。

  • --connect, -c

    命令行格式 --connect=connection_string
    类型 字符串
    默认值 localhost:1186

    --ndb-connectstring 的别名。

  • --connect-retries

    命令行格式 --connect-retries=#
    类型 整数
    默认值 12
    最小值 0
    最大值 12

    在放弃之前重试连接的次数。

  • --connect-retry-delay

    命令行格式 --connect-retry-delay=#
    类型 整数
    默认值 5
    最小值 0
    最大值 5

    两次尝试联系管理服务器之间的等待时间(秒)。

  • --connect-string

    命令行格式 --connect-string=connection_string
    类型 字符串
    默认值 [无]

    --ndb-connectstring 相同。

  • --core-file

    命令行格式 --core-file

    在错误时写入核心文件;用于调试。

  • --decrypt

    命令行格式 --decrypt

    使用 --backup-password 选项提供的密码解密加密的备份。

  • --defaults-extra-file

    命令行格式 --defaults-extra-file=path
    类型 字符串
    默认值 [无]

    在读取全局文件后读取给定文件。

  • --defaults-file

    命令行格式 --defaults-file=path
    类型 字符串
    默认值 [无]

    仅从给定文件中读取默认选项。

  • --defaults-group-suffix

    命令行格式 --defaults-group-suffix=string
    类型 字符串
    默认值 [无]

    还读取具有 concat(group, suffix) 的组。

  • --disable-indexes

    命令行格式 --disable-indexes

    在从本机 NDB 备份中恢复数据时禁用索引的恢复。之后,您可以使用 --rebuild-indexes 为所有表同时恢复索引,并使用多线程构建索引,这应该比为非常大的表同时重建索引更快。

    此选项还会删除备份中指定的任何外键。

    MySQL 可以打开一个 NDB 表,该表找不到一个或多个索引,前提是查询不使用任何受影响的索引;否则,查询将被 ER_NOT_KEYFILE 拒绝。在后一种情况下,您可以通过执行以下 ALTER TABLE 语句来暂时解决此问题

    ALTER TABLE tbl ALTER INDEX idx INVISIBLE;

    这会导致 MySQL 忽略表 tbl 上的索引 idx。有关更多信息,请参见 主键和索引,以及 第 10.3.12 节,“不可见索引”

  • --dont-ignore-systab-0, -f

    命令行格式 --dont-ignore-systab-0

    通常,在恢复表数据和元数据时,ndb_restore 会忽略备份中存在的 NDB 系统表的副本。 --dont-ignore-systab-0 会导致系统表被恢复。 此选项仅供实验和开发使用,不建议在生产环境中使用

  • --exclude-databases=db-list

    命令行格式 --exclude-databases=list
    类型 字符串
    默认值

    一个或多个不应恢复的数据库的逗号分隔列表。

    此选项通常与 --exclude-tables 结合使用;有关更多信息和示例,请参见该选项的描述。

  • --exclude-intermediate-sql-tables[=TRUE|FALSE]

    命令行格式 --exclude-intermediate-sql-tables[=TRUE|FALSE]
    类型 布尔值
    默认值 TRUE

    在执行复制 ALTER TABLE 操作时,mysqld 会创建中间表(其名称以 #sql- 为前缀)。当 TRUE 时,--exclude-intermediate-sql-tables 选项会阻止 ndb_restore 恢复这些操作可能遗留的此类表。此选项默认值为 TRUE

  • --exclude-missing-columns

    命令行格式 --exclude-missing-columns

    可以使用此选项仅恢复选定的表列,这会导致 ndb_restore 忽略与备份中找到的那些表版本相比,正在恢复的表中缺少的任何列。此选项适用于所有正在恢复的表。如果您希望仅将此选项应用于选定的表或数据库,可以将它与本节中其他地方描述的一个或多个 --include-*--exclude-* 选项结合使用,然后使用这些选项的补充集合将数据恢复到剩余的表中。

  • --exclude-missing-tables

    命令行格式 --exclude-missing-tables

    可以使用此选项仅恢复选定的表,这会导致 ndb_restore 忽略备份中在目标数据库中找不到的任何表。

  • --exclude-tables=table-list

    命令行格式 --exclude-tables=list
    类型 字符串
    默认值

    要排除的一个或多个表的列表;每个表引用必须包含数据库名称。通常与 --exclude-databases 一起使用。

    当使用 --exclude-databases--exclude-tables 时,只有选项指定的那些数据库或表被排除;ndb_restore 会恢复所有其他数据库和表。

    此表显示了使用 --exclude-* 选项调用 ndb_restore 的几种方法(为了清晰起见,可能需要省略的其他选项已省略),以及这些选项对从 NDB Cluster 备份中恢复的影响

    表 25.23 使用 --exclude-* 选项调用 ndb_restore 的几种方法,以及这些选项对从 NDB Cluster 备份中恢复的影响。

    选项 结果
    --exclude-databases=db1 恢复除 db1 之外的所有数据库中的所有表;不恢复 db1 中的任何表
    --exclude-databases=db1,db2 (或 --exclude-databases=db1 --exclude-databases=db2 恢复除 db1db2 之外的所有数据库中的所有表;不恢复 db1db2 中的任何表
    --exclude-tables=db1.t1 恢复数据库 db1 中除 t1 之外的所有表;恢复 db1 中的所有其他表;恢复所有其他数据库中的所有表
    --exclude-tables=db1.t2,db2.t1 (或 --exclude-tables=db1.t2 --exclude-tables=db2.t1) 恢复数据库 db1 中除表 t2 之外的所有表,以及数据库 db2 中除表 t1 之外的所有表;不恢复 db1db2 中的任何其他表;恢复所有其他数据库中的所有表

    您可以将这两个选项一起使用。例如,以下操作将恢复所有数据库中的所有表,除了数据库 db1db2,以及数据库 db3 中的表 t1t2

    $> ndb_restore [...] --exclude-databases=db1,db2 --exclude-tables=db3.t1,db3.t2

    (为了清晰简洁起见,我们从刚刚显示的示例中省略了可能需要的其他选项。)

    您可以将 --include-*--exclude-* 选项一起使用,但要遵循以下规则

    • 所有 --include-*--exclude-* 选项的操作都是累积的。

    • 所有 --include-*--exclude-* 选项按传递给 ndb_restore 的顺序从右到左进行评估。

    • 如果出现冲突选项,则第一个(最右边的)选项优先。换句话说,从右到左第一个与给定数据库或表匹配的选项 获胜

    例如,以下选项集会导致 ndb_restore 还原数据库 db1 中的所有表,除了 db1.t1,而不会还原其他任何数据库中的任何其他表。

    --include-databases=db1 --exclude-tables=db1.t1

    但是,反转给定选项的顺序只是导致数据库 db1 中的所有表被还原(包括 db1.t1,但没有其他任何数据库中的任何表),因为 --include-databases 选项最靠右,是与数据库 db1 匹配的第一个选项,因此优先于任何其他与 db1db1 中的任何表匹配的选项。

    --exclude-tables=db1.t1 --include-databases=db1
  • --fields-enclosed-by=char

    命令行格式 --fields-enclosed-by=char
    类型 字符串
    默认值

    每个列值都包含在这个选项传递的字符串中(无论数据类型如何;请参阅 --fields-optionally-enclosed-by 的说明)。

  • --fields-optionally-enclosed-by

    命令行格式 --fields-optionally-enclosed-by
    类型 字符串
    默认值

    将这个选项传递的字符串用于包含字符数据的列值(如 CHARVARCHARBINARYTEXTENUM)。

  • --fields-terminated-by=char

    命令行格式 --fields-terminated-by=char
    类型 字符串
    默认值 \t (tab)

    将这个选项传递的字符串用于分隔列值。默认值为制表符 (\t)。

  • --help

    命令行格式 --help

    显示帮助文本并退出。

  • --hex

    命令行格式 --hex

    如果使用此选项,所有二进制值都将以十六进制格式输出。

  • --ignore-extended-pk-updates

    命令行格式 --ignore-extended-pk-updates[=0|1]
    类型 整数
    默认值 0
    最小值 0
    最大值 1

    当使用 --allow-pk-changes 时,成为表主键一部分的列在备份过程中不能被更新;这些列应保留从值插入到它们的时间到包含这些值的行的删除的时间范围内的相同值。如果 ndb_restore 在还原备份时遇到对这些列的更新,则还原将失败。由于某些应用程序可能会在更新行时设置所有列的值,即使某些列值没有更改,备份中可能包含看起来更新了实际上未修改的列的日志事件。在这种情况下,您可以将 --ignore-extended-pk-updates 设置为 1,强制 ndb_restore 忽略这些更新。

    重要

    在导致这些更新被忽略时,用户有责任确保对成为主键一部分的任何列的值没有更新。

    有关更多信息,请参阅 --allow-pk-changes 的说明。

  • --include-databases=db-list

    命令行格式 --include-databases=list
    类型 字符串
    默认值

    要还原的一个或多个数据库的逗号分隔列表。通常与 --include-tables 一起使用;有关更多信息和示例,请参阅该选项的说明。

  • --include-stored-grants

    命令行格式 --include-stored-grants

    ndb_restore 默认情况下不会将共享用户和授权(请参阅 Section 25.6.13, “Privilege Synchronization and NDB_STORED_USER”)还原到 ndb_sql_metadata 表。指定此选项会导致它这样做。

  • --include-tables=table-list

    命令行格式 --include-tables=list
    类型 字符串
    默认值

    要还原的表的逗号分隔列表;每个表引用都必须包含数据库名称。

    当使用 --include-databases--include-tables 时,只还原由选项命名的那些数据库或表;所有其他数据库和表都将被 ndb_restore 排除,并且不会被还原。

    下表显示了使用 --include-* 选项调用 ndb_restore 的几种方法(为了清晰起见,省略了可能需要的其他选项),以及这些方法对从 NDB Cluster 备份中还原的影响。

    Table 25.24 Several invocations of ndb_restore using --include-* options, and their effects on restoring from an NDB Cluster backup.

    选项 结果
    --include-databases=db1 只还原数据库 db1 中的表;所有其他数据库中的所有表都被忽略。
    --include-databases=db1,db2 (or --include-databases=db1 --include-databases=db2) 只还原数据库 db1db2 中的表;所有其他数据库中的所有表都被忽略。
    --include-tables=db1.t1 只还原数据库 db1 中的表 t1;不会还原 db1 或任何其他数据库中的任何其他表。
    --include-tables=db1.t2,db2.t1 (or --include-tables=db1.t2 --include-tables=db2.t1) 只还原数据库 db1 中的表 t2 和数据库 db2 中的表 t1;不会还原 db1db2 或任何其他数据库中的任何其他表。

    您也可以将这两个选项一起使用。例如,以下操作会导致数据库 db1db2 中的所有表以及数据库 db3 中的表 t1t2 被还原(以及没有其他数据库或表)。

    $> ndb_restore [...] --include-databases=db1,db2 --include-tables=db3.t1,db3.t2

    (同样,我们省略了上面示例中可能需要的其他选项。)

    也可以在没有 --include-*(或 --exclude-*)选项的情况下,使用此处显示的语法来还原选定的数据库或单个数据库中的选定表。

    ndb_restore other_options db_name,[db_name[,...] | tbl_name[,tbl_name][,...]]

    换句话说,您可以指定以下两者之一以进行还原。

    • 一个或多个数据库中的所有表

    • 单个数据库中的一个或多个表

  • --lines-terminated-by=char

    命令行格式 --lines-terminated-by=char
    类型 字符串
    默认值 \n (linebreak)

    指定用于结束每行输出的字符串。默认值为换行符 (\n)。

  • --login-path

    命令行格式 --login-path=path
    类型 字符串
    默认值 [无]

    从登录文件读取给定的路径。

  • --no-login-paths

    命令行格式 --no-login-paths

    跳过从登录路径文件读取选项。

  • --lossy-conversions, -L

    命令行格式 --lossy-conversions

    此选项旨在补充 --promote-attributes 选项。使用 --lossy-conversions 允许在从备份中还原数据时对列值进行有损转换(类型降级或符号更改)。除了某些例外情况外,降级规则与 MySQL 复制的规则相同;请参阅 Section 19.5.1.9.2, “Replication of Columns Having Different Data Types”,了解目前由属性降级支持的特定类型转换的信息。

    此选项还允许将 NULL 列还原为 NOT NULL。该列不能包含任何 NULL 条目;否则,ndb_restore 将停止并出现错误。

    ndb_restore 每个属性和列报告一次它在有损转换期间执行的任何数据截断。

  • --no-binlog

    命令行格式 --no-binlog

    此选项阻止任何连接的 SQL 节点将 ndb_restore 还原的数据写入它们的二进制日志。

  • --no-restore-disk-objects, -d

    命令行格式 --no-restore-disk-objects

    此选项阻止 ndb_restore 还原任何 NDB Cluster 磁盘数据对象,例如表空间和日志文件组;请参阅 Section 25.6.11, “NDB Cluster Disk Data Tables”,了解有关这些对象的更多信息。

  • --no-upgrade, -u

    命令行格式 --no-upgrade

    当使用 ndb_restore 还原备份时,使用旧的固定格式创建的 VARCHAR 列将被调整大小并使用现在使用的可变宽度格式重新创建。可以通过指定 --no-upgrade 来覆盖此行为。

  • --ndb-connectstring

    命令行格式 --ndb-connectstring=connection_string
    类型 字符串
    默认值 [无]

    设置用于连接到ndb_mgmd的连接字符串。语法:[nodeid=id;][host=]hostname[:port]。覆盖 NDB_CONNECTSTRINGmy.cnf 中的条目。

  • --ndb-mgm-tls

    命令行格式 --ndb-mgm-tls=level
    类型 枚举
    默认值 relaxed
    有效值

    relaxed

    strict

    设置连接到管理服务器所需的 TLS 支持级别;一个 relaxedstrictrelaxed(默认值)表示尝试建立 TLS 连接,但不强制成功;strict 表示连接时需要 TLS。

  • --ndb-mgmd-host

    命令行格式 --ndb-mgmd-host=connection_string
    类型 字符串
    默认值 [无]

    --ndb-connectstring 相同。

  • --ndb-nodegroup-map=map, -z

    命令行格式 --ndb-nodegroup-map=map

    此选项设置的任何值都会被忽略,该选项本身没有任何作用。

  • --ndb-nodeid

    命令行格式 --ndb-nodeid=#
    类型 整数
    默认值 [无]

    设置此节点的节点 ID,覆盖 --ndb-connectstring 设置的任何 ID。

  • --ndb-optimized-node-selection

    命令行格式 --ndb-optimized-node-selection

    启用针对事务节点选择的优化。默认情况下启用;使用 --skip-ndb-optimized-node-selection 禁用。

  • --ndb-tls-search-path

    命令行格式 --ndb-tls-search-path=list
    类型 路径名
    默认值(Unix) $HOME/ndb-tls
    默认值(Windows) $HOMEDIR/ndb-tls

    指定一个用于搜索 CA 文件的目录列表。在 Unix 平台上,目录名用冒号 (:) 分隔;在 Windows 系统上,分号字符 (;) 用作分隔符。目录引用可以是相对的也可以是绝对的;它可以包含一个或多个环境变量,每个环境变量都用一个前缀美元符号 ($) 表示,并在使用前进行扩展。

    搜索从最左侧命名的目录开始,并从左到右进行,直到找到文件。空字符串表示空搜索路径,这将导致所有搜索失败。由单个点 (.) 组成的字符串表示搜索路径仅限于当前工作目录。

    如果没有提供搜索路径,则使用编译时默认值。此值取决于所使用的平台:在 Windows 上,它是 \ndb-tls;在其他平台(包括 Linux)上,它是 $HOME/ndb-tls。这可以通过使用 -DWITH_NDB_TLS_SEARCH_PATH 编译 NDB Cluster 来覆盖。

  • --no-defaults

    命令行格式 --no-defaults

    不要从除登录文件以外的任何选项文件读取默认选项。

  • --nodeid=#, -n

    命令行格式 --nodeid=#
    类型 数字
    默认值

    指定备份所在的节点 ID;必需。

    当恢复到与备份所在的集群具有不同数量的数据节点的集群时,此信息有助于识别要恢复到给定节点的正确文件集或文件集。(在这种情况下,通常需要将多个文件恢复到单个数据节点。)有关更多信息和示例,请参阅 恢复到不同数量的数据节点

  • --num-slices=#

    命令行格式 --num-slices=#
    类型 整数
    默认值 1
    最小值 1
    最大值 1024

    通过切片恢复备份时,此选项设置将备份划分的切片数。这允许 ndb_restore 的多个实例并行恢复不相交的子集,这可能会减少执行恢复操作所需的时间。

    一个 切片 是给定备份中数据的子集;也就是说,它是一组具有相同切片 ID 的片段,使用 --slice-id 选项指定。这两个选项必须始终一起使用,并且 --slice-id 设置的值必须始终小于切片数。

    ndb_restore 遇到片段并将每个片段分配一个片段计数器。通过切片恢复时,会为每个片段分配一个切片 ID;此切片 ID 在 0 到 1 小于切片数的范围内。对于不是 BLOB 表的表,给定片段所属的切片使用此处显示的公式确定

    [slice_ID] = [fragment_counter] % [number_of_slices]

    对于 BLOB 表,不使用片段计数器;而是使用片段编号以及 BLOB 表的主表的 ID(请记住 NDB 在内部将 BLOB 值存储在单独的表中)。在这种情况下,给定片段的切片 ID 按如下所示计算

    [slice_ID] =
    ([main_table_ID] + [fragment_ID]) % [number_of_slices]

    因此,通过 N 个切片进行恢复意味着运行 Nndb_restore 实例,所有实例都使用 --num-slices=N(以及任何其他必要的选项),并且每个实例都使用 --slice-id=1--slice-id=2--slice-id=3,依此类推,直到 slice-id=N-1

    示例。 假设您要将名为 BACKUP-1 的备份恢复到具有四个数据节点(节点 ID 为 1、2、3 和 4)的集群中,该备份位于每个数据节点的节点文件系统上的默认目录 /var/lib/mysql-cluster/BACKUP/BACKUP-3 中。要使用五个切片执行此操作,请执行以下列表中显示的命令集

    1. 使用 ndb_restore 恢复集群元数据,如下所示

      $> ndb_restore -b 1 -n 1 -m --disable-indexes --backup-path=/home/ndbuser/backups
    2. 将集群数据恢复到数据节点,调用 ndb_restore,如下所示

      $> ndb_restore -b 1 -n 1 -r --num-slices=5 --slice-id=0 --backup-path=/var/lib/mysql-cluster/BACKUP/BACKUP-1
      $> ndb_restore -b 1 -n 1 -r --num-slices=5 --slice-id=1 --backup-path=/var/lib/mysql-cluster/BACKUP/BACKUP-1
      $> ndb_restore -b 1 -n 1 -r --num-slices=5 --slice-id=2 --backup-path=/var/lib/mysql-cluster/BACKUP/BACKUP-1
      $> ndb_restore -b 1 -n 1 -r --num-slices=5 --slice-id=3 --backup-path=/var/lib/mysql-cluster/BACKUP/BACKUP-1
      $> ndb_restore -b 1 -n 1 -r --num-slices=5 --slice-id=4 --backup-path=/var/lib/mysql-cluster/BACKUP/BACKUP-1
      
      $> ndb_restore -b 1 -n 2 -r --num-slices=5 --slice-id=0 --backup-path=/var/lib/mysql-cluster/BACKUP/BACKUP-1
      $> ndb_restore -b 1 -n 2 -r --num-slices=5 --slice-id=1 --backup-path=/var/lib/mysql-cluster/BACKUP/BACKUP-1
      $> ndb_restore -b 1 -n 2 -r --num-slices=5 --slice-id=2 --backup-path=/var/lib/mysql-cluster/BACKUP/BACKUP-1
      $> ndb_restore -b 1 -n 2 -r --num-slices=5 --slice-id=3 --backup-path=/var/lib/mysql-cluster/BACKUP/BACKUP-1
      $> ndb_restore -b 1 -n 2 -r --num-slices=5 --slice-id=4 --backup-path=/var/lib/mysql-cluster/BACKUP/BACKUP-1
      
      $> ndb_restore -b 1 -n 3 -r --num-slices=5 --slice-id=0 --backup-path=/var/lib/mysql-cluster/BACKUP/BACKUP-1
      $> ndb_restore -b 1 -n 3 -r --num-slices=5 --slice-id=1 --backup-path=/var/lib/mysql-cluster/BACKUP/BACKUP-1
      $> ndb_restore -b 1 -n 3 -r --num-slices=5 --slice-id=2 --backup-path=/var/lib/mysql-cluster/BACKUP/BACKUP-1
      $> ndb_restore -b 1 -n 3 -r --num-slices=5 --slice-id=3 --backup-path=/var/lib/mysql-cluster/BACKUP/BACKUP-1
      $> ndb_restore -b 1 -n 3 -r --num-slices=5 --slice-id=4 --backup-path=/var/lib/mysql-cluster/BACKUP/BACKUP-1
      
      $> ndb_restore -b 1 -n 4 -r --num-slices=5 --slice-id=0 --backup-path=/var/lib/mysql-cluster/BACKUP/BACKUP-1
      $> ndb_restore -b 1 -n 4 -r --num-slices=5 --slice-id=1 --backup-path=/var/lib/mysql-cluster/BACKUP/BACKUP-1
      $> ndb_restore -b 1 -n 4 -r --num-slices=5 --slice-id=2 --backup-path=/var/lib/mysql-cluster/BACKUP/BACKUP-1
      $> ndb_restore -b 1 -n 4 -r --num-slices=5 --slice-id=3 --backup-path=/var/lib/mysql-cluster/BACKUP/BACKUP-1
      $> ndb_restore -b 1 -n 4 -r --num-slices=5 --slice-id=4 --backup-path=/var/lib/mysql-cluster/BACKUP/BACKUP-1

      只要有足够的连接到集群的插槽,就可以并行执行此步骤中显示的所有命令(请参阅 --backup-path 选项的描述)。

    3. 照常恢复索引,如下所示

      $> ndb_restore -b 1 -n 1 --rebuild-indexes --backup-path=/var/lib/mysql-cluster/BACKUP/BACKUP-1
    4. 最后,恢复纪元,使用以下命令

      $> ndb_restore -b 1 -n 1 --restore-epoch --backup-path=/var/lib/mysql-cluster/BACKUP/BACKUP-1

    您应该只使用切片来恢复集群数据;恢复元数据、索引或纪元信息时,不需要使用 --num-slices--slice-id。如果在这两个选项或这两个选项中,任何一个或两个选项与控制这些恢复的 ndb_restore 选项一起使用,该程序会忽略它们。

    使用 --parallelism 选项对恢复速度的影响与使用 ndb_restore 的多个实例进行切片或并行恢复产生的影响是独立的(--parallelism 指定 单个 ndb_restore 线程执行的并行事务数),但它可以与这两者或两者之一一起使用。您应该意识到,增加 --parallelism 会导致 ndb_restore 对集群施加更大的负载;如果系统可以处理这种情况,恢复应该更快地完成。

    --num-slices 的值不直接依赖于与硬件相关的值,例如 CPU 数或 CPU 内核数、RAM 量等,也不依赖于 LDM 的数量。

    可以在不同的数据节点上使用不同的值,作为同一恢复的一部分;这样做本身不应产生任何不良影响。

  • --parallelism=#, -p

    命令行格式 --parallelism=#
    类型 数字
    默认值 128
    最小值 1
    最大值 1024

    ndb_restore 使用单行事务来并发应用许多行。此参数确定 ndb_restore 实例尝试使用的并行事务(并发行)数。默认情况下,此值为 128;最小值为 1,最大值为 1024。

    执行插入操作的工作在涉及的数据节点的线程之间并行化。此机制用于从 .Data 文件恢复批量数据,即数据的模糊快照;它不用于构建或重建索引。更改日志是串行应用的;索引删除和构建是 DDL 操作,分别处理。客户端侧的恢复没有线程级并行性。

  • --preserve-trailing-spaces, -P

    命令行格式 --preserve-trailing-spaces

    在将定长字符数据类型提升为其可变长度等效类型时,导致保留尾随空格,也就是说,在将 CHAR 列值提升为 VARCHAR,或将 BINARY 列值提升为 VARBINARY 时。否则,当将此类列值插入新列时,任何尾随空格都会从这些列值中删除。

    注意

    虽然您可以将 CHAR 列提升为 VARCHAR,并将 BINARY 列提升为 VARBINARY,但您无法将 VARCHAR 列提升为 CHAR,或将 VARBINARY 列提升为 BINARY

  • --print

    命令行格式 --print

    导致 ndb_restore 将所有数据、元数据和日志打印到 stdout。等同于使用 --print-data--print-meta--print-log 选项组合。

    注意

    使用 --print 或任何 --print_* 选项实际上是在执行试运行。包含其中一个或多个选项会导致任何输出重定向到 stdout;在这种情况下,ndb_restore 不会尝试将数据或元数据还原到 NDB 集群。

  • --print-data

    命令行格式 --print-data

    导致 ndb_restore 将其输出重定向到 stdout。通常与一个或多个 --tab--fields-enclosed-by--fields-optionally-enclosed-by--fields-terminated-by--hex--append 一起使用。

    TEXTBLOB 列值始终被截断。此类值在输出中被截断到前 256 个字节。目前使用 --print-data 时无法覆盖此行为。

  • --print-defaults

    命令行格式 --print-defaults

    打印程序参数列表并退出。

  • --print-log

    命令行格式 --print-log

    导致 ndb_restore 将其日志输出到 stdout

  • --print-meta

    命令行格式 --print-meta

    将所有元数据打印到 stdout

  • print-sql-log

    命令行格式 --print-sql-log

    将 SQL 语句记录到 stdout。使用此选项启用;通常此行为是禁用的。此选项在尝试记录之前会检查所有要还原的表是否都显式定义了主键;对仅具有 NDB 实现的隐藏主键的表的查询无法转换为有效的 SQL。

    此选项不适用于具有 BLOB 列的表。

  • --progress-frequency=N

    命令行格式 --progress-frequency=#
    类型 数字
    默认值 0
    最小值 0
    最大值 65535

    在备份进行过程中,每 N 秒打印一次状态报告。0(默认值)表示不打印任何状态报告。最大值为 65535。

  • --promote-attributes, -A

    命令行格式 --promote-attributes

    ndb_restore 支持有限的 属性提升,这与 MySQL 复制中支持的方式非常相似;也就是说,从给定类型列备份的数据通常可以还原到使用 更大,相似 类型的列。例如,来自 CHAR(20) 列的数据可以还原到声明为 VARCHAR(20)VARCHAR(30)CHAR(30) 的列;来自 MEDIUMINT 列的数据可以还原到类型为 INTBIGINT 的列。有关属性提升当前支持的类型转换表,请参见 第 19.5.1.9.2 节“具有不同数据类型的列的复制”

    此选项还使将 NOT NULL 列还原为 NULL 成为可能。

    必须显式启用 ndb_restore 的属性提升,方法如下:

    1. 准备要还原备份的表。ndb_restore 不能用于重新创建与原始表定义不同的表;这意味着您必须手动创建该表,或者在还原表元数据但还原数据之前,使用 ALTER TABLE 更改要提升的列。

    2. 在还原表数据时,使用 --promote-attributes 选项(简写形式为 -A)调用 ndb_restore。如果没有使用此选项,则不会发生属性提升;相反,还原操作会失败并出现错误。

    在字符数据类型和 TEXTBLOB 之间进行转换时,只能在同一时间执行字符类型(CHARVARCHAR)和二进制类型(BINARYVARBINARY)之间的转换。例如,您无法在同一 ndb_restore 调用中,将 INT 列提升到 BIGINT,同时将 VARCHAR 列提升到 TEXT

    不支持在使用不同字符集的 TEXT 列之间进行转换,并且明确禁止这样做。

    在使用 ndb_restore 将字符或二进制类型转换为 TEXTBLOB 时,您可能会注意到它会创建和使用一个或多个名为 table_name$STnode_id 的暂存表。这些表之后不需要,通常会在 ndb_restore 成功还原后被删除。

  • --rebuild-indexes

    命令行格式 --rebuild-indexes

    在还原本机 NDB 备份时,启用有序索引的多线程重建。使用此选项的 ndb_restore 建立有序索引使用的线程数由 BuildIndexThreads 数据节点配置参数和 LDM 数控制。

    只有在第一次运行 ndb_restore 时才需要使用此选项;这会导致所有有序索引在还原后续节点时不再使用 --rebuild-indexes 重新构建。您应该在将新行插入数据库之前使用此选项;否则,可能会插入一行,该行在尝试重新构建索引时会导致唯一约束冲突。

    默认情况下,有序索引的构建与 LDM 数并行进行。在节点和系统重启期间执行的离线索引构建可以使用 BuildIndexThreads 数据节点配置参数来加速;此参数对 ndb_restore 删除和重建索引没有影响,该操作在线执行。

    唯一索引的重建使用磁盘写入带宽进行重做日志记录和本地检查点。此带宽不足会导致重做缓冲区过载或日志过载错误。在这种情况下,您可以再次运行 ndb_restore --rebuild-indexes;该过程将在发生错误的地方恢复。您也可以在遇到临时错误时执行此操作。您可以无限次重复执行 ndb_restore --rebuild-indexes;您可以通过降低 --parallelism 的值来阻止此类错误。如果问题是空间不足,您可以增加重做日志的大小(FragmentLogFileSize 节点配置参数),或者您可以提高 LCP 执行的速度(MaxDiskWriteSpeed 和相关参数),以便更快地释放空间。

  • --remap-column=db.tbl.col:fn:args

    命令行格式 --remap-column=string
    类型 字符串
    默认值 [无]

    --restore-data 一起使用时,此选项将函数应用于所指示列的值。参数字符串中的值在此处列出:

    • db:数据库名称,遵循 --rewrite-database 执行的任何重命名。

    • tbl:表名称。

    • col: 要更新的列的名称。该列必须为 INTBIGINT 类型。该列也可以是 UNSIGNED,但不是必需的。

    • fn: 函数名称;目前,唯一支持的名称是 offset

    • args: 传递给函数的参数。目前,仅支持单个参数,即 offset 函数要添加的偏移量大小。支持负值。参数的大小不能超过列类型的有符号变体的范围;例如,如果 col 是一个 INT 列,那么传递给 offset 函数的参数的允许范围是 -21474836482147483647(参见 第 13.1.2 节,“整数类型 (精确值) - INTEGER, INT, SMALLINT, TINYINT, MEDIUMINT, BIGINT”)。

      如果将偏移量值应用于列会导致溢出或下溢,则恢复操作将失败。例如,如果列是 BIGINT,而该选项试图在该列值为 4294967291 的行上应用 8 的偏移量值,则会发生这种情况,因为 4294967291 + 8 = 4294967299 > 4294967295

    当您希望将存储在 NDB Cluster 的多个源实例(所有实例使用相同的模式)中的数据合并到单个目标 NDB Cluster 中时,此选项很有用,使用 NDB 本机备份(参见 第 25.6.8.2 节,“使用 NDB Cluster 管理客户端创建备份”)和 ndb_restore 来合并数据,其中源集群之间的主键和唯一键值重叠,并且需要作为该过程的一部分将这些值重新映射到不重叠的范围。也可能需要保留表之间的其他关系。为了满足这些要求,可以在同一个 ndb_restore 调用中多次使用该选项来重新映射不同表的列,如下所示

    $> ndb_restore --restore-data --remap-column=hr.employee.id:offset:1000 \
        --remap-column=hr.manager.id:offset:1000 --remap-column=hr.firstaiders.id:offset:1000

    (此处未显示的其他选项也可能使用。)

    --remap-column 也可以用来更新同一表的多个列。多个表和列的组合是可能的。同一表的不同列也可以使用不同的偏移量值,如下所示

    $> ndb_restore --restore-data --remap-column=hr.employee.salary:offset:10000 \
        --remap-column=hr.employee.hours:offset:-10

    当源备份包含不应合并的重复表时,您可以使用 --exclude-tables--exclude-databases 或应用程序中的其他方法来处理此问题。

    可以使用 SHOW CREATE TABLEndb_desc 工具;以及 MAX()MIN()LAST_INSERT_ID() 和其他 MySQL 函数来获取有关要合并的表结构和其他特性的信息。

    不支持从合并的表到未合并的表,或从未合并的表到合并的表的更改的复制。

  • --restore-data-r

    命令行格式 --restore-data

    输出 NDB 表数据和日志。

  • --restore-epoch-e

    命令行格式 --restore-epoch

    将纪元信息添加到集群复制状态表中(或恢复)。这对于在 NDB Cluster 副本上启动复制很有用。使用此选项时,如果 mysql.ndb_apply_status 中的 id 列为 0 的行已存在,则更新该行;如果该行不存在,则插入该行。(参见 第 25.7.9 节,“使用 NDB Cluster 复制进行 NDB Cluster 备份”。)

  • --restore-meta-m

    命令行格式 --restore-meta

    此选项使 ndb_restore 打印 NDB 表元数据。

    第一次运行 ndb_restore 恢复程序时,还需要恢复元数据。换句话说,您必须重新创建数据库表——这可以通过使用 --restore-meta (-m) 选项运行该程序来完成。恢复元数据只需在一个数据节点上完成即可;这足以将其恢复到整个集群中。

    ndb_restore 使用目标集群的默认分区数,除非本地数据管理器线程数也从原始集群数据节点的线程数更改。

    使用此选项时,建议通过设置 ndb_metadata_check=OFF 禁用自动同步,直到 ndb_restore 完成元数据的恢复,之后可以将其重新打开以同步在 NDB 字典中新创建的对象。

    注意

    集群在开始恢复备份时应该有一个空数据库。(换句话说,您应该使用 --initial 启动数据节点,然后再执行恢复。)

  • --restore-privilege-tables

    命令行格式 --restore-privilege-tables
    已弃用

    不再使用。

  • --rewrite-database=olddb,newdb

    命令行格式 --rewrite-database=string
    类型 字符串
    默认值

    此选项使您可以恢复到与备份中使用的数据库名称不同的数据库。例如,如果备份了一个名为 products 的数据库,您可以将其中包含的数据恢复到名为 inventory 的数据库,使用此选项,如下所示(省略任何其他可能需要的选项)

    $> ndb_restore --rewrite-database=product,inventory

    该选项可以在单个 ndb_restore 调用中使用多次。因此,可以使用 --rewrite-database=db1,db2 --rewrite-database=db3,db4 同时从名为 db1 的数据库恢复到名为 db2 的数据库,以及从名为 db3 的数据库恢复到名为 db4 的数据库。其他 ndb_restore 选项可以在 --rewrite-database 的多个出现之间使用。

    如果多个 --rewrite-database 选项之间存在冲突,则从左到右读取的最后一个 --rewrite-database 选项将生效。例如,如果使用 --rewrite-database=db1,db2 --rewrite-database=db1,db3,则只有 --rewrite-database=db1,db3 会被执行,而 --rewrite-database=db1,db2 会被忽略。也可以从多个数据库恢复到单个数据库,以便 --rewrite-database=db1,db3 --rewrite-database=db2,db3 将数据库 db1db2 中的所有表和数据恢复到数据库 db3 中。

    重要

    当使用 --rewrite-database 从多个备份数据库恢复到单个目标数据库时,不会检查表或其他对象名称之间的冲突,并且恢复行的顺序不受保证。这意味着在这种情况下,行可能会被覆盖,并且更新可能会丢失。

  • --skip-broken-objects

    命令行格式 --skip-broken-objects

    此选项使 ndb_restore 在读取本机 NDB 备份时忽略损坏的表,并继续恢复任何剩余的表(如果它们也没有损坏)。目前,--skip-broken-objects 选项仅在缺少 blob 部分表的情况下有效。

  • --skip-table-check-s

    命令行格式 --skip-table-check

    可以恢复数据而不恢复表元数据。默认情况下,在执行此操作时,如果 ndb_restore 在表数据和表模式之间发现不匹配,则会发生错误。此选项会覆盖该行为。

    在使用 ndb_restore 恢复数据时,对列定义中不匹配的一些限制有所放宽;当遇到这些类型的不匹配时,ndb_restore 不会像以前那样停止并出现错误,而是会接受数据并将数据插入目标表,同时向用户发出警告,说明正在执行此操作。无论是否使用 --skip-table-check--promote-attributes 选项,都会发生这种行为。列定义中的这些差异类型如下

    • 不同的 COLUMN_FORMAT 设置 (FIXEDDYNAMICDEFAULT)

    • 不同的 STORAGE 设置 (MEMORYDISK)

    • 不同的默认值

    • 不同的分发键设置

  • --skip-unknown-objects

    命令行格式 --skip-unknown-objects

    此选项使 ndb_restore 在读取本机 NDB 备份时忽略任何无法识别的模式对象。这可以用于将从运行(例如)NDB 7.6 的集群中创建的备份恢复到运行 NDB Cluster 7.5 的集群中。

  • --slice-id=#

    命令行格式 --slice-id=#
    类型 整数
    默认值 0
    最小值 0
    最大值 1023

    当按切片恢复时,这是要恢复的切片的 ID。 此选项始终与 --num-slices 结合使用,其值必须始终小于 --num-slices 的值。

    有关更多信息,请参阅本节中其他地方对 --num-slices 的描述。

  • --tab=dir_name, -T dir_name

    命令行格式 --tab=path
    类型 目录名称

    导致 --print-data 创建转储文件,每个表一个,每个文件名为 tbl_name.txt。 它需要作为其参数保存文件的目录的路径; 对当前目录使用 .

  • --timestamp-printouts

    命令行格式 --timestamp-printouts{=true|false}
    类型 布尔值
    默认值 true

    导致信息、错误和调试日志消息以时间戳为前缀。

    此选项默认启用。 使用 --timestamp-printouts=false 禁用它。

  • --usage

    命令行格式 --usage

    显示帮助文本并退出; 与 --help 相同。

  • --verbose=#

    命令行格式 --verbose=#
    类型 数字
    默认值 1
    最小值 0
    最大值 255

    设置输出详细程度的级别。 最小值为 0; 最大值为 255。 默认值为 1。

  • --version

    命令行格式 --version

    显示版本信息并退出。

  • --with-apply-status

    命令行格式 --with-apply-status

    从备份的 ndb_apply_status 表中恢复所有行(除了具有 server_id = 0 的行,该行是使用 --restore-epoch 生成的)。 此选项要求也使用 --restore-data

    如果来自备份的 ndb_apply_status 表中已经包含一行具有 server_id = 0ndb_restore --with-apply-status 会删除它。 出于此原因,我们建议您在调用 ndb_restore 之后使用 --restore-epoch,其中包含 --with-apply-status 选项。 您也可以将 --restore-epoch 与用于恢复集群的任何 ndb_restore --with-apply-status 的最后一次调用同时使用。

    有关更多信息,请参阅 ndb_apply_status Table

此实用程序的典型选项如下所示

ndb_restore [-c connection_string] -n node_id -b backup_id \
      [-m] -r --backup-path=/path/to/backup/files

通常,从 NDB Cluster 备份恢复时,ndb_restore 最少需要 --nodeid(简写形式:-n)、--backupid(简写形式:-b)和 --backup-path 选项。

选项 -c 用于指定连接字符串,它告诉 ndb_restore 在哪里查找集群管理服务器(请参阅 Section 25.4.3.3, “NDB Cluster Connection Strings”)。 如果不使用此选项,那么 ndb_restore 会尝试连接到 localhost:1186 上的管理服务器。 此实用程序充当集群 API 节点,因此需要一个免费的连接 插槽 来连接到集群管理服务器。 这意味着集群 config.ini 文件中必须至少有一个 [api][mysqld] 部分,它可以被此实用程序使用。 出于此原因,在 config.ini 中保留至少一个空 [api][mysqld] 部分,该部分未用于 MySQL 服务器或其他应用程序是一个好主意(请参阅 Section 25.4.3.7, “Defining SQL and Other API Nodes in an NDB Cluster”)。

ndb_restore 可以使用 --decrypt--backup-password 解密加密备份。 为了执行解密,必须指定这两个选项。 请参阅 START BACKUP 管理客户端命令的文档,了解有关创建加密备份的信息。

您可以使用 SHOW 命令在 ndb_mgm 管理客户端中验证 ndb_restore 是否已连接到集群。 您也可以从系统 shell 中完成此操作,如下所示

$> ndb_mgm -e "SHOW"

错误报告。  ndb_restore 会报告临时错误和永久错误。 在发生临时错误的情况下,它可能能够从这些错误中恢复,并在这种情况下报告 Restore successful, but encountered temporary error, please look at configuration

重要

使用 ndb_restore 初始化 NDB Cluster 以在循环复制中使用后,充当副本的 SQL 节点上的二进制日志不会自动创建,并且您必须手动创建它们。 为了创建二进制日志,请在运行 START REPLICA 之前,在该 SQL 节点上发出 SHOW TABLES 语句。 这是 NDB Cluster 中的已知问题。