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


15.12.6 オンライン DDL の制限事項

オンライン DDL 操作には、次の制限が適用されます:

  • このテーブルは、TEMPORARY TABLE でインデックスを作成するときにコピーされます。

  • テーブルに ON...CASCADE または ON...SET NULL 制約がある場合、ALTER TABLE 句の LOCK=NONE は使用できません。

  • インプレースのオンライン DDL 操作を終了する前に、テーブルのメタデータロックを保持するトランザクションがコミットまたはロールバックされるまで待機する必要があります。 オンライン DDL 操作では、実行フェーズ中にテーブルに対する排他的メタデータロックが短時間必要になる場合があり、テーブル定義の更新時には常に操作の最終フェーズで必要になります。 その結果、テーブルのメタデータロックを保持しているトランザクションによって、オンライン DDL 操作がブロックされる可能性があります。 テーブルのメタデータロックを保持するトランザクションは、オンライン DDL 操作の前または実行中に開始されている可能性があります。 テーブルのメタデータロックを保持する長時間実行中または非アクティブなトランザクションによって、オンライン DDL 操作がタイムアウトする可能性があります。

  • インプレースのオンライン DDL 操作を実行する場合、ALTER TABLE ステートメントを実行するスレッドは、他の接続スレッドから同じテーブルに対して同時に実行された DML 操作のオンラインログを適用します。 これらの DML 操作が適用されると、重複したキーエントリのエラー (ERROR 1062 (23000): 重複したエントリ) が発生する可能性があります。これは、重複したエントリが一時的なだけで、オンラインログのあとの方のエントリによって元に戻されるとしても同じです。 これは、トランザクション中は制約を保持する必要のある、InnoDB での外部キー制約チェックの考え方に似ています。

  • InnoDB テーブルに対する OPTIMIZE TABLE は、テーブルを再構築して、インデックス統計を更新し、クラスタ化されたインデックス内の未使用領域を解放するための ALTER TABLE 操作にマップされます。 主キーに現れる順序でキーが挿入されるため、セカンダリインデックスはそれほど効率的に作成されません。 OPTIMIZE TABLE は、通常の InnoDB テーブルおよびパーティション化された InnoDB テーブルを再構築するためのオンライン DDL サポートが追加されてサポートされています。

  • 一時カラム (DATEDATETIME または TIMESTAMP) を含み、 ALGORITHM=COPY を使用して再構築されていない MySQL 5.6 より前に作成されたテーブルは、ALGORITHM=INPLACE をサポートしていません。 この場合は、ALTER TABLE ... ALGORITHM=INPLACE 操作によって次のエラーが返されます。

    ERROR 1846 (0A000): ALGORITHM=INPLACE is not supported.
    Reason: Cannot change column type INPLACE. Try ALGORITHM=COPY.
  • 通常、テーブルの再構築を伴う大規模なテーブルに対するオンライン DDL 操作には、次の制限が適用されます:

    • オンライン DDL 操作を一時停止したり、オンライン DDL 操作の I/O または CPU 使用率を抑制するメカニズムはありません。

    • オンライン DDL 操作のロールバックは、操作が失敗した場合にコストがかかる可能性があります。

    • オンライン DDL 操作を長時間実行すると、レプリケーションラグが発生する可能性があります。 オンライン DDL 操作は、レプリカで実行する前にソースで実行を終了する必要があります。 また、ソースで同時に処理された DML は、レプリカでの DDL 操作が完了した後にのみレプリカで処理されます。

    大規模なテーブルに対するオンライン DDL 操作の実行に関連する追加情報は、セクション15.12.2「オンライン DDL のパフォーマンスと同時実行性」 を参照してください。


関連キーワード:  InnoDB, テーブル, オンライン, 操作, 構成, ロック, 実行, インデックス, トランザクション, 圧縮