Documentation Home

13.1.20.12 设置 NDB 注释选项

可以在表的表注释或列注释中设置许多特定于 NDB Cluster 的选项 NDB。用于控制从任何副本和分区平衡读取的表级选项可以使用 嵌入到表注释中NDB_TABLE

NDB_COLUMN可以在列注释中使用,以将用于存储部分 blob 值的 blob 部分表列的大小设置NDB为其最大值。这适用于BLOBMEDIUMBLOBLONGBLOBTEXTMEDIUMTEXTLONGTEXTJSON列。从 NDB 8.0.30 开始,列注释也可用于控制 blob 列的内联大小。NDB_COLUMN评论不支持TINYBLOBTINYTEXT列,因为它们有一个固定大小的内联部分(仅),没有单独的部分存储在别处。

NDB_TABLE可以在表注释中用于设置与分区平衡相关的选项以及表是否完全复制等。

本节的其余部分描述了这些选项及其使用。

NDB_COLUMN 选项

在 NDB Cluster 中,CREATE TABLEorALTER TABLE 语句中的列注释也可用于指定 NDB_COLUMN选项。从 8.0.30 版本开始,NDB支持两个列注释选项BLOB_INLINE_SIZEMAX_BLOB_PART_SIZE. (在 NDB 8.0.30 之前,仅MAX_BLOB_PART_SIZE支持。)此选项的语法如下所示:

COMMENT 'NDB_COLUMN=speclist'

speclist := spec[,spec]

spec := 
    BLOB_INLINE_SIZE=value
  | MAX_BLOB_PART_SIZE[={0|1}]

BLOB_INLINE_SIZE指定列内联存储的字节数;它的期望值是 1 - 29980 范围内的整数,包括在内。设置大于 29980 的值会引发错误;允许设置小于 1 的值,但会导致使用列类型的默认内联大小。

您应该知道,此选项的最大值实际上是可以存储在NDB表的一行中的最大字节数;行中的每一列都对这个总数有所贡献。

您还应该记住,尤其是在使用 TEXT列时,由 MAX_BLOB_PART_SIZEor 设置的值BLOB_INLINE_SIZE表示以字节为单位的列大小。它不表示字符数,根据列使用的字符集和排序规则而有所不同。

要查看此选项的效果,首先创建一个包含两 BLOB列的表,一列 ( b1) 没有额外选项,另一列 ( b2) 设置为BLOB_INLINE_SIZE,如下所示:

mysql> CREATE TABLE t1 (
    ->    a INT NOT NULL PRIMARY KEY,
    ->    b1 BLOB,
    ->    b2 BLOB COMMENT 'NDB_COLUMN=BLOB_INLINE_SIZE=8000'
    ->  ) ENGINE NDB;
Query OK, 0 rows affected (0.32 sec)

您可以通过查询表来查看列 的BLOB_INLINE_SIZE设置,如下所示: BLOBndbinfo.blobs

mysql> SELECT 
    ->   column_name AS 'Column Name', 
    ->   inline_size AS 'Inline Size', 
    ->   part_size AS 'Blob Part Size' 
    -> FROM ndbinfo.blobs 
    -> WHERE table_name = 't1';
+-------------+-------------+----------------+
| Column Name | Inline Size | Blob Part Size |
+-------------+-------------+----------------+
| b1          |         256 |           2000 |
| b2          |        8000 |           2000 |
+-------------+-------------+----------------+
2 rows in set (0.01 sec)

您还可以检查 ndb_desc实用程序的输出,如此处所示,相关行使用强调文本显示:

$> ndb_desc -d test t1
-- t --
Version: 1
Fragment type: HashMapPartition
K Value: 6
Min load factor: 78
Max load factor: 80
Temporary table: no
Number of attributes: 3
Number of primary keys: 1
Length of frm data: 945
Max Rows: 0
Row Checksum: 1
Row GCI: 1
SingleUserMode: 0
ForceVarPart: 1
PartitionCount: 2
FragmentCount: 2
PartitionBalance: FOR_RP_BY_LDM
ExtraRowGciBits: 0
ExtraRowAuthorBits: 0
TableStatus: Retrieved
Table options: readbackup
HashMap: DEFAULT-HASHMAP-3840-2
-- Attributes --
a Int PRIMARY KEY DISTRIBUTION KEY AT=FIXED ST=MEMORY
b1 Blob(256,2000,0) NULL AT=MEDIUM_VAR ST=MEMORY BV=2 BT=NDB$BLOB_64_1
b2 Blob(8000,2000,0) NULL AT=MEDIUM_VAR ST=MEMORY BV=2 BT=NDB$BLOB_64_2
-- Indexes -- 
PRIMARY KEY(a) - UniqueHashIndex
PRIMARY(a) - OrderedIndex

NDBT_ProgramExit: 0 - OK

对于MAX_BLOB_PART_SIZE=符号及其后面的值是可选的。使用 0 或 1 以外的任何值都会导致语法错误。

