文件首頁
MySQL 9.0 參考手冊
相關文件 下載本手冊
PDF (美式信紙) - 40.0Mb
PDF (A4) - 40.1Mb
Man Pages (TGZ) - 258.2Kb
Man Pages (Zip) - 365.3Kb
Info (Gzip) - 4.0Mb
Info (Zip) - 4.0Mb


MySQL 9.0 參考手冊  /  ...  /  設定 NDB 註解選項

15.1.20.12 設定 NDB 註解選項

可以在 NDB 資料表的資料表註解或欄位註解中設定多個特定於 NDB Cluster 的選項。用於控制從任何複本讀取和分割平衡的資料表層級選項,可以使用 NDB_TABLE 嵌入到資料表註解中。

NDB_COLUMN 可用於欄位註解中,將 NDB 用於儲存 blob 值部分的 blob 部分資料表欄位的大小設定為最大值。這適用於 BLOBMEDIUMBLOBLONGBLOBTEXTMEDIUMTEXTLONGTEXTJSON 欄位。欄位註解也可以用來控制 blob 欄位的內嵌大小。NDB_COLUMN 註解不支援 TINYBLOBTINYTEXT 欄位,因為這些欄位只有固定大小的內嵌部分,沒有其他地方可以儲存的獨立部分。

NDB_TABLE 可用於資料表註解中,設定與分割平衡以及資料表是否完全複寫相關的選項。

本節的其餘部分將說明這些選項及其使用方式。

NDB_COLUMN 選項

在 NDB Cluster 中,CREATE TABLEALTER TABLE 陳述式中的欄位註解也可用來指定 NDB_COLUMN 選項。NDB 支援兩個欄位註解選項 BLOB_INLINE_SIZEMAX_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_SIZEBLOB_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)

您可以透過查詢 ndbinfo.blobs 資料表來查看 BLOB 欄位的 BLOB_INLINE_SIZE 設定,如下所示

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

對於 MAX_BLOB_PART_SIZE= 符號和其後的值是選用的。使用 0 或 1 以外的任何值都會導致語法錯誤。

在欄位註解中使用 MAX_BLOB_PART_SIZE 的效果是將 TEXTBLOB 欄位的 blob 部分大小設定為 NDB 支援的最大位元組數 (13948)。此選項可以套用至 MySQL 支援的任何 blob 欄位類型,除了 TINYBLOBTINYTEXT (BLOBMEDIUMBLOBLONGBLOBTEXTMEDIUMTEXTLONGTEXT)。與 BLOB_INLINE_SIZE 不同,MAX_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)

您可以使用 ALTER TABLE 陳述式來變更 NDB 資料表指定 blob 欄位的 blob 部分大小,例如這個,然後使用 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=utf8mb4 COLLATE=utf8mb4_0900_ai_ci
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

您也可以再次執行針對 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 來完成;此操作無法線上執行 (請參閱第 25.6.12 節「NDB Cluster 中 ALTER TABLE 的線上操作」)。

如需有關 NDB 如何儲存 blob 類型欄位的詳細資訊,請參閱字串類型儲存需求

NDB_TABLE 選項

對於 NDB Cluster 資料表,CREATE TABLEALTER 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:依預設,NDB 資料表會被記錄並檢查點化。這使得它們對於整個叢集故障具有持久性。在建立或變更資料表時使用 NOLOGGING 表示此資料表不會被重新記錄,也不會包含在本地檢查點中。在這種情況下,資料表仍然會在資料節點之間複寫以實現高可用性,並使用交易來更新,但對其所做的變更不會記錄在資料節點的重做記錄中,且其內容不會檢查點化到磁碟;當從叢集故障中復原時,叢集會保留資料表定義,但不會保留其任何資料列,也就是說,資料表是空的。

使用此類非記錄資料表會減少資料節點對磁碟 I/O 和儲存空間的需求,以及檢查點 CPU 的 CPU 使用率。這可能適用於頻繁更新的短期資料,並且在不太可能發生總叢集故障的情況下,所有資料的遺失是可以接受的。

也可以使用 ndb_table_no_logging 系統變數,使在此變數生效時建立或變更的任何 NDB 資料表都像使用 NOLOGGING 註解建立一樣運作。與直接使用註解時不同,在這種情況下,SHOW CREATE TABLE 的輸出中沒有任何內容可以指出它是一個非記錄資料表。建議使用資料表註解方法,因為它提供每資料表的此功能控制,且資料表結構描述的這個方面會嵌入到資料表建立陳述式中,SQL 型工具可以輕鬆找到它。

READ_BACKUP:將此選項設定為 1 的效果與啟用 ndb_read_backup 相同;啟用從任何複本讀取。這樣做可以大幅改善從資料表讀取的效能,而寫入效能的成本相對較小。1 是 READ_BACKUP 的預設值,而 ndb_read_backup 的預設值為 ON(先前,依預設會停用從任何複本讀取)。

您可以使用類似於此處所示的其中一個 ALTER TABLE 陳述式,線上設定現有資料表的 READ_BACKUP

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

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

如需有關 ALTER TABLEALGORITHM 選項的詳細資訊,請參閱第 25.6.12 節「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 的未來版本中可能會移除。(Bug #81759, Bug #23544301)

FULLY_REPLICATED 控制資料表是否完全複寫,也就是說,每個資料節點是否都有資料表的完整副本。若要啟用資料表的完全複寫,請使用 FULLY_REPLICATED=1

此設定也可以使用 ndb_fully_replicated 系統變數來控制。將其設定為 ON 會針對所有新的 NDB 資料表預設啟用此選項;預設值為 OFFndb_data_node_neighbour 系統變數也用於完全複寫的資料表,以確保在存取完全複寫的資料表時,我們存取的是此 MySQL 伺服器本機的資料節點。

以下顯示建立 NDB 資料表時使用此類註解的 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";

該註解會顯示為 SHOW CREATE TABLE 輸出的其中一部分。註解的文字也可以從查詢 MySQL Information Schema 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)

此註解語法也支援用於 NDB 資料表的 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

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_desc 的輸出中看到 PARTITION_BALANCE 選項的值。 ndb_desc 也會顯示是否已為資料表設定 READ_BACKUPFULLY_REPLICATED 選項。如需更多資訊,請參閱此程式的描述。