#### 23.5.23.2 恢复到不同数量的数据节点

可以从 NDB 备份还原到具有与从中进行备份的原始数据节点不同数量的数据节点的集群。以下两节分别讨论目标集群的数据节点数少于或多于备份源的情况。

##### 23.5.23.2.1 恢复到比原来更少的节点

您可以恢复到数据节点少于原始数据节点的集群，前提是较大的节点数是较小节点数的偶数倍。在以下示例中，我们使用在具有四个数据节点的集群上进行的备份到具有两个数据节点的集群。

1.  原始集群的管理服务器在主机上`主机10`.原始集群有四个数据节点，节点 ID 和主机名显示在管理服务器的以下摘录中`配置文件`文件：

    ```
    [ndbd]
    NodeId=2
    HostName=host2

    [ndbd]
    NodeId=4
    HostName=host4

    [ndbd]
    NodeId=6
    HostName=host6

    [ndbd]
    NodeId=8
    HostName=host8
    ```

    我们假设每个数据节点最初是从[**ndbmtd**](mysql-cluster-programs-ndbmtd.html) [`--ndb-connectstring=host10`](mysql-cluster-programs-ndbd.html#option_ndbd_ndb-connectstring)或等价物。

2.  以正常方式执行备份。看[第 23.6.8.2 节，“使用 NDB Cluster Management Client 创建备份”](mysql-cluster-backup-using-management-client.html), 有关如何执行此操作的信息。

3.  此处列出了每个数据节点上的备份创建的文件，其中*`ñ`*是节点 ID 和*`乙`*是备份 ID。

    -   `备份-*`乙`*-0.*`ñ`*。数据`

    -   `备份-*`乙`*.*`ñ`*.ctl`

    -   `备份-*`乙`*.*`ñ`*。日志`

        这些文件位于[`备份数据目录`](mysql-cluster-ndbd-definition.html#ndbparam-ndbd-backupdatadir)`/备份/备份-*`乙`*`, 在每个数据节点上。对于本示例的其余部分，我们假设备份 ID 为 1。

        让所有这些文件可用于以后复制到新的数据节点（可以通过以下方式在数据节点的本地文件系统上访问它们）[**数据库\_恢复**](mysql-cluster-programs-ndb-restore.html)）。将它们全部复制到一个位置是最简单的；我们假设这就是你所做的。

4.  目标集群的管理服务器在主机上`主机20`，并且目标具有来自管理服务器的两个数据节点，其中显示了节点 ID 和主机名`配置文件`归档在`主机20`：

    ```
    [ndbd]
    NodeId=3
    hostname=host3

    [ndbd]
    NodeId=5
    hostname=host5
    ```

    每个数据节点处理`主机3`和`主机5`应该从[**ndbmtd**](mysql-cluster-programs-ndbmtd.html) `-c 主机20` [`- 最初的`](mysql-cluster-programs-ndbd.html#option_ndbd_initial)或等效的，以便新的（目标）集群从干净的数据节点文件系统开始。

5.  将两组不同的两个备份文件复制到每个目标数据节点。对于此示例，将备份文件从原始集群中的节点 2 和 4 复制到目标集群中的节点 3。这些文件在此处列出：

    -   `BACKUP-1-0.2.数据`

    -   `备份-1.2.ctl`

    -   `备份-1.2.log`

    -   `BACKUP-1-0.4.Data`

    -   `备份-1.4.ctl`

    -   `备份-1.4.log`

        然后将节点6和8的备份文件复制到节点5；这些文件显示在以下列表中：

    -   `BACKUP-1-0.6.Data`

    -   `备份-1.6.ctl`

    -   `备份-1.6.log`

    -   `BACKUP-1-0.8.Data`

    -   `备份-1.8.ctl`

    -   `备份-1.8.log`

        对于本示例的其余部分，我们假设相应的备份文件已保存到目录`/备份-1`在节点 3 和 5 中的每一个上。

6.  在两个目标数据节点中的每一个上，您都必须从两组备份中恢复。首先，通过调用将节点 2 和 4 的备份恢复到节点 3[**数据库\_恢复**](mysql-cluster-programs-ndb-restore.html)在`主机3`如此处所示：

    ```
    $> 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
    ```

    然后通过调用将节点 6 和 8 的备份恢复到节点 5[**数据库\_恢复**](mysql-cluster-programs-ndb-restore.html)在`主机5`， 像这样：

    ```
    $> 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
    ```

##### 23.5.23.2.2 恢复到比原来更多的节点

为给定节点指定的节点 ID[**数据库\_恢复**](mysql-cluster-programs-ndb-restore.html)命令是原始备份中节点的命令，而不是要还原到的数据节点的命令。使用本节中描述的方法执行备份时，[**数据库\_恢复**](mysql-cluster-programs-ndb-restore.html)连接到管理服务器并获取备份正在恢复到的集群中的数据节点列表。还原后的数据进行相应的分布，因此在执行备份时不需要知道或计算目标集群中的节点数。

笔记

当更改每个节点组的 LCP 线程或 LQH 线程总数时，您应该从使用创建的备份重新创建架构[**mysql转储**](mysqldump.html).

1.  *创建数据的备份*.您可以通过调用[**数据库\_毫克**](mysql-cluster-programs-ndb-mgm.html)客户`开始备份`来自系统 shell 的命令，如下所示：

    ```
    $> ndb_mgm -e "START BACKUP 1"
    ```

    这假定所需的备份 ID 为 1。

2.  创建架构的备份。仅当更改每个节点组的 LCP 线程或 LQH 线程的总数时，才需要执行此步骤。

    ```
    $> mysqldump --no-data --routines --events --triggers --databases > myschema.sql
    ```

    重要的

    一旦你创建了`新开发银行`本机备份使用[**数据库\_毫克**](mysql-cluster-programs-ndb-mgm.html)，如果您这样做，则在创建架构备份之前不得进行任何架构更改。

3.  将备份目录复制到新集群。例如，如果您要恢复的备份 ID 为 1，并且`备份数据目录`=`/备份/节点_ *`节点ID`*`，那么这个节点上备份的路径是`/backups/node_1/BACKUP/BACKUP-1`.在这个目录中有三个文件，这里列出：

    -   `BACKUP-1-0.1.Data`

    -   `备份-1.1.ctl`

    -   `备份-1.1.log`

        您应该将整个目录复制到新节点。

        如果您需要创建模式文件，请将其复制到 SQL 节点上的某个位置，供其读取[**mysqld**](mysqld.html).

    不需要从一个或多个特定节点恢复备份。

    要从刚刚创建的备份中恢复，请执行以下步骤：

4.  *恢复架构*.

    -   如果您使用创建了单独的架构备份文件[**mysql转储**](mysqldump.html), 使用[**mysql**](mysql.html)客户端，类似于此处显示的内容：

        ```
        $> mysql < myschema.sql
        ```

        导入架构文件时，您可能需要指定[`- 用户`](mysql-command-options.html#option_mysql_user)和[`- 密码`](mysql-command-options.html#option_mysql_password)选项（可能还有其他）除了显示的内容之外，为了[**mysql**](mysql.html)客户端能够连接到 MySQL 服务器。

    -   如果你做了*不是*需要创建架构文件，您可以使用重新创建架构[**数据库\_恢复**](mysql-cluster-programs-ndb-restore.html) [`--restore-meta`](mysql-cluster-programs-ndb-restore.html#option_ndb_restore_restore-meta)（简写`-m`)，类似于此处显示的内容：

        ```
        $> ndb_restore --nodeid=1 --backupid=1 --restore-meta --backup-path=/backups/node_1/BACKUP/BACKUP-1
        ```

        [**数据库\_恢复**](mysql-cluster-programs-ndb-restore.html)必须能够联系管理服务器；添加[`--ndb-连接字符串`](mysql-cluster-programs-ndb-restore.html#option_ndb_restore_ndb-connectstring)选项如果和需要使这成为可能。

5.  *恢复数据*.这需要对原始集群中的每个数据节点执行一次，每次都使用该数据节点的节点 ID。假设最初有 4 个数据节点，所需的命令集将如下所示：

    ```
    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-连接字符串`](mysql-cluster-programs-ndb-restore.html#option_ndb_restore_ndb-connectstring)根据需要选择。

6.  *重建索引*.这些被禁用[`--禁用索引`](mysql-cluster-programs-ndb-restore.html#option_ndb_restore_disable-indexes)刚才显示的命令中使用的选项。重新创建索引可避免由于还原在所有点上不一致而导致的错误。在某些情况下，重建索引还可以提高性能。要重建索引，请在单个节点上执行一次以下命令：

    ```
    $> ndb_restore --nodeid=1 --backupid=1 --backup-path=/backups/node_1/BACKUP/BACKUP-1 --rebuild-indexes
    ```

    如前所述，您可能需要添加[`--ndb-连接字符串`](mysql-cluster-programs-ndb-restore.html#option_ndb_restore_ndb-connectstring)选项，因此[**数据库\_恢复**](mysql-cluster-programs-ndb-restore.html)可以联系管理服务器。
