13.1.18.9 设置 NDB_TABLE 选项

在 MySQL NDB Cluster 7.5.2 和更高版本中,CREATE TABLEALTER TABLE语句中的 tableComments 还可用于指定NDB_TABLE选项,该选项由一个或多个名称-值对组成,如果需要,用逗号分隔在字符串NDB_TABLE=之后。名称和值语法的完整语法如下所示:

COMMENT="NDB_TABLE=ndb_table_option[,ndb_table_option[,...]]"

ndb_table_option: {
    NOLOGGING={1 | 0}
  | READ_BACKUP={1 | 0}
  | PARTITION_BALANCE={FOR_RP_BY_NODE | FOR_RA_BY_NODE | FOR_RP_BY_LDM
                      | FOR_RA_BY_LDM | FOR_RA_BY_LDM_X_2
                      | FOR_RA_BY_LDM_X_3 | FOR_RA_BY_LDM_X_4}
  | FULLY_REPLICATED={1 | 0}
}

带引号的字符串中不允许有空格。字符串不区分大小写。

可以在这种方式下设置为 Comments 一部分的四个NDBtable 选项将在接下来的几段中进行详细说明。

NOLOGGING:使用 1 对应于启用ndb_table_no_logging,但没有实际效果。作为占位符提供,主要用于ALTER TABLE语句的完整性。

READ_BACKUP:将此选项设置为 1 与启用ndb_read_backup具有相同的效果。允许从任何副本读取。这样做大大提高了从 table 中读取数据的性能,而写入性能却相对较低。

