文件首頁
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 Cluster 中使用 ALTER TABLE 進行線上操作

25.6.12 在 NDB Cluster 中使用 ALTER TABLE 進行線上操作

MySQL NDB Cluster 支援使用 ALTER TABLE ... ALGORITHM=DEFAULT|INPLACE|COPY 進行線上資料表綱要變更。NDB Cluster 會如接下來幾段所述處理 COPYINPLACE

對於 ALGORITHM=COPYmysqld 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 COLUMNADD 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)
注意

STORAGECOLUMN_FORMAT 關鍵字僅在 NDB Cluster 中受到支援;在任何其他版本的 MySQL 中,嘗試在 CREATE TABLEALTER 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 TABLECREATE INDEXDROP INDEX 陳述式受下列限制約束:

  • 給定的線上 ALTER TABLE 只能使用 ADD COLUMNADD INDEXDROP INDEX 中的其中一個。可以在單一陳述式中線上新增一或多個資料行;只能在單一陳述式中線上建立或捨棄一個索引。

  • 正在變更的資料表不會相對於執行線上 ALTER TABLE ADD COLUMNADD INDEXDROP INDEX 操作 (或 CREATE INDEXDROP INDEX 陳述式) 的 API 節點以外的 API 節點鎖定。但是,在執行線上操作時,資料表會被鎖定,無法執行來自 相同 API 節點的其他任何操作。

  • 要變更的資料表必須具有明確的主索引鍵;NDB 儲存引擎建立的隱藏主索引鍵不足以用於此目的。

  • 資料表使用的儲存引擎無法線上變更。

  • 資料表使用的表空間無法線上變更。明確不允許 ALTER TABLE ndb_table ... ALGORITHM=INPLACE, TABLESPACE=new_tablespace 等陳述式。

  • 與 NDB Cluster 磁碟資料表搭配使用時,無法線上變更資料行的儲存類型 (DISKMEMORY)。這表示,當您以會線上執行操作的方式新增或捨棄索引,並且您想要變更資料行或多個資料行的儲存類型時,您必須在新增或捨棄索引的陳述式中使用 ALGORITHM=COPY

線上新增的欄位不能使用 BLOBTEXT 類型,且必須符合以下條件:

  • 欄位必須是動態的;也就是說,必須可以使用 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 TABLENDB 資料表上的線上操作,固定格式的欄位在線上新增時,或在線上建立或刪除索引時,會轉換為動態格式,如下所示(為了清楚起見,重複顯示剛才顯示的 CREATE TABLEALTER 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=INPLACEALTER TABLE 語句中支援 KEYCONSTRAINTIGNORE 關鍵字。

不允許使用線上的 ALTER TABLE 語句將 MAX_ROWS 設定為 0。您必須使用複製的 ALTER TABLE 來執行此操作。(錯誤 #21960004)