NDB Cluster 恢复程序以单独的命令行实用程序 ndb_restore 实现,该实用程序通常可以在 MySQL 的 bin
目录中找到。此程序读取备份时创建的文件,并将存储的信息插入数据库。
对于通过用于创建备份的 START BACKUP
命令创建的每个备份文件,必须执行一次 ndb_restore 。这等于集群在创建备份时的数据节点数量。
在使用 ndb_restore 之前,建议集群以单用户模式运行,除非您要并行恢复多个数据节点。有关更多信息,请参阅 第 25.6.6 节,“NDB Cluster 单用户模式”。
在下表中显示了可用于 ndb_restore 的选项。表后是其他说明。
-
命令行格式 --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 和 text 列的更改,这些更改需要使用暂存表。
以下是使用主键模式更改的典型场景中的基本步骤
使用 ndb_restore
--restore-meta
恢复表模式更改模式到所需的模式,或创建该模式
备份所需的模式
运行 ndb_restore
--disable-indexes
使用上一步中的备份,以删除索引和约束运行 ndb_restore
--allow-pk-changes
(可能与--ignore-extended-pk-updates
、--disable-indexes
以及可能的其他选项一起使用)以恢复所有数据运行 ndb_restore
--rebuild-indexes
使用具有所需模式的备份,以重建索引和约束
在扩展主键时,ndb_restore 可能需要在恢复操作期间使用临时辅助唯一索引来从旧主键映射到新主键。仅在需要时创建此类索引,以将备份日志中的事件应用到具有扩展主键的表。此索引名为
NDB$RESTORE_PK_MAPPING
,并在每个需要它的表上创建;如果需要,多个 ndb_restore 实例可以共享此索引。(在恢复过程结束时运行 ndb_restore--rebuild-indexes
会导致此索引被删除。) -
命令行格式 --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 为
12
的备份,该备份是在具有两个存储节点(节点 ID 分别为2
和3
)的集群中创建的。然后,必须运行两次 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
类型 字符串 默认值 [无]
此选项指定在使用
--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 时以交互方式提供密码的方式,当使用--password
而不提供命令行上的密码时。--backupid
=#
,-b
命令行格式 --backupid=#
类型 数字 默认值 无
此选项是必需的;它用于指定备份的 ID 或序列号,与备份完成后在管理客户端显示的
Backup
消息中显示的数字相同。(参见 第 25.6.8.2 节,“使用 NDB Cluster 管理客户端创建备份”。)backup_id
completed重要还原集群备份时,必须确保从具有相同备份 ID 的备份还原所有数据节点。使用来自不同备份的文件,最好的结果是将集群还原到不一致的状态,并且很可能会完全失败。
-
命令行格式 --character-sets-dir=path
包含字符集的目录。
--connect
,-c
命令行格式 --connect=connection_string
类型 字符串 默认值 localhost:1186
是
--ndb-connectstring
的别名。-
命令行格式 --connect-retries=#
类型 整数 默认值 12
最小值 0
最大值 12
在放弃之前重试连接的次数。
-
命令行格式 --connect-retry-delay=#
类型 整数 默认值 5
最小值 0
最大值 5
尝试联系管理服务器之间等待的秒数。
-
命令行格式 --connect-string=connection_string
类型 字符串 默认值 [无]
与
--ndb-connectstring
相同。 -
命令行格式 --core-file
在错误时写入核心文件;用于调试。
-
命令行格式 --decrypt
使用
--backup-password
选项提供的密码解密加密的备份。 -
命令行格式 --defaults-extra-file=path
类型 字符串 默认值 [无]
读取全局文件后读取给定文件。
-
命令行格式 --defaults-file=path
类型 字符串 默认值 [无]
仅从给定文件读取默认选项。
-
命令行格式 --defaults-group-suffix=string
类型 字符串 默认值 [无]
还读取具有 concat(group, suffix) 的组。
-
命令行格式 --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
通常,在还原表数据和元数据时,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
可以使用此选项仅还原选定的表列,这会导致 ndb_restore 忽略与备份中找到的表版本相比,正在还原的表中缺少的任何列。此选项适用于所有正在还原的表。如果您希望仅将此选项应用于选定的表或数据库,您可以将其与本节中其他地方介绍的一个或多个
--include-*
或--exclude-*
选项组合使用,然后使用这些选项的补充集将数据还原到剩余的表。 -
命令行格式 --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
)除了 db1
和db2
之外,所有数据库中的所有表都被还原;db1
或db2
中没有表被还原--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
之外,所有表都被还原;db1
或db2
中没有其他表被还原;所有其他数据库中的所有表都被还原您可以将这两个选项一起使用。例如,以下操作会导致除了数据库
db1
和db2
以及数据库db3
中的表t1
和t2
之外,所有数据库中的所有表都被还原$> 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
匹配的选项,因此优先于任何其他与db1
或db1
中的任何表匹配的选项。--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
类型 字符串 默认值 -
命令行格式 --fields-terminated-by=char
类型 字符串 默认值 \t (tab)
此选项传递的字符串用于分隔列值。默认值为制表符 (
\t
)。 -
命令行格式 --help
显示帮助文本并退出。
-
命令行格式 --hex
如果使用此选项,则所有二进制值都以十六进制格式输出。
-
命令行格式 --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
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
(或--include-databases=db1
--include-databases=db2
)只恢复数据库 db1
和db2
中的表;所有其他数据库中的所有表都将被忽略。--include-tables=db1.t1
只恢复数据库 db1
中的表t1
;db1
或任何其他数据库中的其他表都不会被恢复。--include-tables=db1.t2,db2.t1
(或--include-tables=db1.t2
--include-tables=db2.t1
)只恢复数据库 db1
中的表t2
和数据库db2
中的表t1
;db1
、db2
或任何其他数据库中的其他表都不会被恢复。您也可以将这两个选项一起使用。例如,以下操作会导致恢复数据库
db1
和db2
中的所有表,以及数据库db3
中的表t1
和t2
(以及其他数据库或表)。$> 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
类型 字符串 默认值 \n (linebreak)
指定用于结束每行输出的字符串。默认值为换行符 (
\n
)。 -
命令行格式 --login-path=path
类型 字符串 默认值 [无]
从登录文件中读取给定路径。
-
命令行格式 --no-login-paths
跳过从登录路径文件读取选项。
-
命令行格式 --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
此选项可以防止任何已连接的 SQL 节点将 ndb_restore 恢复的数据写入其二进制日志。
-
命令行格式 --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=connection_string
类型 字符串 默认值 [无]
设置连接字符串,用于连接到 ndb_mgmd。语法:
[nodeid=
。覆盖id
;][host=]hostname
[:port
]NDB_CONNECTSTRING
和my.cnf
中的条目。 -
命令行格式 --ndb-mgm-tls=level
类型 枚举 默认值 relaxed
有效值 relaxed
strict
设置连接到管理服务器所需的 TLS 支持级别;
relaxed
或strict
之一。relaxed
(默认)表示尝试建立 TLS 连接,但不要求成功;strict
表示连接需要 TLS。 -
命令行格式 --ndb-mgmd-host=connection_string
类型 字符串 默认值 [无]
与
--ndb-connectstring
相同。 --ndb-nodegroup-map
=map
,-z
命令行格式 --ndb-nodegroup-map=map
此选项设置的任何值都会被忽略,选项本身也不会执行任何操作。
-
命令行格式 --ndb-nodeid=#
类型 整数 默认值 [无]
设置此节点的节点 ID,覆盖
--ndb-connectstring
设置的任何 ID。 --ndb-optimized-node-selection
命令行格式 --ndb-optimized-node-selection
启用针对事务节点选择的优化。默认情况下启用;使用
--skip-ndb-optimized-node-selection
禁用。-
命令行格式 --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
不要从任何选项文件(登录文件除外)读取默认选项。
--nodeid
=#
,-n
命令行格式 --nodeid=#
类型 数字 默认值 无
指定备份所在数据节点的节点 ID;必需。
当恢复到与备份所在数据节点数量不同的集群时,此信息有助于识别要恢复到给定节点的正确文件集或文件集。(在这种情况下,通常需要将多个文件恢复到单个数据节点。)请参阅 Restoring to a different number of data nodes,以获取更多信息和示例。
-
命令行格式 --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
个切片恢复意味着运行N
个 ndb_restore 实例,所有实例都使用--num-slices=
(以及任何其他必要的选项),并且每个实例都使用N
--slice-id=1
、--slice-id=2
、--slice-id=3
,依此类推,直到slice-id=
。N
-1示例。 假设您想将名为
BACKUP-1
的备份(在每个数据节点的节点文件系统上的默认目录/var/lib/mysql-cluster/BACKUP/BACKUP-3
中找到)恢复到一个具有四个数据节点(节点 ID 分别为 1、2、3 和 4)的集群。要使用五个切片执行此操作,请执行以下列表中显示的命令集使用 ndb_restore 恢复集群元数据,如下所示
$> ndb_restore -b 1 -n 1 -m --disable-indexes --backup-path=/home/ndbuser/backups
将集群数据恢复到数据节点,调用 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
选项的描述),就可以并行执行此步骤中显示的所有命令。照常恢复索引,如下所示
$> ndb_restore -b 1 -n 1 --rebuild-indexes --backup-path=/var/lib/mysql-cluster/BACKUP/BACKUP-1
最后,恢复纪元,使用此处显示的命令
$> 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
时。否则,在将此类列值插入新列时,会从这些列值中删除任何尾随空格。-
命令行格式 --print
导致 ndb_restore 将所有数据、元数据和日志打印到
stdout
。等效于使用--print-data
、--print-meta
和--print-log
选项组合在一起。注意使用
--print
或任何--print_*
选项实际上是在执行试运行。包含这些选项中的一个或多个会导致任何输出被重定向到stdout
;在这种情况下,ndb_restore 不会尝试将数据或元数据还原到 NDB Cluster。 -
命令行格式 --print-data
导致 ndb_restore 将其输出直接输出到
stdout
。通常与一个或多个--tab
、--fields-enclosed-by
、--fields-optionally-enclosed-by
、--fields-terminated-by
、--hex
和--append
结合使用。TEXT
和BLOB
列值始终被截断。这些值在输出中被截断为前 256 个字节。在使用--print-data
时,目前无法覆盖此行为。 -
命令行格式 --print-defaults
打印程序参数列表并退出。
-
命令行格式 --print-log
导致 ndb_restore 将其日志输出到
stdout
。 -
命令行格式 --print-meta
将所有元数据打印到
stdout
。 -
命令行格式 --print-sql-log
将 SQL 语句记录到
stdout
。使用此选项以启用;通常此行为被禁用。该选项在尝试记录之前会检查所有要还原的表是否已显式定义了主键;对只有由NDB
实现的隐藏主键的表的查询不能转换为有效的 SQL。此选项不适用于具有
BLOB
列的表。 -
命令行格式 --progress-frequency=#
类型 数字 默认值 0
最小值 0
最大值 65535
在备份进行过程中,每
N
秒打印一次状态报告。0(默认值)表示不打印任何状态报告。最大值为 65535。 -
命令行格式 --promote-attributes
ndb_restore 支持有限的 属性提升,与 MySQL 复制中的支持方式非常相似;也就是说,从给定类型的列备份的数据通常可以还原到使用 “更大、相似” 类型的列。例如,来自
CHAR(20)
列的数据可以还原到声明为VARCHAR(20)
、VARCHAR(30)
或CHAR(30)
的列;来自MEDIUMINT
列的数据可以还原到类型为INT
或BIGINT
的列。有关目前属性提升支持的类型转换表,请参见 第 19.5.1.9.2 节,“具有不同数据类型的列的复制”。此选项还允许将
NOT NULL
列还原为NULL
。必须显式启用 ndb_restore 的属性提升,方法如下
准备要还原备份的表。ndb_restore 不能用于以与原始定义不同的定义重新创建表;这意味着您必须手动创建表,或者在还原表元数据后但在还原数据之前,使用
ALTER TABLE
更改要提升的列。在还原表数据时,使用
--promote-attributes
选项(简写形式为-A
)调用 ndb_restore。如果不使用此选项,则不会发生属性提升;相反,还原操作将失败并出现错误。
在字符数据类型和
TEXT
或BLOB
之间转换时,只能在同一时间执行字符类型 (CHAR
和VARCHAR
) 和二进制类型 (BINARY
和VARBINARY
) 之间的转换。例如,您不能在同一 ndb_restore 调用中,将INT
列提升到BIGINT
同时将VARCHAR
列提升到TEXT
。不支持在使用不同字符集的
TEXT
列之间进行转换,并且明确禁止。使用 ndb_restore 将字符或二进制类型转换为
TEXT
或BLOB
时,您可能会注意到它会创建一个或多个名为
的暂存表。这些表之后不再需要,通常会在成功还原后由 ndb_restore 删除。table_name
$STnode_id
-
命令行格式 --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
: 要更新的列的名称。此列必须是INT
或BIGINT
类型。该列也可以是UNSIGNED
类型,但不是必须的。fn
: 函数名称;目前,唯一支持的名称是offset
。args
: 提供给函数的参数。目前,只支持单个参数,即由offset
函数添加的偏移量的大小。支持负值。参数的大小不能超过列类型带符号变量的大小;例如,如果col
是INT
列,则传递给offset
函数的参数的允许范围为-2147483648
到2147483647
(参见 第 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 TABLE
、ndb_desc 工具以及MAX()
、MIN()
、LAST_INSERT_ID()
和其他 MySQL 函数来获取要合并的表的结构和特征信息。不支持在 NDB Cluster 的不同实例中将合并后的表与未合并后的表或未合并后的表与合并后的表之间的更改进行复制。
--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
已弃用 是 不再使用。
--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
将数据库db1
和db2
中的所有表和数据还原到数据库db3
中。重要当使用
--rewrite-database
将多个备份数据库还原到单个目标数据库时,不会检查表或其他对象名称之间的冲突,并且还原行的顺序不保证。这意味着在这种情况下,可能发生行被覆盖和更新丢失。-
命令行格式 --skip-broken-objects
此选项会导致 ndb_restore 在读取本机
NDB
备份时忽略损坏的表,并继续还原任何剩余的表(这些表也不损坏)。目前,--skip-broken-objects
选项只在缺少 blob 部分表的情况下才有效。 -
命令行格式 --skip-table-check
可以还原数据而不还原表元数据。默认情况下,在执行此操作时,如果发现表数据与表模式之间存在不匹配,ndb_restore 会失败并显示错误;此选项将覆盖该行为。
在使用 ndb_restore 还原数据时,对列定义中不匹配的某些限制已放宽;当遇到这些类型的不匹配时,ndb_restore 不会像以前那样停止并显示错误,而是接受数据并将其插入目标表,同时向用户发出警告,说明正在执行此操作。无论使用
--skip-table-check
还是--promote-attributes
选项,都会出现此行为。这些列定义中的差异属于以下类型不同的
COLUMN_FORMAT
设置(FIXED
、DYNAMIC
、DEFAULT
)不同的
STORAGE
设置(MEMORY
、DISK
)不同的默认值
不同的分配键设置
-
命令行格式 --skip-unknown-objects
此选项会导致 ndb_restore 在读取本机
NDB
备份时忽略任何无法识别的模式对象。这可用于将从运行(例如)NDB 7.6 的集群中创建的备份还原到运行 NDB Cluster 7.5 的集群中。 -
命令行格式 --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{=true|false}
类型 布尔值 默认值 true
导致信息、错误和调试日志消息以时间戳为前缀。
此选项默认情况下处于启用状态。使用
--timestamp-printouts=false
禁用它。 -
命令行格式 --usage
显示帮助文本并退出;与
--help
相同。 -
命令行格式 --verbose=#
类型 数字 默认值 1
最小值 0
最大值 255
设置输出详细程度的级别。最小值为 0;最大值为 255。默认值为 1。
-
命令行格式 --version
显示版本信息并退出。
-
命令行格式 --with-apply-status
从备份的
ndb_apply_status
表中恢复所有行(除了具有server_id = 0
的行,该行是使用--restore-epoch
生成的)。此选项要求也使用--restore-data
。如果备份中的
ndb_apply_status
表已经包含一个server_id = 0
的行,ndb_restore--with-apply-status
会删除它。因此,我们建议您在调用 ndb_restore 使用--with-apply-status
选项后使用--restore-epoch
。您还可以将--restore-epoch
与用于恢复群集的 ndb_restore--with-apply-status
的任何调用的最后一个同时使用。有关更多信息,请参阅 ndb_apply_status 表。
此实用程序的典型选项如下所示
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
在哪里查找群集管理服务器(请参阅 第 25.4.3.3 节“NDB Cluster 连接字符串”)。如果未使用此选项,则 ndb_restore 尝试连接到 localhost:1186
上的管理服务器。此实用程序充当群集 API 节点,因此需要一个免费的连接“插槽”才能连接到群集管理服务器。这意味着群集 config.ini
文件中必须至少有一个 [api]
或 [mysqld]
部分可供它使用。出于此原因,最好在 config.ini
中保留至少一个未用于 MySQL 服务器或其他应用程序的空 [api]
或 [mysqld]
部分(请参阅 第 25.4.3.7 节“在 NDB Cluster 中定义 SQL 和其他 API 节点”)。
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 中的一个已知问题。