MySQL 8.0 リファレンスマニュアル


MySQL 8.0 リファレンスマニュアル  /  ...  /  NDB Cluster での ALTER TABLE を使用したオンライン操作

23.5.11 NDB Cluster での ALTER TABLE を使用したオンライン操作

MySQL NDB Cluster 8.0 は、MySQL Server (ALGORITHM=DEFAULT|INPLACE|COPY) で採用され、ほかで説明されている標準の ALTER TABLE 構文を使用して、オンラインテーブルスキーマの変更をサポートします。

注記

NDB Cluster の一部の旧リリースでは、オンライン ALTER TABLE 操作に NDB 固有の構文が使用されていました。 その構文は削除されました。

NDB テーブルの可変幅カラム上のインデックスを追加および削除する操作はオンラインで実行されます。 オンライン操作はコピーなしです。つまり、インデックスを再作成する必要はありません。 NDB Cluster 内のほかの API ノードによるアクセスから変更されるテーブルはロックされません (ただし、このセクションの後半の NDB オンライン操作の制限 を参照してください)。 このような操作では、複数の API ノードを含む NDB クラスタで行われた NDB テーブルの変更にシングルユーザーモードは必要ありません。トランザクションは、オンライン DDL 操作中も中断なく続行できます。

ALGORITHM=INPLACE を使用して、NDB テーブルに対してオンラインの ADD COLUMNADD INDEX (CREATE INDEX ステートメントを含む) および DROP INDEX 操作を実行できます。 また、NDB テーブルのオンラインでの名前変更もサポートされます。

以前は、NDB テーブルのカラムの名前をオンラインで変更できませんでした。この制限は NDB 8.0.18 では削除されています。

現在、ディスクベースのカラムを 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=latin1
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 ステートメントが必要になります。 詳細は、セクション23.5.7「NDB Cluster データノードのオンラインでの追加」を参照してください。

NDB オンライン操作の制限

オンライン DROP COLUMN 操作はサポートされていません。

カラムを追加するか、あるいはインデックスを追加または削除するオンライン ALTER TABLECREATE INDEX、または DROP INDEX ステートメントは、次の制限に従います。

  • 特定のオンライン ALTER TABLE では、ADD COLUMNADD INDEXDROP INDEX のいずれか 1 つのみを使用できます。 1 つのステートメントで、1 つ以上のカラムをオンラインで追加できます。1 つのステートメントで、1 つのインデックスのみをオンラインで作成または削除できます。

  • 変更されるテーブルは、オンライン ALTER TABLE ADD COLUMNADD INDEX、または DROP INDEX 操作 (あるいは CREATE INDEX または DROP INDEX ステートメント) が実行されている API ノード以外の API ノードに対してロックされません。 ただし、オンライン操作が実行されている間、このテーブルは同じ API ノードから発信されているほかのすべての操作に対してロックされます。

  • 変更されるテーブルには明示的な主キーが存在する必要があります。NDB ストレージエンジンによって作成された非表示の主キーは、この目的には不十分です。

  • テーブルで使用されるストレージエンジンをオンラインで変更することはできません。

  • テーブルで使用されるテーブルスペースはオンラインで変更できません。 NDB 8.0.21 以降では、ALTER TABLE ndb_table ... ALGORITHM=INPLACE, TABLESPACE=new_tablespace などのステートメントは特に許可されません。 (Bug #99269、Bug #31180526)

  • 「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=latin1
    1 row in set (0.00 sec)
  • このカラムは、既存のすべてのカラムのあとに追加する必要があります。 既存のいずれかのカラムの前に、または FIRST キーワードを使用してオンラインでカラムを追加しようとすると、このステートメントはエラーで失敗します。

  • 既存のテーブルカラムをオンラインで並べ替えることはできません。

NDB テーブルでのオンライン ALTER TABLE 操作の場合、固定形式のカラムは、オンラインで追加されたとき、またはオンラインでインデックスが作成または削除されたときに動的に変換されます (わかりやすくするために、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 の詳細は、セクション13.1.20「CREATE TABLE ステートメント」を参照してください。

KEYCONSTRAINT および IGNORE キーワードは、ALGORITHM=INPLACE を使用する ALTER TABLE ステートメントでサポートされています。

オンラインの ALTER TABLE ステートメントを使用して MAX_ROWS を 0 に設定することはできません。 この操作を実行するには、ALTER TABLE のコピーを使用する必要があります。 (Bug #21960004)


関連キーワード:  NDB, テーブル, ndbinfo, オンライン, TABLE, ndb, カラム, COLUMN, ノード, 追加