13.1.18.9 设置 NDB_TABLE 选项
在 MySQL NDB Cluster 7.5.2 和更高版本中,CREATE TABLE
或ALTER 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 一部分的四个NDB
table 选项将在接下来的几段中进行详细说明。
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 TABLE
的ALGORITHM
选项的更多信息,请参见第 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_NODE
,ONE_PER_NODE_GROUP
,ONE_PER_LDM_PER_NODE
或ONE_PER_LDM_PER_NODE_GROUP
之一(与列出的 Lists 相同)。 (缺陷#81761,错误#23547525)
FULLY_REPLICATED
控制 table 是否被完全复制,即,每个数据节点是否具有 table 的完整副本。要启用 table 的完全复制,请使用FULLY_REPLICATED=1
。
也可以使用ndb_fully_replicated
系统变量来控制此设置。将其设置为ON
会默认启用所有新NDB
table 的选项。默认值为OFF
,它保持以前的行为(在 MySQL NDB Cluster 7.5.1 和更早版本中,在引入对完全复制 table 的支持之前)。 ndb_data_node_neighbour系统变量也用于完全复制的 table,以确保访问完全复制的 table 时,我们访问此 MySQL 服务器本地的数据节点。
创建NDB
table 时使用此类 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_BACKUP
和FULLY_REPLICATED
选项。有关更多信息,请参见此程序的描述。