从 MySQL NDB Cluster 7.5.3 开始,您可以使用类似于以下所示之一的ALTER TABLE语句为在线现有 table 设置READ_BACKUP(错误#80858,错误#23001617):

ALTER TABLE ... ALGORITHM=INPLACE, COMMENT="NDB_TABLE=READ_BACKUP=1";

ALTER TABLE ... ALGORITHM=INPLACE, COMMENT="NDB_TABLE=READ_BACKUP=0";

在 MySQL NDB Cluster 7.5.4 之前,将READ_BACKUP设置为 1 还会导致FRAGMENT_COUNT_TYPE设置为ONE_PER_LDM_PER_NODE_GROUP

有关ALTER TABLEALGORITHM选项的更多信息,请参见第 21.5.11 节“ NDB 集群中使用 ALTER TABLE 的在线操作”

PARTITION_BALANCE:提供对分区分配和放置的附加控制。支持以下四种方案:

  • FOR_RP_BY_NODE:每个节点一个分区。

每个节点上只有一个 LDM 存储一个主分区。每个分区都存储在所有节点上的相同 LDM(相同 ID)中。

  • FOR_RA_BY_NODE:每个节点组一个分区。

每个节点存储一个分区,该分区可以是主副本或备份副本。每个分区都存储在所有节点上的同一 LDM 中。

  • FOR_RP_BY_LDM:每个节点上每个 LDM 都有一个分区;默认值。

这与 MySQL NDB Cluster 7.5.2 之前的行为相同,不同之处在于,分区到 LDM 的 Map 略有不同,从 LDM 0 开始并为每个节点组放置一个分区,然后移至下一个 LDM。

在 MySQL NDB Cluster 7.5.4 和更高版本中,如果READ_BACKUP设置为 1,则使用此设置。(错误#82634,错误#24482114)

  • FOR_RA_BY_LDM:每个节点组中的每个 LDM 都有一个分区。

这些分区可以是主分区或备份分区。

在 MySQL NDB Cluster 7.5.4 之前,如果READ_BACKUP设置为 1,则使用此设置。

  • FOR_RA_BY_LDM_X_2:每个节点组中的每个 LDM 都有两个分区。

这些分区可以是主分区或备份分区。

此设置是在 NDB 7.5.4 中添加的。

  • FOR_RA_BY_LDM_X_3:每个节点组中的每个 LDM 都有三个分区。

这些分区可以是主分区或备份分区。

此设置是在 NDB 7.5.4 中添加的。

  • FOR_RA_BY_LDM_X_4:每个节点组中的每个 LDM 都有四个分区。

这些分区可以是主分区或备份分区。

此设置是在 NDB 7.5.4 中添加的。

从 NDB 7.5.4 开始,PARTITION_BALANCE是用于设置每个 table 的分区数的首选接口。从 NDB 7.5.4 开始,不建议使用MAX_ROWS强制分区数,NDB 7.6continue 支持使用该分区以实现向后兼容,但是在以后的 MySQL NDB Cluster 版本中可能会删除它。 (缺陷#81759,错误#23544301)

在 MySQL NDB Cluster 7.5.4 之前,PARTITION_BALANCE被命名为FRAGMENT_COUNT_TYPE,并且被接受为ONE_PER_NODEONE_PER_NODE_GROUPONE_PER_LDM_PER_NODEONE_PER_LDM_PER_NODE_GROUP之一(与列出的 Lists 相同)。 (缺陷#81761,错误#23547525)

FULLY_REPLICATED控制 table 是否被完全复制,即,每个数据节点是否具有 table 的完整副本。要启用 table 的完全复制,请使用FULLY_REPLICATED=1

也可以使用ndb_fully_replicated系统变量来控制此设置。将其设置为ON会默认启用所有新NDBtable 的选项。默认值为OFF,它保持以前的行为(在 MySQL NDB Cluster 7.5.1 和更早版本中,在引入对完全复制 table 的支持之前)。 ndb_data_node_neighbour系统变量也用于完全复制的 table,以确保访问完全复制的 table 时,我们访问此 MySQL 服务器本地的数据节点。

创建NDBtable 时使用此类 Comments 的CREATE TABLE语句示例如下所示:

mysql> CREATE TABLE t1 (
     >     c1 INT NOT NULL AUTO_INCREMENT PRIMARY KEY,
     >     c2 VARCHAR(100),
     >     c3 VARCHAR(100) )
     > ENGINE=NDB
     >
COMMENT="NDB_TABLE=READ_BACKUP=0,PARTITION_BALANCE=FOR_RP_BY_NODE";

Comments 将显示为显示创建 table的输出的一部分。通过查询 MySQL Information Schema TABLEStable 也可以使用 Comments 文本,如以下示例所示:

mysql> SELECT TABLE_NAME, TABLE_SCHEMA, TABLE_COMMENT
     > FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_NAME="t1"\G
*************************** 1. row ***************************
   TABLE_NAME: t1
 TABLE_SCHEMA: test
TABLE_COMMENT: NDB_TABLE=READ_BACKUP=0,PARTITION_BALANCE=FOR_RP_BY_NODE
1 row in set (0.01 sec)

NDB个 table 的ALTER TABLE语句也支持此 Comments 语法,如下所示:

mysql> ALTER TABLE t1 COMMENT="NDB_TABLE=PARTITION_BALANCE=FOR_RA_BY_NODE";
Query OK, 0 rows affected (0.40 sec)
Records: 0  Duplicates: 0  Warnings: 0

从 NDB 7.6.15 开始,TABLE_COMMENT列显示重新创建 table 所需的 Comments,因为它遵循ALTER TABLE语句,如下所示:

mysql> SELECT TABLE_NAME, TABLE_SCHEMA, TABLE_COMMENT
    ->     FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_NAME="t1"\G
*************************** 1. row ***************************
   TABLE_NAME: t1
 TABLE_SCHEMA: test
TABLE_COMMENT: NDB_TABLE=READ_BACKUP=0,PARTITION_BALANCE=FOR_RP_BY_NODE
1 row in set (0.01 sec)
mysql> SELECT TABLE_NAME, TABLE_SCHEMA, TABLE_COMMENT
     > FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_NAME="t1";
+------------+--------------+--------------------------------------------------+
| TABLE_NAME | TABLE_SCHEMA | TABLE_COMMENT                                    |
+------------+--------------+--------------------------------------------------+
| t1         | c            | NDB_TABLE=PARTITION_BALANCE=FOR_RA_BY_NODE       |
| t1         | d            |                                                  |
+------------+--------------+--------------------------------------------------+
2 rows in set (0.01 sec)

请记住,与ALTER TABLE一起使用的 tableComments 将替换 table 可能具有的任何现有 Comments。

mysql> ALTER TABLE t1 COMMENT="NDB_TABLE=PARTITION_BALANCE=FOR_RA_BY_NODE";
Query OK, 0 rows affected (0.40 sec)
Records: 0  Duplicates: 0  Warnings: 0

mysql> SELECT TABLE_NAME, TABLE_SCHEMA, TABLE_COMMENT
     > FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_NAME="t1";
+------------+--------------+--------------------------------------------------+
| TABLE_NAME | TABLE_SCHEMA | TABLE_COMMENT                                    |
+------------+--------------+--------------------------------------------------+
| t1         | c            | NDB_TABLE=PARTITION_BALANCE=FOR_RA_BY_NODE       |
| t1         | d            |                                                  |
+------------+--------------+--------------------------------------------------+
2 rows in set (0.01 sec)

在 NDB 7.6.15 之前,与ALTER TABLE一起使用的 tableComments 替换了该 table 可能已有的任何现有 Comments。这意味着(例如)READ_BACKUP值未移到ALTER TABLE语句设置的新 Comments 中,并且所有未指定的值都恢复为其默认值。 (BUG#30428829)因此,不再有任何方法可以使用 SQL 来检索先前为 Comments 设置的值。为了避免 Comments 值恢复为默认值,有必要保留现有 Comments 字符串中的所有此类值,并将其包含在传递给ALTER TABLE的 Comments 中。

您还可以在ndb_desc的输出中看到PARTITION_BALANCE选项的值。 ndb_desc还显示是否为 table 设置了READ_BACKUPFULLY_REPLICATED选项。有关更多信息,请参见此程序的描述。