#### 13.1.20.11 设置 NDB 评论选项

-   [新开发银行\_列选项](create-table-ndb-comment-options.html#create-table-ndb-comment-column-options)

[](<>) [](<>) [](<>)可以在表注释或列注释中设置许多特定于 NDB Cluster 的选项[`新开发银行`](mysql-cluster.html)桌子。用于控制从任何副本读取和分区平衡的表级选项可以嵌入到表注释中，使用`NDB_TABLE`.

`NDB_COLUMN`可用于列注释以设置用于存储部分 blob 值的 blob 部分表列的大小`新开发银行`到最大。这适用于[`斑点`](blob.html),`中块`,`长块`,[`文本`](blob.html),`中文本`,`长文`， 和[`JSON`](json.html)列。

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

##### 新开发银行\_列选项

[](<>) [](<>) [](<>) [](<>)在 NDB Cluster 中，a 中的列注释`创建表`要么[`更改表`](alter-table.html)语句也可用于指定`NDB_COLUMN`选项。从版本 8.0.30 开始，`新开发银行`支持两列评论选项`BLOB_INLINE_SIZE`和`MAX_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 - 29880（含）范围内的整数。设置大于 29880 的值会引发错误；设置小于 1 的值会导致使用列类型的默认内联大小。

要查看此选项的效果，首先创建一个包含两个`斑点`列，一个（`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`的设置`斑点`通过查询列[`ndbinfo.blob`](mysql-cluster-ndbinfo-blobs.html)表，像这样：

```
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)
```

您还可以检查从[**数据库\_描述**](mysql-cluster-programs-ndb-desc.html)实用程序，如此处所示，使用强调文本显示相关行：

```
$> 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 以外的任何值都会导致语法错误。

使用效果`MAX_BLOB_PART_SIZE`在列注释中是设置 blob 部分的大小[`文本`](blob.html)要么[`斑点`](blob.html)列到最大支持`新开发银行`(13948)。此选项可应用于 MySQL 支持的任何 blob 列类型 (`斑点`,`中块`,`长块`,`文本`,`中文本`,`长文`）。不像`BLOB_INLINE_SIZE`,`MAX_BLOB_PART_SIZE`对没有影响`JSON`列。

要查看此选项的效果，我们首先在[**mysql**](mysql.html)客户端创建一个包含两个的表`斑点`列，一个（`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)
```

从系统外壳，运行[**数据库\_描述**](mysql-cluster-programs-ndb-desc.html)实用程序来获取有关刚刚创建的表的信息，如本示例所示：

```
$> 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
```

输出中的列信息列在下面`属性`;用于列`c1`和`c2`它在此处以强调的文本显示。为了`c1`，blob部分大小为2000，默认值；为了`c2`，它是 13948，由`MAX_BLOB_PART_SIZE`.

您还可以查询`ndbinfo.blob`表看到这个，如下所示：

```
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)
```

您可以更改给定 blob 列的 blob 部分大小`新开发银行`表使用`更改表`像这样的声明，然后使用验证更改[`显示创建表`](show-create-table.html)：

```
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
```

的输出[**数据库\_描述**](mysql-cluster-programs-ndb-desc.html)显示列的 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.blob`](mysql-cluster-ndbinfo-blobs.html)再次：

```
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_INLINE_SIZE`和`MAX_BLOB_PART_SIZE`对于 blob 列，如此处所示`创建表`陈述：

```
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)
```

查询[`斑点`](mysql-cluster-ndbinfo-blobs.html)表向我们展示了该语句按预期工作：

```
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)
```

您还可以通过检查输出来验证该语句是否有效[**数据库\_描述**](mysql-cluster-programs-ndb-desc.html).

必须使用复制来更改列的 blob 部分大小`更改表`;此操作无法在线执行（请参阅[第 23.6.11 节，“在 NDB 集群中使用 ALTER TABLE 进行在线操作”](mysql-cluster-online-operations.html)）。

有关如何[`新开发银行`](mysql-cluster.html)存储 blob 类型的列，请参阅[字符串类型存储要求](storage-requirements.html#data-types-storage-reqs-strings).

[](<>) [](<>) [](<>) [](<>) [](<>)在 MySQL NDB Cluster 中，表注释`创建表`要么[`更改表`](alter-table.html)语句也可用于指定一个`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}
}
```

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

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

[](<>) [](<>) `打瞌睡`: 使用 1 对应于拥有[`ndb_table_no_logging`](mysql-cluster-options-variables.html#sysvar_ndb_table_no_logging)启用，但没有实际效果。作为占位符提供，主要是为了完整[`更改表`](alter-table.html)陈述。

[](<>) [](<>) [](<>) `READ_BACKUP`: 将此选项设置为 1 的效果与[`ndb_read_backup`](mysql-cluster-options-variables.html#sysvar_ndb_read_backup)已启用；允许从任何副本读取。这样做极大地提高了从表中读取的性能，而写入性能的成本相对较低。从 NDB 8.0.19 开始，1 是默认值`READ_BACKUP`，默认为[`ndb_read_backup`](mysql-cluster-options-variables.html#sysvar_ndb_read_backup)是`在`（以前，默认情况下禁用从任何副本读取）。

你可以设置`READ_BACKUP`对于现有的在线表，使用`更改表`类似于此处显示的声明之一：

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

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

有关更多信息`算法`选项`更改表`， 看[第 23.6.11 节，“在 NDB 集群中使用 ALTER TABLE 进行在线操作”](mysql-cluster-online-operations.html).

[](<>) [](<>) [](<>) `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`系统变量。将其设置为`在`默认情况下为所有新启用该选项`新开发银行`表格；默认是`离开`.这[`ndb_data_node_neighbour`](mysql-cluster-options-variables.html#sysvar_ndb_data_node_neighbour)系统变量也用于完全复制的表，以确保在访问完全复制的表时，我们访问的是该 MySQL 服务器本地的数据节点。

一个例子`创建表`创建时使用此类注释的语句`新开发银行`表如下所示：

```
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.html).评论文本也可通过查询 MySQL 信息模式获得[`表格`](information-schema-tables-table.html)表，如本例所示：

```
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.html)声明为`新开发银行`表，如下所示：

```
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`列显示重新创建表所需的注释，因为它跟在`更改表`声明，像这样：

```
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)
```

请记住，表注释与`更改表`替换表可能具有的任何现有注释。

```
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 之前，表注释与`更改表`替换了该表可能已有的任何现有评论。这意味着（例如）`READ_BACKUP`值未结转到由`更改表`声明，并且任何未指定的值都恢复为默认值。(BUG#30428829) 因此不再有任何方法使用 SQL 来检索先前为评论设置的值。为了防止注释值恢复为默认值，有必要保留现有注释字符串中的任何此类值并将它们包含在传递给的注释中`更改表`.

还可以看到价值`PARTITION_BALANCE`输出中的选项[**数据库\_描述**](mysql-cluster-programs-ndb-desc.html).[**数据库\_描述**](mysql-cluster-programs-ndb-desc.html)也显示了是否`READ_BACKUP`和`FULLY_REPLICATED`为表设置选项。有关详细信息，请参阅此程序的说明。
