21.6.9 具有 NDB 群集复制的 NDB 群集备份

本节讨论使用 NDB 群集复制进行备份并从中还原。我们假定复制服务器已按照前面所述进行配置(请参阅第 21.6.5 节“准备要复制的 NDB 群集”以及紧随其后的部分)。完成此操作后,进行备份然后从中还原的过程如下:

  • 可以通过两种不同的方法启动备份。

  • 方法 A. 此方法要求在开始复制过程之前,先前已在源服务器上启用了集群备份过程。可以通过在my.cnf file[mysql_cluster]部分中包含以下行来完成此操作,其中* management_host 是源集群的NDBManagement 服务器的 IP 地址或主机名, port *是 Management 服务器的端口号:

ndb-connectstring=management_host[:port]

Note

仅当未使用默认端口(1186)时才需要指定端口号。有关 NDB 群集中的端口和端口分配的更多信息,请参见第 21.2.5 节“ NDB 群集的初始配置”

在这种情况下,可以通过在复制源上执行以下语句来启动备份:

shellS> ndb_mgm -e "START BACKUP"
  • 方法 B. 如果my.cnf文件未指定在何处找到 Management 主机,则可以通过将此信息作为START BACKUP命令的一部分传递给NDBManagementClient 端来启动备份过程。可以按如下所示进行操作,其中* management_host port *是 Management 服务器的主机名和端口号:
shellS> ndb_mgm management_host:port -e "START BACKUP"

在前面概述的场景中(请参见第 21.6.5 节“准备要复制的 NDB 群集”),将按以下方式执行:

shellS> ndb_mgm rep-source:1186 -e "START BACKUP"
  • 将群集备份文件复制到联机副本。为源集群运行ndbd进程的每个系统上都将具有集群备份文件,并且这些文件的“所有”都必须复制到副本,以确保成功还原。可以将备份文件复制到副本 Management 主机所在计算机上的任何目录中,只要 MySQL 和 NDB 二进制文件对该目录具有读取权限即可。在这种情况下,我们假定这些文件已复制到目录/var/BACKUPS/BACKUP-1

尽管副本群集不必与源具有相同数量的ndbd进程(数据节点),但强烈建议此数目相同。必需使用--skip-slave-start选项启动副本,以防止复制过程过早启动。

  • 在副本群集上创建源群集上存在且要复制的任何数据库。

Important

必须在副本群集中的每个 SQL 节点上执行与要复制的每个数据库相对应的CREATE DATABASE(或CREATE SCHEMA)语句。

  • mysqlClient 端中使用以下语句重置副本集群:
mysqlR> RESET SLAVE;
  • 现在,您可以依次使用ndb_restore命令对每个备份文件在副本上启动群集还原过程。对于其中的第一个,必须包含-m选项以还原群集元数据,如下所示:
shellR> ndb_restore -c replica_host:port -n node-id \
        -b backup-id -m -r dir
  • dir 是备份文件已放置在副本上的目录的路径。对于与其余备份文件相对应的ndb_restore命令,应不*使用-m选项。

要从具有四个数据节点(如第 21.6 节“ NDB 群集复制”的图所示)的源集群中还原,备份文件已被复制到目录/var/BACKUPS/BACKUP-1,则在副本上执行的命令的正确 Sequences 可能如下所示:

shellR> ndb_restore -c replica-host:1186 -n 2 -b 1 -m \
        -r ./var/BACKUPS/BACKUP-1
shellR> ndb_restore -c replica-host:1186 -n 3 -b 1 \
        -r ./var/BACKUPS/BACKUP-1
shellR> ndb_restore -c replica-host:1186 -n 4 -b 1 \
        -r ./var/BACKUPS/BACKUP-1
shellR> ndb_restore -c replica-host:1186 -n 5 -b 1 -e \
        -r ./var/BACKUPS/BACKUP-1

Important

在此示例中,最终调用ndb_restore时需要使用-e(或--restore-epoch)选项,以确保将纪元写入副本的mysql.ndb_apply_statustable 中。没有此信息,副本将无法与源正确同步。 (请参见第 21.4.24 节“ ndb_restore-还原 NDB 群集备份”。)

mysqlR> SELECT @latest:=MAX(epoch)
        FROM mysql.ndb_apply_status;
  • 使用@latest作为上一步中获得的纪元值,您可以使用下面显示的查询从源的mysql.ndb_binlog_indextable 中获取正确的二进制日志文件@file中的正确起始位置@pos
mysqlS> SELECT
     ->     @file:=SUBSTRING_INDEX(File, '/', -1),
     ->     @pos:=Position
     -> FROM mysql.ndb_binlog_index
     -> WHERE epoch >= @latest
     -> ORDER BY epoch ASC LIMIT 1;

如果当前没有复制流量,则可以通过在源上运行显示主状态并使用该文件的名称后缀名最大的值在显示的所有文件中使用该文件的输出Position列中显示的值来获取此信息。在File列中。在这种情况下,您必须确定这是哪个文件,并在下一步中手动或通过使用脚本解析输出来提供名称。

  • 使用上一步中获得的值,您现在可以在副本的mysqlClient 端中发出适当的更改为主语句:
mysqlR> CHANGE MASTER TO
     ->     MASTER_LOG_FILE='@file',
     ->     MASTER_LOG_POS=@pos;
  • 现在,副本知道从哪个点开始从源读取数据的二进制日志文件,您可以使用以下语句使副本开始复制:
mysqlR> START SLAVE;

要在第二个复制通道上执行备份和还原,仅需要重复这些步骤,在适当的情况下将辅助源和副本的主机名和 ID 替换为主源服务器和副本服务器的主机名和 ID,并运行前面的语句在他们。

有关执行群集备份和从备份还原群集的其他信息,请参阅第 21.5.8 节“ NDB 群集的在线备份”