Documentation Home
MySQL 5.6 リファレンスマニュアル
Download this Manual
PDF (US Ltr) - 27.1Mb
PDF (A4) - 27.2Mb
HTML Download (TGZ) - 7.2Mb
HTML Download (Zip) - 7.2Mb


MySQL 5.6 リファレンスマニュアル  /  ...  /  MySQL Cluster での ALTER TABLE オンライン操作

13.1.7.2 MySQL Cluster での ALTER TABLE オンライン操作

このセクションでは、MySQL Cluster で実装されたオンラインのテーブルスキーマ変更について説明します。InnoDB ストレージエンジンもまた、MySQL Cluster によってサポートされるものとは異なる構文を使用して、このような操作をオンラインで実行できます。詳細は、セクション14.11「InnoDB とオンライン DDL」を参照してください。

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

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

注記

ONLINE および OFFLINE キーワードは、MySQL Cluster でのみサポートされます。標準の MySQL Server 5.6 リリースでは、ONLINE または OFFLINE キーワードを ALTER TABLECREATE INDEX、または DROP INDEX ステートメントで使用しようとすると、エラーが発生します。

ONLINE および OFFLINE キーワードは、MySQL Cluster NDB 7.3 から非推奨です。MySQL Cluster NDB 7.4 では引き続きサポートされますが、将来のバージョンの MySQL Cluster で削除される可能性があります。

現在、ディスクベースのカラムを 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 ONLINE TABLE t1 ADD COLUMN c3 INT COLUMN_FORMAT DYNAMIC STORAGE MEMORY;
Query OK, 0 rows affected (1.25 sec)
Records: 0  Duplicates: 0  Warnings: 0

STORAGE MEMORY オプションが省略されている場合、このステートメントは失敗します。

mysql> ALTER ONLINE TABLE t1 ADD COLUMN c3 INT COLUMN_FORMAT DYNAMIC;
ERROR 1235 (42000): This version of MySQL doesn't yet support
'ALTER ONLINE TABLE t1 ADD COLUMN c3 INT COLUMN_FORMAT DYNAMIC'

COLUMN_FORMAT DYNAMIC オプションを省略した場合は、動的なカラムフォーマットが自動的に使用されますが、次に示すような警告が発行されます。

mysql> ALTER ONLINE TABLE t1 ADD COLUMN c3 INT STORAGE MEMORY;
Query OK, 0 rows affected, 1 warning (1.17 sec)
Records: 0  Duplicates: 0  Warnings: 0

mysql> SHOW WARNINGS;
+---------+------+---------------------------------------------------------------+
| Level   | Code | Message                                                       |
+---------+------+---------------------------------------------------------------+
| Warning | 1478 | Converted FIXED field to DYNAMIC to enable on-line ADD COLUMN |
+---------+------+---------------------------------------------------------------+
1 row in set (0.00 sec)

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) /*!50120 STORAGE MEMORY */ /*!50120 COLUMN_FORMAT DYNAMIC */ DEFAULT NULL,
  `t4` int(11) /*!50120 STORAGE MEMORY */ DEFAULT NULL,
  PRIMARY KEY (`c1`)
) /*!50100 TABLESPACE ts_1 STORAGE DISK */ ENGINE=ndbcluster DEFAULT CHARSET=latin1
1 row in set (0.03 sec)
注記

STORAGE および COLUMN_FORMAT キーワードは、MySQL Cluster でのみサポートされます。ほかのどのバージョンの MySQL でも、このどちらかのキーワードを CREATE TABLE または ALTER TABLE ステートメントで使用しようとすると、エラーが発生します。

NDB テーブルに対して、ステートメント ALTER ONLINE TABLE ... REORGANIZE PARTITIONpartition_names INTO (partition_definitions) オプションなしで使用することもできます。これを使用すると、オンラインでクラスタに追加された新しいデータノードの間で MySQL Cluster データを再配布できます。このステートメントの詳細は、セクション13.1.7.1「ALTER TABLE パーティション操作」を参照してください。MySQL Cluster にデータノードをオンラインで追加する方法の詳細は、セクション18.5.13「MySQL Cluster データノードのオンライン追加」を参照してください。