在列注释中使用的效果是将or 列MAX_BLOB_PART_SIZE的 blob 部分大小设置 为(13948)支持的最大字节数。此选项可应用于 MySQL 支持的任何 blob 列类型,但or ( , , , , , ) 除外。与 不同 , 对 列没有影响。 TEXTBLOBNDBTINYBLOBTINYTEXTBLOBMEDIUMBLOBLONGBLOBTEXTMEDIUMTEXTLONGTEXTBLOB_INLINE_SIZEMAX_BLOB_PART_SIZEJSON

要查看此选项的效果,我们首先在mysql客户端中运行以下 SQL 语句来创建一个包含两BLOB列的表,一列 ( c1) 没有额外选项,另一列 ( c2) 包含 MAX_BLOB_PART_SIZE

mysql> CREATE TABLE test.t2 (
    ->   p INT PRIMARY KEY, 
    ->   c1 BLOB, 
    ->   c2 BLOB COMMENT 'NDB_COLUMN=MAX_BLOB_PART_SIZE'
    -> ) ENGINE NDB;
Query OK, 0 rows affected (0.32 sec)

在系统 shell 中,运行ndb_desc 实用程序以获取有关刚创建的表的信息,如本例所示:

$> ndb_desc -d test t2
-- t --
Version: 1
Fragment type: HashMapPartition
K Value: 6
Min load factor: 78
Max load factor: 80
Temporary table: no
Number of attributes: 3
Number of primary keys: 1
Length of frm data: 324
Row Checksum: 1
Row GCI: 1
SingleUserMode: 0
ForceVarPart: 1
FragmentCount: 2
ExtraRowGciBits: 0
ExtraRowAuthorBits: 0
TableStatus: Retrieved
HashMap: DEFAULT-HASHMAP-3840-2
-- Attributes --
p Int PRIMARY KEY DISTRIBUTION KEY AT=FIXED ST=MEMORY
c1 Blob(256,2000,0) NULL AT=MEDIUM_VAR ST=MEMORY BV=2 BT=NDB$BLOB_22_1
c2 Blob(256,13948,0) NULL AT=MEDIUM_VAR ST=MEMORY BV=2 BT=NDB$BLOB_22_2
-- Indexes -- 
PRIMARY KEY(p) - UniqueHashIndex
PRIMARY(p) - OrderedIndex

输出中的列信息列在 Attributes; 对于列c1c2它在此处以强调文本显示。对于c1,blob 部分大小为 2000,默认值;对于c2,它是 13948,由 设置 MAX_BLOB_PART_SIZE

您还可以查询该ndbinfo.blobs表以查看这一点,如下所示:

mysql> SELECT 
    ->   column_name AS 'Column Name', 
    ->   inline_size AS 'Inline Size', 
    ->   part_size AS 'Blob Part Size' 
    -> FROM ndbinfo.blobs 
    -> WHERE table_name = 't2';
+-------------+-------------+----------------+
| Column Name | Inline Size | Blob Part Size |
+-------------+-------------+----------------+
| c1          |         256 |           2000 |
| c2          |         256 |          13948 |
+-------------+-------------+----------------+
2 rows in set (0.00 sec)

NDB您可以使用如下语句更改表 的给定 blob 列的 blob 部分大小, ALTER TABLE然后使用以下语句验证更改SHOW CREATE TABLE

mysql> ALTER TABLE test.t2 
    ->    DROP COLUMN c1, 
    ->     ADD COLUMN c1 BLOB COMMENT 'NDB_COLUMN=MAX_BLOB_PART_SIZE',
    ->     CHANGE COLUMN c2 c2 BLOB AFTER c1;
Query OK, 0 rows affected (0.47 sec)
Records: 0  Duplicates: 0  Warnings: 0

mysql> SHOW CREATE TABLE test.t2\G
*************************** 1. row ***************************
       Table: t
Create Table: CREATE TABLE `t2` (
  `p` int(11) NOT NULL,
  `c1` blob COMMENT 'NDB_COLUMN=MAX_BLOB_PART_SIZE',
  `c2` blob,
  PRIMARY KEY (`p`)
) ENGINE=ndbcluster DEFAULT CHARSET=latin1
1 row in set (0.00 sec)

mysql> EXIT
Bye

ndb_desc 的输出显示列的 blob 部分大小已按预期更改:

$> ndb_desc -d test t2
-- t --
Version: 16777220
Fragment type: HashMapPartition
K Value: 6
Min load factor: 78
Max load factor: 80
Temporary table: no
Number of attributes: 3
Number of primary keys: 1
Length of frm data: 324
Row Checksum: 1
Row GCI: 1
SingleUserMode: 0
ForceVarPart: 1
FragmentCount: 2
ExtraRowGciBits: 0
ExtraRowAuthorBits: 0
TableStatus: Retrieved
HashMap: DEFAULT-HASHMAP-3840-2
-- Attributes --
p Int PRIMARY KEY DISTRIBUTION KEY AT=FIXED ST=MEMORY
c1 Blob(256,13948,0) NULL AT=MEDIUM_VAR ST=MEMORY BV=2 BT=NDB$BLOB_26_1
c2 Blob(256,2000,0) NULL AT=MEDIUM_VAR ST=MEMORY BV=2 BT=NDB$BLOB_26_2
-- Indexes -- 
PRIMARY KEY(p) - UniqueHashIndex
PRIMARY(p) - OrderedIndex

