4.6.2.5 恢复备份到数据节点较少的集群

有时,您希望将数据从您的集群传输到另一个数据节点较少的集群——例如,当您想要缩减集群或为复制设置准备一个较小的副本集群时。虽然第 4.6.2 节“使用 MySQL Cluster Manager 进行基本 MySQL NDB Cluster 备份和恢复”中描述的方法 在这种情况下不起作用,但您可以仅使用backup cluster 命令和ndb_restore程序来执行传输。

该过程首先使用backup cluster命令为原始集群创建备份。接下来,使用命令创建一个具有较少数据节点的新集群create cluster。在传输 NDB 表数据之前,必须首先将 NDB 表的元数据恢复到新集群。该backup cluster命令还为导航台表的元数据创建逻辑备份(有关详细信息,请参阅 导航台表元数据的逻辑备份)。将--all 选项与list backups 命令一起使用以列出所有备份,包括 NDB 表元数据的逻辑备份,这些备份由注释 Schema标记:

mcm> list backups --all mycluster;
+----------+--------+---------+----------------------+------+--------+
| BackupId | NodeId | Host    | Timestamp            | Part |Comment |
+----------+--------+---------+----------------------+------+--------+
| 1        | 1      | tonfisk | 2020-09-21 21:13:09Z | 1    |        |
| 1        | 2      | tonfisk | 2020-09-21 21:13:09Z | 1    |        |
| 1        | 3      | tonfisk | 2020-09-21 21:13:09Z | 1    |        |
| 1        | 4      | tonfisk | 2020-09-21 21:13:09Z | 1    |        |
| 1        | 50     | tonfisk | 2020-09-21 21:13:12Z |      | Schema |
| 2        | 1      | tonfisk | 2020-09-21 21:17:50Z | 1    |        |
| 2        | 2      | tonfisk | 2020-09-21 21:17:50Z | 1    |        |
| 2        | 3      | tonfisk | 2020-09-21 21:17:50Z | 1    |        |
| 2        | 4      | tonfisk | 2020-09-21 21:17:50Z | 1    |        |
| 2        | 50     | tonfisk | 2020-09-21 21:17:52Z |      | Schema |
+----------+--------+---------+----------------------+------+--------+
10 rows in set (0.01 sec)

接下来,我们要找出逻辑备份文件的位置,以及原集群每个数据节点的备份文件的位置。

备份文件的位置。  每个节点的备份文件将在 BackupDataDir数据节点的集群参数和 mysqldbackupdatadir节点的参数指定 的文件夹下找到。因为该 命令不区分大小写,所以您可以使用这条命令来检查两个参数的值: get

mcm> get BackupDataDir mycluster;
+---------------+----------------+----------+---------+----------+---------+---------+----------+
| Name          | Value          | Process1 | NodeId1 | Process2 | NodeId2 | Level   | Comment  |
+---------------+----------------+----------+---------+----------+---------+---------+----------+
| BackupDataDir | /opt/mcmbackup | ndbmtd   | 1       |          |         | Process |          |
| BackupDataDir | /opt/mcmbackup | ndbmtd   | 2       |          |         | Process |          |
| BackupDataDir | /opt/mcmbackup | ndbmtd   | 3       |          |         | Process |          |
| BackupDataDir | /opt/mcmbackup | ndbmtd   | 4       |          |         | Process |          |
| backupdatadir | /opt/mcmbackup | mysqld   | 50      |          |         | Process | MCM only |
+---------------+----------------+----------+---------+----------+---------+---------+----------+
5 rows in set (0.18 sec)

特定 BackupID 的每个备份的备份文件在 每个数据节点下 和每个mysqld节点下找到。 参数返回行中 的表示 仅供 MySQL Cluster Manager 使用,它指定的目录仅包含 NDB 表元数据的备份。请注意,如果 未指定,则该命令不会为其返回任何值,并且会占用 的值 ,因此图像将存储在目录中 。如果BackupDataDir/BACKUP/BACKUP-ID/backupdatadir/BACKUP/BACKUP-ID/ comment MCM onlybackupdatadirbackupdatadirBackupDataDirgetDataDirDatadir/BACKUP/BACKUP-backup_idbackupdatadir未指定,该get命令将再次不返回任何值, mysqld节点的逻辑备份文件将在默认位置找到 。 /path-to-mcm-data-repository/clusters/clustername/nodeid/BACKUP/BACKUP-Id

