MySQL NDB Cluster 支援使用 ALTER TABLE ... ALGORITHM=DEFAULT|INPLACE|COPY
進行線上資料表綱要變更。NDB Cluster 會如接下來幾段所述處理 COPY
和 INPLACE
。
對於 ALGORITHM=COPY
,mysqld NDB Cluster 處理程式會執行下列動作:
告知資料節點建立資料表的空白副本,並對此副本進行必要的綱要變更。
從原始資料表讀取資料列,並將其寫入副本。
告知資料節點捨棄原始資料表,然後重新命名副本。
我們有時將此稱為 「複製」 或 「離線」 ALTER TABLE
。
不允許 DML 操作與複製的 ALTER TABLE
同時進行。
發出複製的 ALTER TABLE
陳述式的 mysqld 會取得中繼資料鎖定,但這僅對該 mysqld 有效。其他 NDB
用戶端可以在複製的 ALTER TABLE
期間修改資料列資料,導致不一致。
對於 ALGORITHM=INPLACE
,NDB Cluster 處理程式會告知資料節點進行必要的變更,且不會執行任何資料複製。
我們也將此稱為 「非複製」 或 「線上」 ALTER TABLE
。
非複製的 ALTER TABLE
允許並行 DML 操作。
NDB 9.0 不支援 ALGORITHM=INSTANT
。
無論使用哪種演算法,mysqld 在執行 ALTER TABLE 時都會取得全域綱要鎖定 (GSL);這會防止在此叢集或任何其他 SQL 節點上同時執行任何 (其他) DDL 或備份。這通常不是問題,除非 ALTER TABLE
花費很長時間。
某些較舊的 NDB Cluster 版本使用特定於 NDB
的語法進行線上 ALTER TABLE
操作。該語法已移除。
在 NDB
資料表的可變寬度資料行上新增和捨棄索引的操作會線上發生。線上操作是非複製的;也就是說,它們不需要重新建立索引。它們不會鎖定正在變更的資料表,使其無法被 NDB Cluster 中的其他 API 節點存取 (但請參閱本節稍後的 NDB 線上操作的限制)。此類操作不需要在具有多個 API 節點的 NDB 叢集中對 NDB
資料表進行變更時進入單一使用者模式;交易可以在線上 DDL 操作期間不間斷地繼續。
ALGORITHM=INPLACE
可用於對 NDB
資料表執行線上 ADD COLUMN
、ADD INDEX
(包括 CREATE INDEX
陳述式) 和 DROP INDEX
操作。也支援線上重新命名 NDB
資料表。
無法線上將磁碟型資料行新增至 NDB
資料表。這表示,如果您想要將記憶體內資料行新增至使用資料表層級 STORAGE DISK
選項的 NDB
資料表,您必須明確宣告新的資料行使用以記憶體為基礎的儲存。例如,假設您已建立表空間 ts1
,假設您建立資料表 t1
如下:
mysql> CREATE TABLE t1 (
> c1 INT NOT NULL PRIMARY KEY,
> c2 VARCHAR(30)
> )
> TABLESPACE ts1 STORAGE DISK
> ENGINE NDB;
Query OK, 0 rows affected (1.73 sec)
Records: 0 Duplicates: 0 Warnings: 0
您可以將新的記憶體內資料行新增至此資料表,如下所示:
mysql> ALTER TABLE t1
> ADD COLUMN c3 INT COLUMN_FORMAT DYNAMIC STORAGE MEMORY,
> ALGORITHM=INPLACE;
Query OK, 0 rows affected (1.25 sec)
Records: 0 Duplicates: 0 Warnings: 0
如果省略 STORAGE MEMORY
選項,此陳述式會失敗。
mysql> ALTER TABLE t1
> ADD COLUMN c4 INT COLUMN_FORMAT DYNAMIC,
> ALGORITHM=INPLACE;
ERROR 1846 (0A000): ALGORITHM=INPLACE is not supported. Reason:
Adding column(s) or add/reorganize partition not supported online. Try
ALGORITHM=COPY.
如果您省略 COLUMN_FORMAT DYNAMIC
選項,則會自動採用動態資料行格式,但會發出警告,如下所示:
mysql> ALTER ONLINE TABLE t1 ADD COLUMN c4 INT STORAGE MEMORY;
Query OK, 0 rows affected, 1 warning (1.17 sec)
Records: 0 Duplicates: 0 Warnings: 0
mysql> SHOW WARNINGS\G
*************************** 1. row ***************************
Level: Warning
Code: 1478
Message: DYNAMIC column c4 with STORAGE DISK is not supported, column will
become FIXED
mysql> SHOW CREATE TABLE t1\G
*************************** 1. row ***************************
Table: t1
Create Table: CREATE TABLE `t1` (
`c1` int(11) NOT NULL,
`c2` varchar(30) DEFAULT NULL,
`c3` int(11) /*!50606 STORAGE MEMORY */ /*!50606 COLUMN_FORMAT DYNAMIC */ DEFAULT NULL,
`c4` int(11) /*!50606 STORAGE MEMORY */ DEFAULT NULL,
PRIMARY KEY (`c1`)
) /*!50606 TABLESPACE ts_1 STORAGE DISK */ ENGINE=ndbcluster DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci
1 row in set (0.03 sec)
STORAGE
和 COLUMN_FORMAT
關鍵字僅在 NDB Cluster 中受到支援;在任何其他版本的 MySQL 中,嘗試在 CREATE TABLE
或 ALTER TABLE
陳述式中使用這些關鍵字中的任一個,都會導致錯誤。
也可以在 NDB
資料表上使用沒有
選項的陳述式 partition_names
INTO (partition_definitions
)ALTER TABLE ... REORGANIZE PARTITION, ALGORITHM=INPLACE
。這可用於在線上將已新增至叢集的新資料節點之間重新分配 NDB Cluster 資料。這 不會 執行任何重組,重組需要使用 OPTIMIZE TABLE
或 null ALTER TABLE
陳述式。如需詳細資訊,請參閱 第 25.6.7 節,「線上新增 NDB Cluster 資料節點」。
NDB 線上操作的限制
不支援線上 DROP COLUMN
操作。
新增資料行或新增或捨棄索引的線上 ALTER TABLE
、CREATE INDEX
或 DROP INDEX
陳述式受下列限制約束:
給定的線上
ALTER TABLE
只能使用ADD COLUMN
、ADD INDEX
或DROP INDEX
中的其中一個。可以在單一陳述式中線上新增一或多個資料行;只能在單一陳述式中線上建立或捨棄一個索引。正在變更的資料表不會相對於執行線上
ALTER TABLE
ADD COLUMN
、ADD INDEX
或DROP INDEX
操作 (或CREATE INDEX
或DROP INDEX
陳述式) 的 API 節點以外的 API 節點鎖定。但是,在執行線上操作時,資料表會被鎖定,無法執行來自 相同 API 節點的其他任何操作。要變更的資料表必須具有明確的主索引鍵;
NDB
儲存引擎建立的隱藏主索引鍵不足以用於此目的。資料表使用的儲存引擎無法線上變更。
資料表使用的表空間無法線上變更。明確不允許
ALTER TABLE
等陳述式。ndb_table
... ALGORITHM=INPLACE, TABLESPACE=new_tablespace
與 NDB Cluster 磁碟資料表搭配使用時,無法線上變更資料行的儲存類型 (
DISK
或MEMORY
)。這表示,當您以會線上執行操作的方式新增或捨棄索引,並且您想要變更資料行或多個資料行的儲存類型時,您必須在新增或捨棄索引的陳述式中使用ALGORITHM=COPY
。
線上新增的欄位不能使用 BLOB
或 TEXT
類型,且必須符合以下條件:
欄位必須是動態的;也就是說,必須可以使用
COLUMN_FORMAT DYNAMIC
來建立它們。如果省略COLUMN_FORMAT DYNAMIC
選項,則會自動採用動態欄位格式。欄位必須允許
NULL
值,並且除了NULL
之外,不能有任何明確的預設值。線上新增的欄位會自動建立為DEFAULT NULL
,如下所示:mysql> CREATE TABLE t2 ( > c1 INT NOT NULL AUTO_INCREMENT PRIMARY KEY > ) ENGINE=NDB; Query OK, 0 rows affected (1.44 sec) mysql> ALTER TABLE t2 > ADD COLUMN c2 INT, > ADD COLUMN c3 INT, > ALGORITHM=INPLACE; Query OK, 0 rows affected, 2 warnings (0.93 sec) mysql> SHOW CREATE TABLE t1\G *************************** 1. row *************************** Table: t1 Create Table: CREATE TABLE `t2` ( `c1` int(11) NOT NULL AUTO_INCREMENT, `c2` int(11) DEFAULT NULL, `c3` int(11) DEFAULT NULL, PRIMARY KEY (`c1`) ) ENGINE=ndbcluster DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci 1 row in set (0.00 sec)
欄位必須新增在任何現有欄位之後。如果您嘗試在任何現有欄位之前線上新增欄位,或使用
FIRST
關鍵字,則該語句會失敗並出現錯誤。現有的資料表欄位無法線上重新排序。
對於 ALTER TABLE
在 NDB
資料表上的線上操作,固定格式的欄位在線上新增時,或在線上建立或刪除索引時,會轉換為動態格式,如下所示(為了清楚起見,重複顯示剛才顯示的 CREATE TABLE
和 ALTER TABLE
語句):
mysql> CREATE TABLE t2 (
> c1 INT NOT NULL AUTO_INCREMENT PRIMARY KEY
> ) ENGINE=NDB;
Query OK, 0 rows affected (1.44 sec)
mysql> ALTER TABLE t2
> ADD COLUMN c2 INT,
> ADD COLUMN c3 INT,
> ALGORITHM=INPLACE;
Query OK, 0 rows affected, 2 warnings (0.93 sec)
mysql> SHOW WARNINGS;
*************************** 1. row ***************************
Level: Warning
Code: 1478
Message: Converted FIXED field 'c2' to DYNAMIC to enable online ADD COLUMN
*************************** 2. row ***************************
Level: Warning
Code: 1478
Message: Converted FIXED field 'c3' to DYNAMIC to enable online ADD COLUMN
2 rows in set (0.00 sec)
只有線上新增的欄位或多個欄位必須是動態的。現有的欄位不需要;這包括資料表的主鍵,它也可以是 FIXED
,如下所示:
mysql> CREATE TABLE t3 (
> c1 INT NOT NULL AUTO_INCREMENT PRIMARY KEY COLUMN_FORMAT FIXED
> ) ENGINE=NDB;
Query OK, 0 rows affected (2.10 sec)
mysql> ALTER TABLE t3 ADD COLUMN c2 INT, ALGORITHM=INPLACE;
Query OK, 0 rows affected, 1 warning (0.78 sec)
Records: 0 Duplicates: 0 Warnings: 0
mysql> SHOW WARNINGS;
*************************** 1. row ***************************
Level: Warning
Code: 1478
Message: Converted FIXED field 'c2' to DYNAMIC to enable online ADD COLUMN
1 row in set (0.00 sec)
欄位不會透過重新命名操作從 FIXED
轉換為 DYNAMIC
欄位格式。有關 COLUMN_FORMAT
的更多資訊,請參閱 Section 15.1.20, “CREATE TABLE Statement”。
在使用 ALGORITHM=INPLACE
的 ALTER TABLE
語句中支援 KEY
、CONSTRAINT
和 IGNORE
關鍵字。
不允許使用線上的 ALTER TABLE
語句將 MAX_ROWS
設定為 0。您必須使用複製的 ALTER TABLE
來執行此操作。(錯誤 #21960004)