可以从 NDB 备份恢复到具有与从中获取备份的原始数据节点数量不同的数据节点的集群。以下两节分别讨论目标集群的数据节点数少于或多于备份源的情况。
如果较大的节点数是较小的节点数的偶数倍,则可以恢复到数据节点数少于原始数据节点的集群。在以下示例中,我们使用在具有四个数据节点的集群上对具有两个数据节点的集群进行的备份。
原始集群的管理服务器位于 host 上
host10
。原始集群有四个数据节点,节点 ID 和主机名显示在管理服务器文件的以下摘录中config.ini
:[ndbd] NodeId=2 HostName=host2 [ndbd] NodeId=4 HostName=host4 [ndbd] NodeId=6 HostName=host6 [ndbd] NodeId=8 HostName=host8
我们假设每个数据节点最初都是使用ndbmtd
--ndb-connectstring=host10
或等效的启动的。以正常方式执行备份。有关如何执行此操作的信息, 请参阅 第 18.6.8.2 节,“使用 NDB Cluster Management Client 创建备份” 。
这里列出了备份在每个数据节点上创建的文件,其中
N
是节点ID,B
是备份ID。BACKUP-
B
-0.N
.DataBACKUP-
B
.N
.ctlBACKUP-
B
.N
.log
这些文件 位于每个数据节点的 , 下。对于此示例的其余部分,我们假设备份 ID 为 1。
BackupDataDir
/BACKUP/BACKUP-
B
让所有这些文件可供以后复制到新的数据节点(在数据节点的本地文件系统上可以通过 ndb_restore访问它们)。将它们全部复制到一个位置是最简单的;我们假设这就是您所做的。
目标集群的管理服务器在主机上
host20
,目标有两个数据节点,显示了节点 ID 和主机名,来自管理服务器config.ini
文件host20
:[ndbd] NodeId=3 hostname=host3 [ndbd] NodeId=5 hostname=host5
每个数据节点进程
host3
都host5
应该以ndbmtd-c host20
--initial
或等效的方式启动,以便新的(目标)集群以干净的数据节点文件系统启动。将两组不同的两个备份文件复制到每个目标数据节点。对于此示例,将原始集群中节点 2 和 4 的备份文件复制到目标集群中的节点 3。这些文件在此处列出:
BACKUP-1-0.2.Data
BACKUP-1.2.ctl
BACKUP-1.2.log
BACKUP-1-0.4.Data
BACKUP-1.4.ctl
BACKUP-1.4.log
然后将节点6和8的备份文件复制到节点5;这些文件显示在以下列表中:
BACKUP-1-0.6.Data
BACKUP-1.6.ctl
BACKUP-1.6.log
BACKUP-1-0.8.Data
BACKUP-1.8.ctl
BACKUP-1.8.log
对于此示例的其余部分,我们假设相应的备份文件已保存到
/BACKUP-1
节点 3 和 5 中每个节点上的目录中。在两个目标数据节点中的每一个上,您都必须从两组备份中恢复。首先,通过调用ndb_restore on 将节点 2 和 4 的备份恢复到节点 3,
host3
如下所示:$> ndb_restore -c host20 --nodeid=2 --backupid=1 --restore-data --backup-path=/BACKUP-1 $> ndb_restore -c host20 --nodeid=4 --backupid=1 --restore-data --backup-path=/BACKUP-1
然后通过调用ndb_restore on 将节点 6 和 8 的备份恢复到节点 5
host5
,如下所示:$> ndb_restore -c host20 --nodeid=6 --backupid=1 --restore-data --backup-path=/BACKUP-1 $> ndb_restore -c host20 --nodeid=8 --backupid=1 --restore-data --backup-path=/BACKUP-1
为给定的ndb_restore命令 指定的节点 ID 是原始备份中的节点的 ID,而不是要将其还原到的数据节点的 ID。当使用本节中描述的方法执行备份时,ndb_restore 连接到管理服务器并获取备份正在恢复到的集群中的数据节点列表。恢复后的数据进行相应的分布,使得在执行备份时不需要知道或计算目标集群中的节点数。
当更改每个节点组的 LCP 线程或 LQH 线程总数时,您应该从使用mysqldump创建的备份重新创建模式。
创建数据的备份。您可以通过从系统 shell 调用ndb_mgm 客户端
START BACKUP
命令来执行此操作,如下所示:$> ndb_mgm -e "START BACKUP 1"
这假定所需的备份 ID 为 1。
创建模式的备份(另见下文):
$> mysqldump --no-data --routines --events --triggers --databases > myschema.sql
重要的您不得在第一步和第二步之间进行任何架构更改。
将上面的备份目录复制到新集群。例如,如果要还原的备份的 ID 为 1 和
BackupDataDir
= ,则此节点上备份的路径为 。在这个目录中有三个文件,列在这里:/backups/node_
nodeid
/backups/node_1/BACKUP/BACKUP-1
BACKUP-1-0.1.Data
BACKUP-1.1.ctl
BACKUP-1.1.log
您应该将整个目录复制到新节点。
不需要从一个或多个特定节点恢复备份。
要从刚刚创建的备份中恢复,请执行以下步骤:
还原架构。使用mysql客户端导入架构文件,如下所示:
$> mysql < myschema.sql
恢复数据。以下命令可以并行运行:
ndb_restore --nodeid=1 --backupid=1 --restore-data --backup-path=/backups/node_1/BACKUP/BACKUP-1 --disable-indexes ndb_restore --nodeid=2 --backupid=1 --restore-data --backup-path=/backups/node_2/BACKUP/BACKUP-1 --disable-indexes ndb_restore --nodeid=3 --backupid=1 --restore-data --backup-path=/backups/node_3/BACKUP/BACKUP-1 --disable-indexes ndb_restore --nodeid=4 --backupid=1 --restore-data --backup-path=/backups/node_4/BACKUP/BACKUP-1 --disable-indexes ndb_restore --nodeid=5 --backupid=1 --restore-data --backup-path=/backups/node_5/BACKUP/BACKUP-1 --disable-indexes ndb_restore --nodeid=6 --backupid=1 --restore-data --backup-path=/backups/node_6/BACKUP/BACKUP-1 --disable-indexes ndb_restore --nodeid=7 --backupid=1 --restore-data --backup-path=/backups/node_7/BACKUP/BACKUP-1 --disable-indexes ndb_restore --nodeid=8 --backupid=1 --restore-data --backup-path=/backups/node_8/BACKUP/BACKUP-1 --disable-indexes
根据需要添加
--ndb-connectstring
选项。例如,如果您在 3. 中将备份从 节点 ID 为 1 和 2 的“旧”节点复制到节点 ID 为 1 的“新”节点,则您应该在 具有 的 新节点上执行两次ndb_restore调用1 作为其节点 ID。
--nodeid=1
--nodeid=2
重建索引。这些已被
--disable-indexes
刚才显示的命令中使用的选项禁用。重新创建索引可以避免由于恢复在所有点上都不一致而导致的错误。在某些情况下,重建索引还可以提高性能。要重建索引,请在单个节点上执行一次以下命令:$> ndb_restore --nodeid=1 --backupid=1 --backup-path=/backups/node_1/BACKUP/BACKUP-1 --rebuild-indexes
您应该知道,每个表中支持的分区数取决于集群中数据节点、节点组和 LDM 线程的数量。在其他条件(例如 、
MaxNoOfExecutionThreads
、
ThreadConfig
等
的值NoOfReplicas
)相同的情况下,具有(例如)两个数据节点的集群比具有八个数据节点的集群支持更少的分区。这意味着使用
ndb_restore
--restore-meta
来恢复模式并不总是有效,因为这会恢复给定的表,其分区数与原始表中的分区数相同;从由mysqldump — 如前所示的示例 — 当恢复到具有比原始集群中使用的数据节点和/或 LDM 线程更少的集群时。
在恢复到较小的集群时支持较少的分区也意味着每个表的最大行数较低。