设置 NDB_TABLE 选项

在 MySQL NDB Cluster 中,CREATE TABLE 或 ALTER TABLE 语句中的表注释也可用于指定 NDB_TABLE 选项,该选项由一个或多个名称-值成对组成,如果有需要,用逗号隔开,跟在字符串 NDB_TABLE= 后面。名称和值的完整语法如下所示:

1.COMMENT="NDB_TABLE=ndb_table_option[,ndb_table_option[,...]]"
2. 
3. ndb_table_option: {
4.     NOLOGGING={1 | 0}
5.   | READ_BACKUP={1 | 0}
6.   | PARTITION_BALANCE={FOR_RP_BY_NODE | FOR_RA_BY_NODE | FOR_RP_BY_LDM
7.                       | FOR_RA_BY_LDM | FOR_RA_BY_LDM_X_2
8.                       | FOR_RA_BY_LDM_X_3 | FOR_RA_BY_LDM_X_4}
9.   | FULLY_REPLICATED={1 | 0}
10. }

不允许在引用的字符串中使用空格。字符串不区分大小写。

四个 NDB 表选项可以以这种方式设置为注释的一部分,下面几段将更详细地描述。

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

READ_BACKUP:将此选项设置为1具有与启用 ndb_read_backup 相同的效果;可以从任何副本进行读取。这样以付出相对较小的写入性能代价极大地提高读取的性能。从NDB 8.0.19 开始,READ_BACKUP 的默认值为1,ndb_read_backup 的默认值为 ON(以前,默认情况下禁用从任何副本读取)。

可以使用类似于下面所示的 ALTER TABLE 语句为现有表联机设置 READ_BACKUP:

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

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

  1. FOR_RP_BY_NODE: 每个节点一个分区。

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

  1. FOR_RA_BY_NODE: 每个节点组有一个分区。

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

  1. FOR_RP_BY_LDM: 每个节点上的每个LDM对应一个分区;默认值。

如果 READ_BACKUP 被设置为1,则使用这个设置。

  1. FOR_RA_BY_LDM: 每个节点组中每个LDM有一个分区。

这些分区可以是主分区,也可以是备份分区。

  1. FOR_RA_BY_LDM_X_2: 每个节点组中每个LDM有两个分区。

这些分区可以是主分区,也可以是备份分区。

  1. FOR_RA_BY_LDM_X_3: 每个节点组中每个LDM有三个分区。

这些分区可以是主分区,也可以是备份分区。

  1. FOR_RA_BY_LDM_X_4: 每个节点组中的每个LDM有四个分区。

这些分区可以是主分区,也可以是备份分区。

PARTITION_BALANCE 是设置每个表分区数量的首选接口。不推荐使用 MAX_ROWS 强制设置分区数,为了向前兼容性,现在仍然支持这种方式; 但是可能会在 MySQL NDB Cluster 的未来版本中被删除。

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

也可以使用 ndb_fully_replicated 系统变量来控制该设置。将其设置为 ON,默认情况下将为所有新 NDB 表启用该选项; 默认值是 OFF。ndb_data_node_neighbour 系统变量也用于完全复制的表,用以确保当访问一个完全复制的表时,访问的是这个 MySQL 服务器本地的数据节点。

在创建NDB表时,CREATE TABLE 语句使用这样的注释的例子如下所示:

1. mysql> CREATE TABLE t1 (
2.      >     c1 INT NOT NULL AUTO_INCREMENT PRIMARY KEY,
3.      >     c2 VARCHAR(100),
4.      >     c3 VARCHAR(100) )
5.      > ENGINE=NDB
6.      >
7. COMMENT="NDB_TABLE=READ_BACKUP=0,PARTITION_BALANCE=FOR_RP_BY_NODE";

注释显示为 SHOW CREATE TABLE 语句的输出的一部分。注释的文本也可以通过查询 INFORMATION_SCHEMA.TABLES 表得到,如这个例子:

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

NDB 表的 ALTER TABLE 语句也支持这种注释语法,如下所示:

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

从NDB 8.0.21开始,TABLE_COMMENT 列显示用于重新创建表所需的注释,它位于 ALTER TABLE 语句之后,如下所示:

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

请记住,与 ALTER TABLE 一起使用的表注释将替换该表可能具有的任何现有注释。

1. mysql> ALTER TABLE t1 COMMENT="NDB_TABLE=PARTITION_BALANCE=FOR_RA_BY_NODE";
2. Query OK, 0 rows affected (0.40 sec)
3. Records: 0  Duplicates: 0  Warnings: 0
4. 
5. mysql> SELECT TABLE_NAME, TABLE_SCHEMA, TABLE_COMMENT
6.      > FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_NAME="t1";
7. +------------+--------------+--------------------------------------------------+
8. | TABLE_NAME | TABLE_SCHEMA | TABLE_COMMENT                                    |
9. +------------+--------------+--------------------------------------------------+
10. | t1         | c            | NDB_TABLE=PARTITION_BALANCE=FOR_RA_BY_NODE       |
11. | t1         | d            |                                                  |
12. +------------+--------------+--------------------------------------------------+
13. 2 rows in set (0.01 sec)

在 NDB 8.0.21 之前,与 ALTER TABLE 一起使用的表注释会替换表中可能存在的任何注释。这意味着(例如) READ_BACKUP 值不会被转到 ALTER TABLE 语句设置的新注释中,任何未指定的值都将恢复为默认值。因此无法再使用SQL来检索先前为注释设置的值。为了避免注释值恢复到默认值,有必要保留现有注释字符串中的任何此类值,并将它们包含在用于 ALTER TABLE 语句的注释中。

还可以在 ndb_desc 的输出中看到 PARTITION_BALANCE 选项的值。ndb_desc 还显示是否为表设置了READ_BACKUP 和 FULLY_REPLICATED 选项。

官方网址: https://dev.mysql.com/doc/refman/8.0/en/create-table-ndb-table-comment-options.html