このページは機械翻訳したものです。
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 COLUMN
、ADD 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 TABLE
、CREATE INDEX
、または DROP INDEX
ステートメントは、次の制限に従います。
特定のオンライン
ALTER TABLE
では、ADD COLUMN
、ADD INDEX
、DROP INDEX
のいずれか 1 つのみを使用できます。 1 つのステートメントで、1 つ以上のカラムをオンラインで追加できます。1 つのステートメントで、1 つのインデックスのみをオンラインで作成または削除できます。変更されるテーブルは、オンライン
ALTER TABLE
ADD COLUMN
、ADD INDEX
、またはDROP INDEX
操作 (あるいはCREATE INDEX
またはDROP INDEX
ステートメント) が実行されている API ノード以外の API ノードに対してロックされません。 ただし、オンライン操作が実行されている間、このテーブルは同じ API ノードから発信されているほかのすべての操作に対してロックされます。変更されるテーブルには明示的な主キーが存在する必要があります。
NDB
ストレージエンジンによって作成された非表示の主キーは、この目的には不十分です。テーブルで使用されるストレージエンジンをオンラインで変更することはできません。
テーブルで使用されるテーブルスペースはオンラインで変更できません。 NDB 8.0.21 以降では、
ALTER TABLE
などのステートメントは特に許可されません。 (Bug #99269、Bug #31180526)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=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 ステートメント」を参照してください。
KEY
、CONSTRAINT
および IGNORE
キーワードは、ALGORITHM=INPLACE
を使用する ALTER TABLE
ステートメントでサポートされています。
オンラインの ALTER TABLE
ステートメントを使用して MAX_ROWS
を 0 に設定することはできません。 この操作を実行するには、ALTER TABLE
のコピーを使用する必要があります。 (Bug #21960004)