オンライン DDL 操作を実行する場合は、次の制限を考慮に入れてください。
テーブルをコピーするオンライン DDL 操作中に、ファイルは一時ディレクトリ (Unix では
$TMPDIR
、Windows では%TEMP%
、または--tmpdir
構成変数で指定されたディレクトリ) に書き込まれます。各一時ファイルは、新しいテーブルまたはインデックス内に 1 つのカラムを保持できるだけの十分な大きさを持ち、最終的なテーブルまたはインデックスにマージされたらすぐに削除されます。どちらも同じインデックスを指定する
DROP INDEX
およびADD INDEX
句を含むALTER TABLE
ステートメントは、高速インデックス作成ではなくテーブルコピーを使用します。TEMPORARY TABLE
でインデックスを作成した場合は、高速インデックス作成が使用されるのではなく、テーブルがコピーされます。これは MySQL Bug #39833 としてレポートされています。InnoDB は、外部キーに必要なインデックスをユーザーが削除しようとしたときにエラー事例を処理します。エラー
1553
に関連した詳細は、セクション14.19.5「InnoDB のエラーコード」を参照してください。ALTER TABLE
の句LOCK=NONE
は、テーブル上にON...CASCADE
またはON...SET NULL
制約が存在する場合は許可されません。オンライン DDL の各
ALTER TABLE
ステートメント中に、LOCK
句には関係なく、テーブルに対する排他的ロック (LOCK=EXCLUSIVE
句で指定されるのと同じ種類のロック) を必要とする短い期間が最初と最後に存在します。そのため、そのテーブル上で挿入、更新、削除、またはSELECT ... FOR UPDATE
を実行している長時間実行されるトランザクションが存在する場合は、オンライン DDL 操作が開始前に待機する可能性があります。また、ALTER TABLE
の進行中に同様の長時間実行されるトランザクションが開始された場合は、オンライン DDL 操作が完了前に待機する可能性があります。オンライン
ALTER TABLE
操作の実行時に、ALTER TABLE
操作を実行しているスレッドは、その同じテーブルに対してほかの接続スレッドから同時に実行された DML 操作の「オンラインログ」を適用します。これらの DML 操作が適用されると、重複したキーエントリのエラー (ERROR 1062 (23000): 重複したエントリ) が発生する可能性があります。これは、重複したエントリが一時的なだけで、「オンラインログ」のあとの方のエントリによって元に戻されるとしても同じです。これは、トランザクション中は制約を保持する必要のある、InnoDB
での外部キー制約チェックの考え方に似ています。InnoDB
テーブルに対するOPTIMIZE TABLE
は、テーブルを再構築して、インデックス統計を更新し、クラスタ化されたインデックス内の未使用領域を解放するためのALTER TABLE
操作にマップされます。5.6.17 より前は、この操作に対するオンライン DDL のサポートはありません。主キーに現れる順序でキーが挿入されるため、セカンダリインデックスはそれほど効率的に作成されません。5.6.17 の時点では、InnoDB
の通常のテーブルとパーティション化されたテーブルを再構築するためのオンライン DDL のサポートの追加によって、OPTIMIZE TABLE
がサポートされます。詳細は、セクション14.11.1「オンライン DDL の概要」を参照してください。-
MySQL 5.6 より前に作成された
InnoDB
テーブルは、一時的なカラム (DATE
、DATETIME
、またはTIMESTAMP
) を含み、かつALTER TABLE ... ALGORITHM=COPY
を使用して再構築されていないテーブルに対するALTER TABLE ... ALGORITHM=INPLACE
をサポートしていません。この場合は、ALTER TABLE ... ALGORITHM=INPLACE
操作によって次のエラーが返されます。ERROR 1846 (0A000): ALGORITHM=INPLACE is not supported. Reason: Cannot change column type INPLACE. Try ALGORITHM=COPY.