#### 23.6.7.1 在线添加 NDB Cluster 数据节点：一般问题

本节提供有关在线添加 NDB Cluster 节点的行为和当前限制的一般信息。

**数据的重新分配。**在线添加新节点的能力包括一种重组方法[`NDBCLUSTER`](mysql-cluster.html)表数据和索引，以便它们通过[`ALTER TABLE ...重新组织分区`](alter-table-partition-operations.html)陈述。支持内存表和磁盘数据表的表重组。此重新分配当前不包括唯一索引（仅重新分配有序索引）。

重新分配为[`NDBCLUSTER`](mysql-cluster.html)在添加新数据节点之前已经存在的表不是自动的，但可以使用简单的 SQL 语句完成[**mysql**](mysql.html)或其他 MySQL 客户端应用程序。但是，添加到在添加新节点组后创建的表中的所有数据和索引都会自动分布在所有集群数据节点中，包括那些作为新节点组的一部分添加的节点。

**部分开始。**可以在不启动所有新数据节点的情况下添加新节点组。还可以将新节点组添加到降级的集群——即仅部分启动的集群，或者一个或多个数据节点未运行的集群。在后一种情况下，在添加新节点组之前，集群必须有足够的节点运行才能生存。

**对持续运营的影响。**创建或添加新节点组或表重组不会阻止使用 NDB Cluster 数据的正常 DML 操作。但是，不可能在执行表重组的同时执行 DDL，也就是说，在执行表重组时不能发出其他 DDL 语句。[`ALTER TABLE ...重新组织分区`](alter-table.html)语句正在执行。此外，在执行过程中`ALTER TABLE ...重新组织分区`（或执行任何其他 DDL 语句），无法重新启动集群数据节点。

**故障处理。**节点组创建和表重组过程中数据节点失败的处理如下表所示：

[](<>)

**表 23.65 节点组创建和表重组过程中数据节点故障处理**

| 期间失败 | “旧”数据节点中的故障 | “新”数据节点失败 | 系统错误 |
| ---- | ----------- | --------- | ---- |
| 节点组创建 | * **如果主节点以外的节点发生故障：**节点组的创建总是前滚的。<br/><br/>* **如果主失败：** <br/><br/>  * **如果已达到内部提交点：**节点组的创建是前滚的。<br/><br/>  * **如果尚未达到内部提交点。**节点组的创建回滚 | * **如果主节点以外的节点发生故障：**节点组的创建总是前滚的。<br/><br/>* **如果主失败：** <br/><br/>  * **如果已达到内部提交点：**节点组的创建是前滚的。<br/><br/>  * **如果尚未达到内部提交点。**节点组的创建回滚 | * **如果 CREATE NODEGROUP 的执行已经到达内部提交点：**重新启动时，集群包括新的节点组。否则它没有。<br/><br/>* **如果 CREATE NODEGROUP 的执行还没有到达内部提交点：**重新启动时，集群不包括新节点组。 |
| 表重组 | * **如果主节点以外的节点发生故障：**表重组总是前滚的。<br/><br/>* **如果主失败：** <br/><br/>  * **如果已达到内部提交点：**表重组是前滚的。<br/><br/>  * **如果尚未达到内部提交点。**表重组被回滚。 | * **如果主节点以外的节点发生故障：**表重组总是前滚的。<br/><br/>* **如果主失败：** <br/><br/>  * **如果已达到内部提交点：**表重组是前滚的。<br/><br/>  * **如果尚未达到内部提交点。**表重组被回滚。 | * **如果 ALTER TABLE ... REORGANIZE PARTITION 语句的执行已到达内部提交点：**当集群重启时，属于的数据和索引*`桌子`*使用“新”数据节点进行分发。<br/><br/>* **如果 ALTER TABLE ... REORGANIZE PARTITION 语句的执行尚未到达内部提交点：**当集群重启时，属于的数据和索引*`桌子`*仅使用“旧”数据节点进行分发。 |

**删除节点组。**这[**数据库\_毫克**](mysql-cluster-programs-ndb-mgm.html)客户端支持[`删除节点组`](mysql-cluster-mgm-client-commands.html#ndbclient-drop-nodegroup)命令，但只有当节点组中没有数据节点包含任何数据时，才能删除节点组。由于目前无法“清空”特定数据节点或节点组，因此该命令仅适用于以下两种情况：

1.  发出后[`创建节点组`](mysql-cluster-mgm-client-commands.html#ndbclient-create-nodegroup)在里面[**数据库\_毫克**](mysql-cluster-programs-ndb-mgm.html)客户，但在发出任何[`ALTER TABLE ...重新组织分区`](alter-table.html)中的陈述[**mysql**](mysql.html)客户。

2.  全部放下后[`NDBCLUSTER`](mysql-cluster.html)表使用[`删除表`](drop-table.html).

    [`截断表`](truncate-table.html)不适用于此目的，因为数据节点继续存储表定义。