NDBT_ProgramExit: 0 - OK

您还可以通过 ndbinfo.blobs再次运行查询来查看更改:

mysql> SELECT 
    ->   column_name AS 'Column Name', 
    ->   inline_size AS 'Inline Size', 
    ->   part_size AS 'Blob Part Size' 
    -> FROM ndbinfo.blobs 
    -> WHERE table_name = 't2';
+-------------+-------------+----------------+
| Column Name | Inline Size | Blob Part Size |
+-------------+-------------+----------------+
| c1          |         256 |          13948 |
| c2          |         256 |           2000 |
+-------------+-------------+----------------+
2 rows in set (0.00 sec)

可以为 blob 列同时设置BLOB_INLINE_SIZEMAX_BLOB_PART_SIZE,如以下CREATE TABLE语句所示:

mysql> CREATE TABLE test.t3 (
    ->   p INT NOT NULL PRIMARY KEY,
    ->   c1 JSON,
    ->   c2 JSON COMMENT 'NDB_COLUMN=BLOB_INLINE_SIZE=5000,MAX_BLOB_PART_SIZE'
    -> ) ENGINE NDB;
Query OK, 0 rows affected (0.28 sec)

查询blobs表向我们显示该语句按预期工作:

mysql> SELECT 
    ->   column_name AS 'Column Name', 
    ->   inline_size AS 'Inline Size', 
    ->   part_size AS 'Blob Part Size' 
    -> FROM ndbinfo.blobs 
    -> WHERE table_name = 't3';
+-------------+-------------+----------------+
| Column Name | Inline Size | Blob Part Size |
+-------------+-------------+----------------+
| c1          |        4000 |           8100 |
| c2          |        5000 |           8100 |
+-------------+-------------+----------------+
2 rows in set (0.00 sec)

您还可以通过检查ndb_desc 的输出来验证该语句是否有效。

必须使用复制来更改列的 blob 部分大小ALTER TABLE;此操作不能在线执行(请参阅 第 23.6.11 节,“在 NDB Cluster 中使用 ALTER TABLE 进行在线操作”)。

有关如何NDB 存储 blob 类型的列的更多信息,请参阅 字符串类型存储要求

NDB_TABLE 选项

在 MySQL NDB Cluster 中,CREATE TABLEorALTER TABLE 语句中的表注释也可以用于指定一个 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}
}

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

可以通过这种方式设置为注释一部分的四个NDB表选项将在接下来的几段中进行更详细的描述。

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

READ_BACKUPndb_read_backup:将此选项设置为 1 与启用时效果相同 ;允许从任何副本读取。这样做以相对较小的写入性能成本极大地提高了从表中读取的性能。从 NDB 8.0.19 开始,1 是默认值READ_BACKUP,默认值 ndb_read_backupON(以前,默认禁用从任何副本读取)。

您可以使用类似于此处所示语句之一 READ_BACKUP的语句联机设置现有表:ALTER TABLE

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

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

有关ALGORITHM 选项的更多信息ALTER TABLE,请参阅 第 23.6.11 节,“在 NDB Cluster 中使用 ALTER TABLE 进行在线操作”

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

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

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

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

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

  3. FOR_RP_BY_LDM:每个节点上每个LDM一个分区;默认值。

    这是READ_BACKUP 设置为 1 时使用的设置。

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

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

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

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

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

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

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

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

PARTITION_BALANCE是设置每个表的分区数的首选接口。使用 MAX_ROWS强制分区数已弃用,但继续支持向后兼容;它可能会在 MySQL NDB Cluster 的未来版本中被删除。(缺陷 #81759,缺陷 #23544301)

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

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

CREATE TABLE此处显示了在创建表时使用此类注释 的语句示例NDB

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";

注释显示为 的输出的一部分 SHOW CREATE TABLE。评论的文本也可以从查询 MySQL 信息模式TABLES表中获得,如本例所示:

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)

ALTER TABLE表格语句 也支持此注释语法 NDB,如下所示:

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 8.0.21 开始,该TABLE_COMMENT 列显示重新创建表所需的注释,因为它位于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会替换表格可能具有的任何现有注释。

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 8.0.21 之前,使用的表注释ALTER TABLE替换了表可能具有的任何现有注释。这意味着(例如)该 READ_BACKUP值不会转移到ALTER TABLE语句设置的新注释中,并且任何未指定的值都将恢复为默认值。(BUG#30428829) 因此不再有任何方法可以使用 SQL 来检索之前为评论设置的值。为了防止评论值恢复为默认值,有必要保留现有评论字符串中的任何此类值,并将它们包含在传递给 的评论中ALTER TABLE

您还可以在ndb_descPARTITION_BALANCE的输出中 看到该选项的值 。ndb_desc还显示是否为表设置了和 选项。有关详细信息,请参阅此程序的说明。 READ_BACKUPFULLY_REPLICATED