25.5.23 NDB 集群还原程序 — 还原 NDB 集群备份
NDB Cluster restoration program 是一个独立的命令行实用工具ndb_restore,通常可以在MySQL bin
目录中找到。该程序读取备份创建的文件,并将存储的信息插入数据库。
ndb_restore 必须执行一次用于每个备份文件的创建,通过START BACKUP
命令创建的备份(请参阅Section 25.6.8.2, “使用 NDB 集群管理客户端创建备份”)。这等于在创建备份时集群中的数据节点数量。
在使用ndb_restore之前,建议将集群设置为单用户模式,除非您要并行还原多个数据节点。请参阅Section 25.6.6, “NDB 集群单用户模式”,获取更多信息。
使用ndb_restore的选项显示在下表中。附加描述随后出现。
-
Command-Line Format --allow-pk-changes[=0|1]
Type 整数 Default Value 0
Minimum Value 0
Maximum Value 1
当此选项设置为
1
时,ndb_restore允许表定义的主键与备份中相同表的主键不同。这在备份和恢复之间不同的架构版本,一个或多个表的主键更改时可能是有用的,并且它看起来执行恢复操作使用 ndb_restore 更简单或更有效率,而不是发出许多ALTER TABLE
语句后恢复表架构和数据。下列主键定义更改由
--allow-pk-changes
支持:-
扩展主键:备份中存在的非空值列在表架构中成为数据库中的表主键。
Important当扩展表的主键时,任何成为主键的一部分的列在备份期间不得更新;任何由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运行在并行的实例中。 (在恢复过程结束时使用--rebuild-indexes
运行ndb_restore将导致此索引被删除。) -
-
Command-Line Format --append
当与
--tab
和--print-data
选项一起使用时,这将导致数据追加到具有相同名称的任何现有文件中。 -
--backup-path
=dir_name
Command-Line Format --backup-path=path
Type 目录名称 Default Value ./
备份目录的路径是必需的;这个路径将被传递给ndb_restore使用
--backup-path
选项,并且必须包含备份的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版本的集群恢复备份到另一个集群。请参阅Section 25.3.7,“升级和降级NDB集群”,获取更多信息。Important不能使用旧版本的ndb_restore从新版本的NDB集群恢复备份。可以将一个由新版本MySQL创建的备份恢复到旧集群,但必须使用来自新NDB集群版本的ndb_restore来完成此操作。
例如,要将从运行NDB集群8.4.0的集群备份还原到运行NDB集群8.0.35的集群,您必须使用与NDB集群8.0.35发行版中提供的ndb_restore一起使用的。
[api]
或[mysqld]
部分在集群config.ini
文件中可用。即,当并行还原到多个节点时,您必须有一个足够数量的集群连接可用。但是,数据文件总是在日志之前应用。要加快恢复速度,可以并行地将数据还原,只要有足够数量的集群连接可用。也就是说,当并行还原到多个节点时,您必须在每个同时运行的ndb_restore过程中有一个
[api]
或[mysqld]
部分在集群config.ini
文件中可用。然而,数据文件总是在日志之前应用。 -
Command-Line Format --backup-password=password
Type 字符串 Default Value [none]
此选项指定用于解密加密备份的密码。必须与用来加密备份相同。
密码必须是1到256个字符的长度,并且必须用单引号或双引号括起来。它可以包含任何ASCII字符,具有字符代码32、35、38、40-91、93、95和97-126;换句话说,它可以使用任何可打印的ASCII字符,除了
!
、'
、"
、$
、%
、\
和^
。可以省略密码的情况下,ndb_restore等待从
stdin
中提供,正如使用--backup-password-from-stdin
时一样。 -
--backup-password-from-stdin[=TRUE|FALSE]
Command-Line Format --backup-password-from-stdin
当用作
--backup-password
的替代选项时,这个选项允许从系统shell(stdin
)输入备份密码,类似于在向mysql提供密码时交互地使用--password
的方式。 -
--backupid
=#
,-b
Command-Line Format --backupid=#
Type 数字 Default Value none
这个选项是必需的;它用于指定备份的ID或序列号,并且与管理客户端在备份完成时显示的相同编号相匹配。请参阅第 25.6.8.2 节,“使用 NDB 集群管理客户端创建备份”。
Important在恢复集群备份时,您必须确保从具有相同备份 ID 的备份中恢复所有数据节点。使用来自不同备份的文件最多只能将集群恢复到不一致的状态,并且可能完全失败。
-
Command-Line Format --character-sets-dir=path
包含字符集的目录。
-
--connect
,-c
Command-Line Format --connect=connection_string
Type 字符串 Default Value localhost:1186
与
--ndb-connectstring
的别名。 -
Command-Line Format --connect-retries=#
Type 整数 Default Value 12
Minimum Value 0
Maximum Value 12
重连次数,直到放弃。
-
Command-Line Format --connect-retry-delay=#
Type 整数 Default Value 5
Minimum Value 0
Maximum Value 5
重连尝试之间等待的秒数。
-
Command-Line Format --connect-string=connection_string
Type String Default Value [none]
-
Command-Line Format --core-file
在出现错误时写入核心文件;用于调试。
-
Command-Line Format --decrypt
使用
--backup-password
选项提供的密码解密加密备份。 -
Command-Line Format --defaults-extra-file=path
Type String Default Value [none]
在读取全局文件之后读取给定文件。
-
Command-Line Format --defaults-file=path
Type String Default Value [none]
从给定文件中只读取默认选项。
-
Command-Line Format --defaults-group-suffix=string
Type String Default Value [none]
还读取具有concat(group, suffix)的组。
-
Command-Line Format --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节“不可见的索引”,获取更多信息。 -
Command-Line Format --dont-ignore-systab-0
通常,在恢复表数据和元数据时,ndb_restore会忽略备份中存在的
NDB
系统表的副本。--dont-ignore-systab-0
会导致系统表被恢复。 此选项仅供实验和开发使用,且不推荐在生产环境中使用。 -
--exclude-databases
=db-list
Command-Line Format --exclude-databases=list
Type 字符串 Default Value 不应被恢复的数据库列表,使用逗号分隔。
此选项通常与
--exclude-tables
一起使用;请参阅该选项的描述以获取更多信息和示例。 -
--exclude-intermediate-sql-tables[
=TRUE|FALSE]
Command-Line Format --exclude-intermediate-sql-tables[=TRUE|FALSE]
Type 布尔值 Default Value TRUE
在执行复制
ALTER TABLE
操作时,mysqld 会创建中间表(其名称以#sql-
为前缀)。当TRUE
时,--exclude-intermediate-sql-tables
选项会阻止 ndb_restore 恢复这些操作可能遗留下来的此类表。默认情况下,此选项为TRUE
。 -
Command-Line Format --exclude-missing-columns
使用此选项,可以仅恢复选定的表列,这会导致 ndb_restore 忽略与备份中找到的表版本相比,正在还原的表中缺少的任何列。此选项适用于正在还原的所有表。如果您希望仅将此选项应用于选定的表或数据库,则可以将其与本节其他地方描述的一个或多个
--include-*
或--exclude-*
选项结合使用,然后使用这些选项的补充集将数据还原到其余表。 -
Command-Line Format --exclude-missing-tables
使用此选项可以只恢复选择的表,导致ndb_restore忽略备份中找不到的任何表。
-
--exclude-tables
=table-list
Command-Line Format --exclude-tables=list
Type 字符串 Default Value 要排除的表列表;每个表引用都必须包括数据库名称。通常与
--exclude-databases
一起使用。当
--exclude-databases
或--exclude-tables
使用时,只有由选项命名的数据库或表被排除;所有其他数据库和表都将由ndb_restore恢复。以下表格展示了使用ndb_restore的几个调用,包括
--exclude-*
选项(其他可能需要的选项已省略以提高可读性),以及这些选项对从NDB集群备份中恢复时的影响:表25.23:使用--exclude-*选项调用ndb_restore,并且这些选项在从NDB集群备份中恢复时的影响。
Option Result --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
Command-Line Format --fields-enclosed-by=char
Type 字符串 Default Value 每个列值都由传递给此选项的字符串包围(无论数据类型如何;请参阅
--fields-optionally-enclosed-by
的描述)。 -
--fields-optionally-enclosed-by
Command-Line Format --fields-optionally-enclosed-by
Type String Default Value -
Command-Line Format --fields-terminated-by=char
Type String Default Value \t (tab)
这个选项的字符串用于分隔列值。默认值是制表符字符(
\t
)。 -
Command-Line Format --help
显示帮助文本并退出。
-
Command-Line Format --hex
如果使用此选项,则所有二进制值将以十六进制格式输出。
-
Command-Line Format --ignore-extended-pk-updates[=0|1]
Type 整数 Default Value 0
Minimum Value 0
Maximum Value 1
使用
--allow-pk-changes
时,成为表主键的一部分的列在备份期间不得更新;这些列应保持从插入值时的相同值直到包含这些值的行被删除。如果 ndb_restore 在还原备份时遇到这些列的更新,恢复失败。由于某些应用程序在更新行时可能为所有列设置值,即使一些列值未更改,也会出现这种情况。在这种情况下,您可以将--ignore-extended-pk-updates
设置为1
,强制 ndb_restore 忽略这些更新。Important在忽略这些更新时,用户负责确保没有更新任何成为主键的一部分的列值的值。
有关更多信息,请参阅
--allow-pk-changes
的描述。 -
--include-databases
=db-list
Command-Line Format --include-databases=list
Type 字符串 Default Value 逗号分隔的数据库列表,用于恢复。通常与
--include-tables
一起使用;请参阅该选项的描述以获取更多信息和示例。 -
Command-Line Format --include-stored-grants
ndb_restore默认情况下不会恢复共享用户和授权(请参阅Section 25.6.13, “Privilege Synchronization and NDB_STORED_USER”)到
ndb_sql_metadata
表。指定此选项将使其执行。 -
--include-tables
=table-list
Command-Line Format --include-tables=list
Type 字符串 Default Value 要恢复的表的逗号分隔列表;每个表引用都必须包括数据库名称。
当使用
--include-databases
或--include-tables
选项时,只有选项指定的数据库或表才会被恢复;所有其他数据库和表会被 ndb_restore 排除,不会被恢复。下表显示了使用
--include-*
选项调用 ndb_restore 的几个例子(为了清晰起见,省略了其他可能需要的选项),以及这些选项对从 NDB 集群备份恢复的影响:表 25.24 多个使用 --include-* 选项的 ndb_restore 调用及其在恢复 NDB 集群备份时的效果
Option Result --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
(or--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][,...]]
换句话说,您可以指定以下任意一个进行恢复:
-
从一个或多个数据库中所有表的恢复
-
单个数据库中的一个或多个表的恢复
-
-
Command-Line Format --lines-terminated-by=char
Type 字符串 Default Value \n (linebreak)
指定每行输出的结束字符串。默认为换行字符(
\n
)。 -
Command-Line Format --login-path=path
Type String Default Value [none]
从登录文件中读取给定路径。
-
Command-Line Format --no-login-paths
跳过从登录路径文件中读取选项。
-
Command-Line Format --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在进行损失转换时报告任何数据截断的次数,仅一次地报告每个属性和列。
-
Command-Line Format --no-binlog
此选项防止任何连接的SQL节点将由ndb_restore恢复的数据写入到它们的二进制日志中。
-
Command-Line Format --no-restore-disk-objects
此选项停止ndb_restore从恢复任何NDB集群磁盘数据对象,如表空间和日志文件组;有关这些的更多信息,请参阅第25.6.11节,“NDB集群磁盘数据表”。
-
--no-upgrade
,-u
Command-Line Format --no-upgrade
当使用ndb_restore恢复备份时,
VARCHAR
列使用旧固定格式创建的将被重新调整和重建为现在使用的可变宽度格式。可以通过指定--no-upgrade
来覆盖此行为。 -
Command-Line Format --ndb-connectstring=connection_string
Type 字符串 Default Value [none]
设置连接字符串以连接到ndb_mgmd。语法:
[nodeid=
。覆盖id
;][host=]hostname
[:port
]NDB_CONNECTSTRING
和my.cnf
中的条目。 -
Command-Line Format --ndb-mgm-tls=level
Type 枚举值 Default Value relaxed
Valid Values relaxed
strict
设置连接到管理服务器所需的TLS支持级别;可以是
relaxed
或strict
。relaxed
(默认)意味着尝试建立TLS连接,但成功不必要求;strict
意味着必须使用TLS才能连接。 -
Command-Line Format --ndb-mgmd-host=connection_string
Type 字符串 Default Value [none]
-
--ndb-nodegroup-map
=map
,-z
Command-Line Format --ndb-nodegroup-map=map
任何设置为此选项的值都被忽略,且该选项本身什么也不做。
-
Command-Line Format --ndb-nodeid=#
Type 整数 Default Value [none]
设置节点ID为此节点,覆盖任何由
--ndb-connectstring
设置的ID。 -
--ndb-optimized-node-selection
Command-Line Format --ndb-optimized-node-selection
启用节点选择优化的交易。默认情况下启用;使用
--skip-ndb-optimized-node-selection
禁用。 -
Command-Line Format --ndb-tls-search-path=list
Type 路径名 Default Value (Unix) $HOME/ndb-tls
Default Value (Windows) $HOMEDIR/ndb-tls
指定搜索CA文件的目录列表。Unix平台上,目录名称用冒号(
:
)分隔;Windows系统中使用分号字符(;
)作为分隔符。一个目录引用可以是相对或绝对路径,它可能包含一个或多个环境变量,每个变量由前缀的美元符号($
)表示,并在使用时进行扩展。搜索从左侧命名目录开始,自右向左依次进行,直到找到文件。空字符串表示一个空的搜索路径,这将导致所有搜索失败。一串由单个点(
.
)组成的字符串表示搜索路径仅限于当前工作目录。如果未提供搜索路径,则使用编译时默认值。该值取决于所使用的平台:在Windows上,这是
\ndb-tls
;在其他平台(包括Linux)上,它是$HOME/ndb-tls
。可以通过编译NDB集群时使用-DWITH_NDB_TLS_SEARCH_PATH
来重写此值。 -
Command-Line Format --no-defaults
不从任何选项文件(除了登录文件)中读取默认选项。
-
--nodeid
=#
,-n
Command-Line Format --nodeid=#
Type 数字 Default Value none
指定备份在数据节点上的节点ID;必需。
当恢复到与备份所取的集群中不同数量的数据节点的集群时,这些信息有助于确定正确的文件集合或多个文件集合应被恢复到给定节点。 (在这种情况下,通常需要将多个文件恢复到单个数据节点上。) 请参阅恢复到不同数量的数据节点,了解更多信息和示例。
-
Command-Line Format --num-slices=#
Type 整数 Default Value 1
Minimum Value 1
Maximum Value 1024
当通过切片恢复备份时,此选项设置将备份划分为的切片数。这样可以允
一个切片是备份中的一部分数据;也就是说,它是一个具有相同切片ID的碎片集,使用
--slice-id
选项指定。两个选项必须始终一起使用,并且由--slice-id
设置的值必须始终小于切片数。ndb_restore遇到碎片并为每个碎片分配一个碎片计数器。当通过切片进行恢复时,为每个碎片分配一个切片ID;该切片ID范围从0到1少于切片数。对于不是
BLOB
表的表,确定给定碎片所属的切片使用以下公式:[slice_ID] = [fragment_counter] % [number_of_slices]
对于
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
-
最后,使用以下命令来恢复纪元(epoch):
$> 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核心数、内存量等,也不取决于LDM数量。可以在不同的数据节点上使用不同值的此选项作为恢复的一部分;这样做本身不会产生任何负面影响。
-
-
--parallelism
=#
,-p
Command-Line Format --parallelism=#
Type 数值型 Default Value 128
Minimum Value 1
Maximum Value 1024
ndb_restore使用单行事务来并发地应用许多行。这参数决定了一个
ndb_restore
实例尝试使用的并发事务(并发行)的数量。默认情况下,这是128;最小值为1,最大值为1024。执行插入操作的工作被并行化到涉及到的数据节点中的线程中。这一机制用于从
.Data
文件(即数据的模糊快照)恢复大批量数据;它不用于构建或重建索引。更改日志是串行应用的;索引删除和创建是DDL操作,单独处理。客户端侧没有线程级别并发性。 -
--preserve-trailing-spaces
,-P
Command-Line Format --preserve-trailing-spaces
在提升固定宽度字符数据类型到其变长等价物时,保留尾随空格——也就是说,当提升一个
CHAR
列值到VARCHAR
,或一个BINARY
列值到VARBINARY
时。否则,在将这样的列值插入新列时,尾随空格会从这些列值中丢失。 -
Command-Line Format --print
导致ndb_restore将所有数据、元数据和日志打印到
stdout
。等效于同时使用--print-data
,--print-meta
和--print-log
选项。Note使用
--print
或任何--print_*
选项是进行干运行动的效果。包括一个或多个这些选项会将输出重定向到stdout
;在这种情况下,ndb_restore不会尝试将数据或元数据恢复到NDB集群。 -
Command-Line Format --print-data
原因 ndb_restore 将其输出直接发送到
stdout
。通常与一个或多个--tab
、--fields-enclosed-by
、--fields-optionally-enclosed-by
、--fields-terminated-by
、--hex
和--append
一起使用。TEXT
和BLOB
列值总是被截断。这些值在输出中将被截断到第 256 个字节。这目前无法通过使用--print-data
来重写。 -
Command-Line Format --print-defaults
打印程序参数列表并退出。
-
Command-Line Format --print-log
使ndb_restore输出其日志到
stdout
。 -
Command-Line Format --print-meta
将所有元数据输出到
stdout
。 -
Command-Line Format --print-sql-log
将SQL语句记录到
stdout
。使用该选项可以启用;通常情况下,此行为是禁用的。此选项在尝试记录之前检查是否有所有正在恢复的表都明确定义了主键;只有隐式主键由NDB
实现的表上的查询不能转换为有效SQL。此选项不适用于具有
BLOB
列的表。 -
Command-Line Format --progress-frequency=#
Type 数值 Default Value 0
Minimum Value 0
Maximum Value 65535
在备份进程中每隔
N
秒打印状态报告。默认值为 0(不打印任何状态报告)。最大值为 65535。 -
Command-Line Format --promote-attributes
ndb_restore支持有限的属性提升,与MySQL复制中所支持的一样;也就是说,可以将备份数据从一个给定类型的列恢复到使用一个类似的、更大的类型的列。例如,可以将一个
CHAR(20)
列的数据恢复到一个声明为VARCHAR(20)
、VARCHAR(30)
或CHAR(30)
的列;可以将一个MEDIUMINT
列的数据恢复到一个类型为INT
或BIGINT
的列。请参阅Section 19.5.1.9.2,“Replication of Columns Having Different Data Types”,了解当前支持的类型转换。This option also makes it possible to restore a
NOT NULL
column asNULL
.属性提升由ndb_restore必须显式启用,方法如下:
-
准备要恢复备份的表。ndb_restore不能用来重新创建具有不同定义的表;这意味着您必须要么手动创建表,要么使用
ALTER TABLE
在恢复表元数据后但在恢复数据之前更改要提升的列。 -
使用ndb_restore时,调用带有
--promote-attributes
选项(短形式为-A
)时恢复表数据。属性提升不会发生,如果不使用此选项,则恢复操作将以错误结束。
在将字符数据类型与
TEXT
或BLOB
之间进行转换时,只有在字符类型(CHAR
和VARCHAR
)和二进制类型(BINARY
和VARBINARY
)之间的转换可以同时进行。例如,您不能在同一次调用中将一个INT
列提升到BIGINT
的同时将一个VARCHAR
列提升到TEXT
。在ndb_restore中。在使用不同字符集的
TEXT
列之间进行转换是不可支持的,并且明确禁止。When performing conversions of character or binary types to
TEXT
orBLOB
with ndb_restore, you may notice that it creates and uses one or more staging tables named
. These tables are not needed afterwards, and are normally deleted by ndb_restore following a successful restoration.table_name
$STnode_id
-
-
Command-Line Format --rebuild-indexes
Enable multithreaded rebuilding of the ordered indexes while restoring a native
NDB
backup. The number of threads used for building ordered indexes by ndb_restore with this option is controlled by theBuildIndexThreads
data node configuration parameter and the number of LDMs.在第一次运行ndb_restore时,必须使用此选项;否则,在恢复后重新构建索引时可能会出现唯一约束违规的情况。您应该在插入新行之前使用此选项;否则,有可能在尝试重建索引时插入一行导致唯一约束违规。
默认情况下,使用LDM的数量并行化有序索引的构建。通过设置
BuildIndexThreads
数据节点配置参数,可以加快离线索引构建在节点和系统重新启动期间的速度;该参数对ndb_restore通过在线方式执行的索引删除和重建没有影响。重建唯一索引使用磁盘写入带宽进行重做日志记录和本地检查点。缺乏此带宽可能导致重做缓冲区过载或日志过载错误。在这种情况下,您可以重新运行ndb_restore
--rebuild-indexes
,进程将在错误发生的位置继续执行。您还可以在遇到临时错误时重复执行ndb_restore--rebuild-indexes
,您可能可以通过减少--parallelism
的值来停止这些错误。如果问题是空间不足,您可以增加重做日志的大小(FragmentLogFileSize
节点配置参数),或者您可以增加LCP执行速度(MaxDiskWriteSpeed
和相关参数),以更快地释放空间。 -
--remap-column=
db
.tbl
.col
:fn
:args
Command-Line Format --remap-column=string
Type 字符串 Default Value [none]
当与
--restore-data
一起使用时,此选项将函数应用于指定列的值。参数字符串中的值列表如下:-
db
: 数据库名称,遵循--rewrite-database
执行的任何重命名。 -
tbl
: 表名称。 -
fn
: 函数名称;目前,只支持的唯一名称是offset
。 -
args
: 函数接受的参数。目前,只支持一个参数,即要由offset
函数添加的偏移量大小。负值也是支持的。传递给offset
函数的参数的大小不能超过列类型的有符号变体的大小;例如,如果col
是一个INT
列,那么传递给offset
函数的参数的允许范围是-2147483648
到2147483647
(请参阅Section 13.1.2,“整数类型(精确值)- INTEGER,INT,小整数,微小整数,大整数”)。如果将偏移量应用于列会导致溢出或下溢,则恢复操作失败。这可能发生在以下情况下:例如,如果列是BIGINT
,并且选项尝试将偏移量值 8 应用于行,其中列值为 4294967291,因为4294967291 + 8 = 4294967299 > 4294967295
。如果应用偏移量到列会导致溢出或下溢,则恢复操作失败。例如,如果列是
BIGINT
,并且选项尝试将偏移量值 8 应用于行,其中列值为 4294967291,因为4294967291 + 8 = 4294967299 > 4294967295
。
这个选项可以在合并多个源实例的NDB集群(所有使用相同架构)中的数据到一个单一目标NDB集群时非常有用,使用NDB本地备份(请参阅第25.6.8.2节,“使用NDB集群管理客户端创建备份”)和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集群实例中,合并到未合并表中的更改或从未合并表合并到已合并表的更改不受支持。
-
-
Command-Line Format --restore-data
输出
NDB
表数据和日志。 -
--restore-epoch
,-e
Command-Line Format --restore-epoch
添加(或恢复)集群复制状态表的纪元信息。这对于在NDB Cluster副本上启动复制非常有用。当使用此选项时,如果已存在具有
0
值的id
列的行,则会更新或插入该行(参见Section 25.7.9,“NDB Cluster Backups With NDB Cluster Replication”)。 -
--restore-meta
,-m
Command-Line Format --restore-meta
此选项使ndb_restore打印
NDB
表元数据。第一次运行ndb_restore恢复程序时,还需要还原元数据。换句话说,您必须重新创建数据库表——这可以通过运行它来完成,带有
--restore-meta
(-m
)选项。这只需在单个数据节点上还原元数据即可;这足以将其恢复到整个集群中。ndb_restore使用目标集群的默认分区数,除非更改了本地数据管理器线程的数量,这与原始集群中的数据节点相同。
在使用此选项时,建议禁用自动同步设置
ndb_metadata_check=OFF
直到ndb_restore完成还原元数据后再启用它,以同步NDB字典中新创建的对象。Note集群应在开始恢复备份时为空数据库。(换句话说,您应该使用
--initial
启动数据节点,然后执行还原。) -
Command-Line Format --restore-privilege-tables
Deprecated 是 不再使用。
-
--rewrite-database
=olddb,newdb
Command-Line Format --rewrite-database=string
Type 字符串 Default Value none
该选项使得可以将备份恢复到具有不同名称的数据库。例如,如果对一个名为
products
的数据库进行备份,您可以将其中包含的数据恢复到一个名为inventory
的数据库,使用如下方式(省略其他可能需要的选项):$> ndb_restore --rewrite-database=product,inventory
该选项可以在单次调用ndb_restore中多次使用。因此,可以同时从数据库名为
db1
的数据库恢复到数据库名为db2
的数据库,并从数据库名为db3
的数据库恢复到一个名为db4
的数据库,使用--rewrite-database=db1,db2 --rewrite-database=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
。Important在使用
--rewrite-database
将多个备份数据库还原到单个目标数据库时,不会检查表或其他对象名称之间的冲突,并且恢复行的顺序不保证。这意味着在这种情况下,可能会覆盖行并丢失更新。 -
Command-Line Format --skip-broken-objects
此选项会导致 ndb_restore 忽略损坏的表格在读取一个本地
NDB
备份时,并继续还原任何剩余的表格(即使它们也损坏)。目前,--skip-broken-objects
选项只在缺少 blob parts 表格的情况下有效。 -
Command-Line Format --skip-table-check
可以在不还原表格元数据的情况下恢复数据。默认情况下,当这样做时, ndb_restore 会在发现表格数据和表格架构之间的不匹配时失败;此选项会覆盖该行为。
当使用ndb_restore恢复数据时,一些列定义不匹配的限制被放宽;当遇到这些类型的不匹配之一时,ndb_restore不会像以前那样停止并产生错误,而是接受数据,并将其插入目标表,同时向用户发出警告。这一行为无论是否使用选项
--skip-table-check
或--promote-attributes
。这些列定义的不同之处如下所示:-
不同的
COLUMN_FORMAT
设置(FIXED
,DYNAMIC
,DEFAULT
) -
不同的
STORAGE
设置(MEMORY
,DISK
) -
不同的默认值
-
不同的分布式键设置
-
-
Command-Line Format --skip-unknown-objects
此选项使ndb_restore在读取本地
NDB
备份时忽略它不认识的任何架构对象。这可以用于从运行(例如)NDB 7.6的集群恢复到运行NDB Cluster 7.5的备份。 -
Command-Line Format --slice-id=#
Type Integer Default Value 0
Minimum Value 0
Maximum Value 1023
当按切片恢复时,这就是要恢复的切片的 ID。此选项始终与
--num-slices
一起使用,并且其值必须始终小于--num-slices
的值。有关更多信息,请参阅本节其他位置对
--num-slices
的描述。 -
--tab
=dir_name
,-T
dir_name
Command-Line Format --tab=path
Type Directory name 使
--print-data
创建转储档案,一个每个表,每个命名为
。它需要其参数是要保存文件的目录路径;使用tbl_name
.txt.
表示当前目录。 -
Command-Line Format --timestamp-printouts{=true|false}
Type 布尔值 Default Value true
使讯息、错误和调试日志讯息前置时间戳。
此选项默认启用。使用
--timestamp-printouts=false
禁用它。 -
Command-Line Format --usage
显示帮助文本并退出;与
--help
相同。 -
Command-Line Format --verbose=#
Type 数值 Default Value 1
Minimum Value 0
Maximum Value 255
设置输出的详细程度。最小值为0;最大值为255。默认值为1。
-
Command-Line Format --version
显示版本信息并退出。
-
Command-Line Format --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
选项之后使用ndb_restore--restore-epoch
。您还可以与ndb_restore--with-apply-status
选项用于恢复集群的最后一个调用中使用的ndb_restore--with-apply-status
选项一起使用的--restore-epoch
。有关更多信息,请参阅ndb_apply_status Table。
此实用程序的典型选项如下所示:
ndb_restore [-c connection_string] -n node_id -b backup_id \
[-m] -r --backup-path=/path/to/backup/files
通常,在从NDB集群备份中恢复时,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 节点运行,因此需要与集群管理服务器建立一个空闲的连接“slot”。这意味着必须在集群 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
管理客户端命令的文档,以获取创建加密备份的信息。
您可以使用ndb_restore连接到集群的验证方法是,在SHOW
命令中使用ndb_mgm管理客户端。您还可以从系统shell中执行此操作,如下所示:
$> ndb_mgm -e "SHOW"
Error reporting. ndb_restore 报告了临时和永久错误。在临时错误的情况下,它可能能够从中恢复,并报告 Restore successful, but encountered temporary error, please look at configuration
的情况。
使用 ndb_restore 初始化一个用于循环复制的 NDB 集群后,SQL 节点作为副本的二进制日志不会自动创建,并且必须手动创建。要使二进制日志被创建,请在运行 START REPLICA
之前,在该 SQL 节点上发出一个 SHOW TABLES
语句。这是 NDB 集群的一个已知问题。