MySQL Cluster オンライン操作の制限

オンライン 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 ストレージエンジンによって作成された非表示の主キーは、この目的には不十分です。

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

  • MySQL Cluster ディスクデータテーブルで使用された場合、カラムのストレージ型 (DISK または MEMORY) をオンラインで変更することはできません。つまり、操作がオンラインで実行されるような方法でインデックスを追加または削除するときに、1 つまたは複数のカラムのストレージ型が変更されるようにする場合は、インデックスを追加または削除するステートメントで OFFLINE キーワードを使用する必要があります。

オンラインで追加されるカラムは BLOB または TEXT 型を使用できず、次の条件を満たす必要があります。

  • このカラムは動的である必要があります。つまり、COLUMN_FORMAT DYNAMIC を使用して作成できる必要があります。COLUMN_FORMAT DYNAMIC オプションを省略した場合は、動的なカラムフォーマットが自動的に使用されます。

  • このカラムは NULL 値を許可する必要があり、NULL 以外の明示的なデフォルト値があってはなりません。オンラインで追加されるカラムは、次に示すように、DEFAULT NULL として自動的に作成されます。

    mysql> CREATE TABLE t1 (
         >     c1 INT NOT NULL AUTO_INCREMENT PRIMARY KEY
         >     ) ENGINE=NDB;
    Query OK, 0 rows affected (1.44 sec)
    
    mysql> ALTER ONLINE TABLE t1
         >     ADD COLUMN c2 INT,
         >     ADD COLUMN c3 INT;
    Query OK, 0 rows affected, 2 warnings (0.93 sec)
    
    mysql> SHOW CREATE TABLE t1\G
    *************************** 1. row ***************************
           Table: t1
    Create Table: CREATE TABLE `t1` (
      `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 操作の場合、固定フォーマットのカラムは次に示すように、オンラインで追加されるか、またはインデックスがオンラインで作成または削除されたときに動的なカラムに変換されます。

mysql> CREATE TABLE t1 (
     >     c1 INT NOT NULL AUTO_INCREMENT PRIMARY KEY
     >     ) ENGINE=NDB;
Query OK, 0 rows affected (1.44 sec)

mysql> ALTER ONLINE TABLE t1 ADD COLUMN c2 INT, ADD COLUMN c3 INT;
Query OK, 0 rows affected, 2 warnings (0.93 sec)
Records: 0  Duplicates: 0  Warnings: 0

mysql> SHOW WARNINGS;
+---------+------+---------------------------------------------------------------+
| Level   | Code | Message                                                       |
+---------+------+---------------------------------------------------------------+
| Warning | 1475 | Converted FIXED field to DYNAMIC to enable on-line ADD COLUMN |
| Warning | 1475 | Converted FIXED field to DYNAMIC to enable on-line ADD COLUMN |
+---------+------+---------------------------------------------------------------+
2 rows in set (0.00 sec)
注記

既存のカラム (テーブルの主キーを含む) は、動的である必要はありません。動的である必要があるのは、オンラインで追加される 1 つまたは複数のカラムだけです。

mysql> CREATE TABLE t2 (
     >     c1 INT NOT NULL AUTO_INCREMENT PRIMARY KEY COLUMN_FORMAT FIXED
     >     ) ENGINE=NDB;
Query OK, 0 rows affected (2.10 sec)

mysql> ALTER ONLINE TABLE t2 ADD COLUMN c2 INT;
Query OK, 0 rows affected, 1 warning (0.78 sec)
Records: 0  Duplicates: 0  Warnings: 0

mysql> SHOW WARNINGS;
+---------+------+---------------------------------------------------------------+
| Level   | Code | Message                                                       |
+---------+------+---------------------------------------------------------------+
| Warning | 1475 | Converted FIXED field to DYNAMIC to enable on-line ADD COLUMN |
+---------+------+---------------------------------------------------------------+
1 row in set (0.00 sec)

名前の変更操作によって、カラムが FIXED から DYNAMIC のカラムフォーマットに変換されることはありません。COLUMN_FORMAT の詳細は、セクション13.1.17「CREATE TABLE 構文」を参照してください。

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


User Comments
Sign Up Login You must be logged in to post a comment.