Documentation Home
MySQL 8.3 Reference Manual
Related Documentation Download this Manual
PDF (US Ltr) - 40.8Mb
PDF (A4) - 40.9Mb
Man Pages (TGZ) - 294.0Kb
Man Pages (Zip) - 409.0Kb
Info (Gzip) - 4.0Mb
Info (Zip) - 4.0Mb
Excerpts from this Manual

MySQL 8.3 Reference Manual  /  ...  /  NDB Cluster Backups With NDB Cluster Replication

25.7.9 NDB 集群备份与 NDB 集群复制

本节讨论使用 NDB 集群复制进行备份和恢复。我们假设复制服务器已经按照之前的配置(见 第 25.7.5 节,“为复制准备 NDB 集群”,以及随后的章节)。这样做过后,备份和恢复的过程如下所示:

  1. 有两种不同的方法来启动备份。

    • 方法 A.  这种方法需要在源服务器上启用集群备份过程,以便在启动复制过程之前。这可以通过在 my.cnf 文件的 [mysql_cluster] 部分中添加以下行来实现,其中 management_host 是源集群的 NDB 管理服务器的 IP 地址或主机名,port 是管理服务器的端口号:

      ndb-connectstring=management_host[:port]
      Note

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

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

      shellS> ndb_mgm -e "START BACKUP"
    • 方法 B.  如果 my.cnf 文件没有指定管理主机的位置,可以通过将管理主机信息作为 NDB 管理客户端的一部分来启动备份过程。这可以按照以下方式完成,其中 management_hostport 是管理服务器的主机名和端口号:

      shellS> ndb_mgm management_host:port -e "START BACKUP"

      在我们的场景中(见 第 25.7.5 节,“为复制准备 NDB 集群”),这将按照以下方式执行:

      shellS> ndb_mgm rep-source:1186 -e "START BACKUP"
  2. 将集群备份文件复制到要上线的副本中。每个运行 ndbd 进程的系统都有集群备份文件,所有 这些文件都必须复制到副本,以确保成功恢复。备份文件可以复制到副本管理主机所在的计算机上的任何目录中,只要 MySQL 和 NDB 二进制文件在该目录中具有读取权限。在这种情况下,我们假设这些文件已经复制到目录 /var/BACKUPS/BACKUP-1 中。

    虽然副本集群不需要与源集群具有相同数量的数据节点,但强烈建议这样做。它 必要的,防止复制过程在副本服务器启动时启动。你可以通过使用 --skip-replica-start 来实现。

  3. 在副本集群上创建与源集群相同的数据库,以便复制。

    Important

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

  4. 使用以下语句在 mysql 客户端中重置副本集群:

    mysqlR> RESET REPLICA;
  5. 现在,您可以在副本上启动集群恢复过程,使用 ndb_restore 命令对每个备份文件进行处理。对于第一个备份文件,需要包含 -m 选项以恢复集群元数据,如下所示:

    shellR> ndb_restore -c replica_host:port -n node-id \
            -b backup-id -m -r dir

    dir 是副本上备份文件所在的目录路径。对于剩余的备份文件,ndb_restore 命令不应使用 -m 选项。

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

    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_status 表中。否则,副本无法与源正确同步。(见 第 25.5.23 节“ndb_restore — Restore an NDB Cluster Backup”。)

  6. 现在,您需要从副本的 ndb_apply_status 表中获取最新的时期(如 第 25.7.8 节“使用 NDB 集群复制实现故障转移” 中所讨论的那样):

    mysqlR> SELECT @latest:=MAX(epoch)
            FROM mysql.ndb_apply_status;
  7. 使用在前一步骤中获取的时期值 @latest,您可以从源的 mysql.ndb_binlog_index 表中获取正确的起始位置 @pos 在正确的二进制日志文件 @file 中。该查询从最后一个应用的时期之前的逻辑恢复位置获取这些信息:

    mysqlS> SELECT
         ->     @file:=SUBSTRING_INDEX(File, '/', -1),
         ->     @pos:=Position
         -> FROM mysql.ndb_binlog_index
         -> WHERE epoch > @latest
         -> ORDER BY epoch ASC LIMIT 1;

    如果当前没有复制流量,您可以通过在源上运行 SHOW BINARY LOG STATUS 并使用输出中的 Position 列的值来获取类似信息。在这种情况下,您必须确定哪个文件具有最大的文件名后缀,并手动或使用脚本解析输出来提供名称。

  8. 使用前一步骤中获取的值,现在您可以在副本的 mysql 客户端中发出适当的 CHANGE REPLICATION SOURCE TO 语句:

    mysqlR> CHANGE REPLICATION SOURCE TO
         ->     SOURCE_LOG_FILE='@file',
         ->     SOURCE_LOG_POS=@pos;
  9. 现在,副本知道从哪个二进制日志文件的哪个位置开始读取数据来自源,您可以使用以下语句使副本开始复制:

    mysqlR> START REPLICA;

要在第二个复制通道上执行备份和恢复,只需重复这些步骤,使用次要源和副本服务器的主机名和 ID 替换主要源和副本服务器的主机名和 ID,并在它们上运行前面的语句。

有关执行集群备份和从备份恢复集群的更多信息,请参阅 第 25.6.8 节“NDB 集群在线备份”