将备份数据从原始集群恢复到新集群的过程包括以下步骤:

  1. 停止原来的集群:

    mcm> stop cluster mycluster;
    +------------------------------+
    | Command result               |
    +------------------------------+
    | Cluster stopped successfully |
    +------------------------------+
    1 row in set (19.54 sec)
    
    mcm> show status mycluster;
    +-----------+---------+---------+
    | Cluster   | Status  | Comment |
    +-----------+---------+---------+
    | mycluster | stopped |         |
    +-----------+---------+---------+
    1 row in set (0.05 sec)
  2. 启动新集群。确保新集群可以运行,并且它至少有一个空闲 ndbapi插槽供 ndb_restore实用程序连接到集群:

    mcm> start cluster newcluster2nodes;
    +------------------------------+
    | Command result               |
    +------------------------------+
    | Cluster started successfully |
    +------------------------------+
    1 row in set (33.68 sec)
    
    mcm> show status -r newcluster2nodes;
    +--------+----------+---------+---------+-----------+-----------+
    | NodeId | Process  | Host    | Status  | Nodegroup | Package   |
    +--------+----------+---------+---------+-----------+-----------+
    | 49     | ndb_mgmd | tonfisk | running |           | mypackage |
    | 1      | ndbmtd   | tonfisk | running | 0         | mypackage |
    | 2      | ndbmtd   | tonfisk | running | 0         | mypackage |
    | 50     | mysqld   | tonfisk | running |           | mypackage |
    | 51     | ndbapi   | *       | added   |           |           |
    +--------+----------+---------+---------+-----------+-----------+
    5 rows in set (0.09 sec)
  3. 将 NDB 表的元数据的逻辑备份还原到新集群上。有关还原逻辑备份的不同方法,请参阅 重新加载 SQL 格式的备份。一种方法是打开一个mysql客户端,将其连接到集群的一个 mysqld节点,然后使用 mysql客户端获取逻辑备份文件:

    mysql> source path-to-logical-backup-file/BACKUP-BackupID.mysqld_nodeid.schema.sql

    有关如何查找逻辑备份文件的路径, 请参阅上面的备份文件位置。对于我们的示例集群,这就是使用 BackupID 2 从备份中恢复 NDB 表元数据的命令:

    mysql> source /opt/mcmbackup/BACKUP/BACKUP-2/BACKUP-2.50.schema.sql
  4. 使用ndb_restore程序 将原集群每个数据节点的备份一一还原到新集群 :

    $> ndb_restore -b BackupID -n nodeID -r --backup_path=backup-folder-for-data_node

    有关如何查找数据节点备份文件的路径, 请参阅上面的备份文件的位置。对于我们的示例集群,要从 BackupID 为 2 的数据节点 1 到 4 的备份中恢复数据 mycluster,请执行以下命令:

    $> ndb_restore --backupid=2 --nodeid=1 --restore_data --backup_path=/opt/mcmbackup/BACKUP/BACKUP-2/ --disable-indexes
    $> ndb_restore --backupid=2 --nodeid=2 --restore_data --backup_path=/opt/mcmbackup/BACKUP/BACKUP-2/ --disable-indexes
    $> ndb_restore --backupid=2 --nodeid=3 --restore_data --backup_path=/opt/mcmbackup/BACKUP/BACKUP-2/ --disable-indexes
    $> ndb_restore --backupid=2 --nodeid=4 --restore_data --backup_path=/opt/mcmbackup/BACKUP/BACKUP-2/ --disable-indexes

    使用该选项 --disable-indexes以便在恢复期间忽略索引。这是因为如果我们还尝试逐个节点地恢复索引,它们可能无法以正确的顺序恢复,以使外键和唯一键约束正常工作。因此, --disable-indexes 在上述命令中使用了该选项,执行后我们使用以下 ndb_restore命令和 --rebuild-indexes 选项重建索引(您只需要在其中一个数据节点上运行它):

    $> ndb_restore --backupid=2 --nodeid=1 --rebuild-indexes --backup_path=/opt/mcmbackup/BACKUP/BACKUP-2/

数据和索引现已完全恢复到新集群。