Documentation Home
MySQL 8.4 Reference Manual
Related Documentation Download this Manual
PDF (US Ltr) - 39.8Mb
PDF (A4) - 39.9Mb
Man Pages (TGZ) - 257.9Kb
Man Pages (Zip) - 364.9Kb
Info (Gzip) - 4.0Mb
Info (Zip) - 4.0Mb


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

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

本节讨论使用NDB 集群复制进行备份和恢复。我们假设复制服务器已经配置好了,前提是之前已经按照既定的步骤进行了配置(见第25.7.5节,“为复制准备NDB 集群”,以及紧随其后的部分)。配置完成后,进行备份并从中恢复的步骤如下:

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

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

      ndb-connectstring=management_host[:port]
      Note

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

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

      shellS> ndb_mgm -e "START BACKUP"
    • 方法B.  如果 my. cnf 文件没有指定管理主机的位置,您可以将此信息传递给 NDB 管理客户端作为 START BACKUP 命令的一部分。这可以按以下方式完成,其中 management_主机端口 是管理服务器的主机名和端口号码:

      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)选项是必需的,以确保(epoch)写入副本的mysql.ndb_apply_status表中。没有这方面的信息,副本就无法与源同步。(参见第25.5.23节,“ndb_restore — Restore an NDB Cluster Backup”。)

  6. 现在,您需要从副本的ndb_apply_status表中获取最新的(epoch)值(如第25.7.8节,“Implementing Failover with NDB Cluster Replication”所讨论的那样):

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

    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集群在线备份”