このトピックでは、PolarDB for MySQLの一般的なDDL操作について説明します。 このトピックは、ユーザーがDDL操作の動作を理解し、潜在的なリスクを評価し、これらの操作がビジネス活動に与える影響を最小限に抑えるのに役立つことを目的としています。
概要
MySQLでは、DDL操作は、インデックス、主キー、列、テーブル、外部キー、および生成された列に対する一連の複雑な操作です。 DDL操作は、大量の時間とハードウェアリソースを消費するだけでなく、テーブルをロックする可能性もあります。 不適切な使用は、ビジネスに深刻な影響を与える可能性があります。
長年の開発を経て、PolarDB for MySQLのDDLモジュールはパフォーマンスとロックの安定性を大幅に改善しました。 このトピックでは、さまざまなバージョンのPolarDB for MySQLで一般的なDDL操作について、次の点で説明します。
オペレーションが同時DMLを許可するかどうか: テーブルをロックするDDLオペレーションは、同時DMLオペレーションを許可しません。 ただし、DDL操作でオンラインDDL機能がサポートされている場合は、メタデータの変更中にのみテーブルをロックします。これは、ほとんどの場合1秒未満であり、テーブルスキーマの変更時にテーブルに対する読み取りおよび書き込み操作が可能です。 これにより、運用環境でのテーブルの応答性と可用性が向上します。 対照的に、オンラインDDLをサポートしていないDDL操作は、実行プロセス全体を通してテーブルをロックし、同時書き込み操作を防止します。 このようなDDL操作の実行が長期間続くと、ビジネスに重大な影響が生じる可能性があります。
テーブルを再構築するかどうか: テーブルを再構築する操作には、新しいテーブルスキーマに基づいてプライマリキーとすべてのセカンダリインデックスを再作成する必要があるため、時間がかかります。
説明PolarDB for MySQLは並列DDLをサポートしています。 したがって、gh-ostやpt-oscなどのサードパーティのツールを使用するよりも、クラスターエンジンでDDL操作を実行することでパフォーマンスを向上させることができます。
操作がメタデータのみを変更するかどうか: DDL操作がメタデータのみを変更し、テーブル内のデータは変更しない場合、テーブルサイズに関係なく即座に実行されます。
並列DDLがサポートされているかどうか: 大きなテーブルにインデックスを作成したり、テーブルを再構築したりするシナリオでは、複数のスレッドを使用してDDL実行を高速化し、DDL操作のパフォーマンスを最大15〜20倍向上させる並列DDLを使用できます。 詳細については、「パラレルDDL」をご参照ください。
DDLアルゴリズム
PolarDB for MySQLは、次のDDLアルゴリズムをサポートしています。
INSTANT: ALGORITHMをINSTANTに設定すると、DDL操作はデータディクショナリのメタデータのみを変更します。 データを変更または複製することも、テーブルを再作成することもありません。 したがって、テーブルサイズの影響を受けず、すぐに完了します。
INPLACE: ALGORITHMをINPLACEに設定すると、データのレプリケーションと再編成がクラスタエンジンによって実行され、DDL操作の実行がより効率的になります。 ほとんどのDDL操作では、同時の読み取りと書き込みが許可され、ビジネスへの影響を最小限に抑えます。 さらに、RENAME TABLEやADD COMMENTなどの一部のDDL操作は、テーブルのメタデータのみを変更するため、即座に完了できます。
COPY: ALGORITHMをCOPYに設定すると、DDL操作はテーブルのすべてのデータを新しいテーブルに複製します。 データ複製中、元のテーブルのSNW (SHARED_NO_WRITE) ロックが保持されます。 したがって、DDL操作の実行中は読み取りのみがサポートされます。 同時書き込みは許可されていないため、ビジネスに大きな影響を与えます。
同時の読み取りと書き込みを許可するDDL操作は、オンラインDDLと呼ばれます。 オンラインDDLは、ビジネス活動に比較的小さな影響を与えます。 ほとんどの場合、DDLアルゴリズムを手動で指定する必要はありません。 PolarDBは、INSTANT、INPLACE、およびCOPYを順番に試すことで、最適なアルゴリズムを自動的に選択します。 ALTER TABLE文でALGORITHM句とLOCK句を使用して、DDL操作をきめ細かく管理できます。
ALGORITHM句: 指定されたアルゴリズムでDDL操作を実行します。 有効な値は、DEFAULT、INSTANT、INPLACE、およびCOPYです。 DDL操作が指定されたALGORITHM値をサポートしない場合、エラーが返されます。
LOCK句: DDL実行中のテーブルへの同時アクセスを制御します。 LOCK句を使用して、テーブルの変更時の同時読み取りと書き込みを制御できます。 有効な値は次のとおりです。
DEFAULT: 特定のDDL操作で許可されている数の同時読み取りと書き込みを許可します。
NONE: DDL実行中の同時読み取りと書き込みを許可します。 このようなレベルの同時アクセスがDDL操作によって許可されない場合、エラーが返されます。
共有: 同時読み取りは許可しますが、書き込みはブロックします。 同時読み取りが許可されない場合、エラーが返されます。
EXCLUSIVE: DDL実行中のすべての同時読み取りと書き込みをブロックします。
ALTER tableの実行中にテーブルの可用性を確保するには、LOCK句を使用します。 DDL操作でLOCK句で指定されているレベルよりも制限されたレベルのロックが必要な場合、DDL操作は直ちに停止します。
DDL操作
インデックス操作
PolarDB for MySQL 8.0.2
操作 | 同時DMLを許可 | 再構築テーブル | メタデータのみを変更 | パラレルDDLをサポート |
セカンダリインデックスの作成 | はい | いいえ | 継続しない | 継続する |
セカンダリインデックスを削除する | はい | 継続しない | 継続する | 非該当 |
セカンダリインデックスの名前変更 | はい | 継続しない | 継続する | 非該当 |
FULLTEXTインデックスの追加 | いいえ | いいえ 説明 最初のフルテキストインデックスがテーブルに作成されている場合、ユーザー定義のFTS_DOC_ID列がないため、追加のテーブルが再構築されます。 | いいえ | いいえ |
SPATIALインデックスを追加する | いいえ | いいえ | いいえ | いいえ |
PolarDB for MySQL 8.0.1
操作 | 同時DMLを許可 | 再構築テーブル | メタデータのみを変更 | パラレルDDLをサポート |
セカンダリインデックスの作成 | はい | いいえ | 継続しない | 継続する |
セカンダリインデックスを削除する | はい | 継続しない | 継続する | 非該当 |
セカンダリインデックスの名前変更 | はい | 継続しない | 継続する | 非該当 |
FULLTEXTインデックスの追加 | いいえ | いいえ 説明 最初のフルテキストインデックスがテーブルに作成されている場合、ユーザー定義のFTS_DOC_ID列がないため、追加のテーブルが再構築されます。 | いいえ | いいえ |
SPATIALインデックスを追加する | いいえ | いいえ | いいえ | いいえ |
PolarDB for MySQLの5.7
操作 | 同時DMLを許可 | 再構築テーブル | メタデータのみを変更 | パラレルDDLをサポート |
セカンダリインデックスの作成 | はい | いいえ | 継続しない | 継続する |
セカンダリインデックスを削除する | はい | 継続しない | 継続する | 非該当 |
セカンダリインデックスの名前変更 | はい | 継続しない | 継続する | 非該当 |
FULLTEXTインデックスの追加 | いいえ | いいえ 説明 最初のフルテキストインデックスがテーブルに作成されている場合、ユーザー定義のFTS_DOC_ID列がないため、追加のテーブルが再構築されます。 | いいえ | いいえ |
SPATIALインデックスを追加する | いいえ | いいえ | いいえ | いいえ |
PolarDB for MySQLの5.6
操作 | 同時DMLを許可 | 再構築テーブル | メタデータのみを変更 | パラレルDDLをサポート |
セカンダリインデックスの作成 | はい | いいえ | いいえ | いいえ |
セカンダリインデックスを削除する | はい | 継続しない | 継続する | 非該当 |
セカンダリインデックスの名前変更 | はい | 継続しない | 継続する | 非該当 |
FULLTEXTインデックスの追加 | いいえ | いいえ 説明 最初のフルテキストインデックスがテーブルに作成されている場合、ユーザー定義のFTS_DOC_ID列がないため、追加のテーブルが再構築されます。 | いいえ | いいえ |
SPATIALインデックスを追加する | いいえ | いいえ | いいえ | いいえ |
主キー操作
PolarDB for MySQL 8.0.2
操作 | 同時DMLを許可 | 再構築テーブル | メタデータのみを変更 | パラレルDDLをサポート |
主キーの作成 | はい | はい | 継続しない | 継続する |
主キーを削除するDrop a primary key | 継続しない | 継続する | いいえ | いいえ |
主キーをドロップして別のキーを追加する | はい | はい | 継続しない | 継続する |
PolarDB for MySQL 8.0.1
操作 | 同時DMLを許可 | 再構築テーブル | メタデータのみを変更 | パラレルDDLをサポート |
主キーの作成 | はい | はい | 継続しない | 継続する |
主キーを削除するDrop a primary key | 継続しない | 継続する | いいえ | いいえ |
主キーをドロップして別のキーを追加する | はい | はい | 継続しない | 継続する |
PolarDB for MySQLの5.7
操作 | 同時DMLを許可 | 再構築テーブル | メタデータのみを変更 | パラレルDDLをサポート |
主キーの作成 | はい | はい | 継続しない | 継続する |
主キーを削除するDrop a primary key | 継続しない | 継続する | いいえ | いいえ |
主キーをドロップして別のキーを追加する | はい | はい | 継続しない | 継続する |
PolarDB for MySQLの5.6
操作 | 同時DMLを許可 | 再構築テーブル | メタデータのみを変更 | パラレルDDLをサポート |
主キーの作成 | はい | はい | いいえ | いいえ |
主キーを削除するDrop a primary key | 継続しない | 継続する | いいえ | いいえ |
主キーをドロップして別のキーを追加する | はい | はい | いいえ | いいえ |
列操作
PolarDB for MySQL 8.0.2
操作 | 同時DMLを許可 | 再構築テーブル | メタデータのみを変更 | パラレルDDLをサポート |
列の追加 | はい | 1なし | はい1 | はい1 |
列を削除する | はい | はい | 継続しない | 継続する |
列の名前変更 | はい | 継続しない | 継続する | 非該当 |
列の並べ替え | はい | はい | 継続しない | 継続する |
列のデフォルト値を指定する | はい | 継続しない | 継続する | 非該当 |
列コメントの変更 | はい | 継続しない | 継続する | 非該当 |
列データ型の変更 | 継続しない | 継続する | いいえ | いいえ |
VARCHAR列の長さを拡張する | はい2 | 継続しない | 継続する | 非該当 |
文字セットをUTF8mb3からUTF8mb4に変更する | いいえ | 3なし | はい3 | いいえ |
列のデフォルト値を削除する | はい | 継続しない | 継続する | 非該当 |
自動インクリメント値の変更 | はい | 継続しない | 継続する | 非該当 |
列をNULLにする | はい | はい | 継続しない | 継続する |
列をNULLではないようにする | はい | はい | 継続しない | 継続する |
ENUMまたはSET列の定義を変更する | はい | いいえ | はい4 | 非該当 |
インスタントADD COLUMN機能を使用すると、テーブルの最後にのみ列を追加できます。 テーブルにプライマリキーが指定されていない場合は、必ず
implicit_primery_key
パラメーターをOFFに設定してください。 これにより、テーブルの末尾に暗黙の主キー列があるため、列の追加に失敗するのを防ぎます。 インスタントADD COLUMN機能は、圧縮テーブル (ROW_FORMAT=compressed) 、フルテキストインデックスを持つテーブル、または一時テーブルではサポートされません。 クラスターがインスタントADD COLUMN機能をサポートしていない場合、システムはINPLACEアルゴリズムを使用して列を追加します。 これにより、テーブルの再構築がトリガーされます。 テーブルの再構築プロセス中、同時の読み取りおよび書き込み操作が許可されます。 並列DDL機能を使用して、列の追加を高速化できます。インメモリ列インデックス (IMCI) を含むテーブルに列を追加すると、IMCIが再構築されます。 したがって、IMCIを含むテーブルでは、インスタントADD列機能はサポートされません。 この問題を解決するには、
loose_imci_enable_add_column_instant_ddl
パラメーターをONに設定して、インスタントADD COLUMN機能を有効にします。 このようにして、IMCIはPolarDBによってバックグラウンドで非同期的に再構築され、一時的に利用できなくなります。 詳細については、「DDLステートメントを実行してIMCIを動的に作成および削除する」をご参照ください。VARCHAR列の長さを即座に増やすには、VARCHAR列の値を格納するために使用されるバイト数が同じであることを確認します。 サイズが0〜255バイトの範囲内のVARCHAR列には、1バイトのストレージが必要です。 サイズが256バイト以上のVARCHAR列には、2バイトのストレージが必要です。 VARCHAR列の長さを同じ範囲 (0〜255バイトまたは256バイト以上) 内で制御した場合のみ、ストレージ要件は変わりません。 これらのシナリオでは、ALTER TABLEステートメントの実行時にメタデータのみが更新されます。 長さが255バイトのしきい値を超えると、PolarDBは自動的にCOPYアルゴリズムを使用します。 このプロセスには、読み取りのみが許可されるテーブルロックが含まれます。
変更されたVARCHAR列の長さが同じバイトサイズの範囲内にあるかどうかわからない場合は、DDL操作に
ALGORITHM=INPLACE
句を使用します。 インスタント列拡張がサポートされていない場合、エラーが返されます。 例:ALTER TABLE table_name ALGORITHM=INPLACE, CHANGE COLUMN c1 c1 VARCHAR(256); ERROR 0A000: ALGORITHM=INPLACE is not supported. Reason: Cannot change column type INPLACE. Try ALGORITHM=COPY.
VARCHAR値によって消費されるスペースは、実際の長さによって異なります。 そのため、VARCHAR列の最大長を256バイト以上に設定して、列長拡張のテーブルコピー (ALGORITHM=copy) を回避することを推奨します。
次の条件を満たす場合、列の文字セットがUTF8mb3からUTF8mb4に変更され、メタデータのみが変更されます。 条件が満たされない場合、COPYアルゴリズムが使用される。 これにより、テーブルのロックと再構築が行われ、その間は読み取り操作のみが許可されます。
列タイプは、CHAR、VARCHAR、ENUM、またはTEXTです。
変更する列にインデックスが存在しません。
列の最大長は、255バイトまで、または255バイト以上のいずれかで一貫しています。
ALGORITHM=INPLACEを指定すると、テーブルの再構築を必要とせずにDDLを強制的に実行できます。 DDL操作がCOPYアルゴリズムを使用してのみ実行できる場合、エラーが返されます。 例:
ALTER TABLE test modify column b char(1) CHARACTER SET utf8mb4 default null,algorithm = inplace; ERROR 1846 (0A000): ALGORITHM=INPLACE is not supported. Reason: Cannot change column type INPLACE. Try ALGORITHM=COPY.
ENUM列またはSET列の定義を変更すると、データ型のストレージサイズが変更されず、リストの最後にメンバーが追加されるという条件が満たされた場合にのみ、メタデータが変更されます。 それ以外の場合は、テーブルコピーが必要です。
PolarDB for MySQL 8.0.1
操作 | 同時DMLを許可 | 再構築テーブル | メタデータのみを変更 | パラレルDDLをサポート |
列の追加 | はい | 1なし | はい1 | はい1 |
列を削除する | はい | はい | 継続しない | 継続する |
列の名前変更 | はい | 継続しない | 継続する | 非該当 |
列の並べ替え | はい | はい | 継続しない | 継続する |
列のデフォルト値を指定する | はい | 継続しない | 継続する | 非該当 |
列コメントの変更 | はい | 継続しない | 継続する | 非該当 |
列データ型の変更 | 継続しない | 継続する | いいえ | いいえ |
VARCHAR列の長さを拡張する | はい2 | 継続しない | 継続する | 非該当 |
文字セットをUTF8mb3からUTF8mb4に変更する | いいえ | 3なし | はい3 | いいえ |
列のデフォルト値を削除する | はい | 継続しない | 継続する | 非該当 |
自動インクリメント値の変更 | はい | 継続しない | 継続する | 非該当 |
列をNULLにする | はい | はい | 継続しない | 継続する |
列をNULLではないようにする | はい | はい | 継続しない | 継続する |
ENUMまたはSET列の定義を変更する | はい | いいえ | はい4 | 非該当 |
インスタントADD COLUMN機能を使用すると、テーブルの最後に列を追加できます。 テーブルにプライマリキーが指定されていない場合は、必ず
implicit_primery_key
パラメーターをOFFに設定してください。 これにより、テーブルの末尾に暗黙の主キー列があるため、列の追加に失敗するのを防ぎます。 インスタントADD COLUMN機能は、圧縮テーブル (ROW_FORMAT=compressed) 、フルテキストインデックスを持つテーブル、または一時テーブルではサポートされません。 クラスターがインスタントADD COLUMN機能をサポートしていない場合、システムはINPLACEアルゴリズムを使用して列を追加します。 これにより、テーブルの再構築がトリガーされます。 テーブルの再構築プロセス中、同時の読み取りおよび書き込み操作が許可されます。 並列DDL機能を使用して、列の追加を高速化できます。インメモリ列インデックス (IMCI) を含むテーブルに列を追加すると、IMCIが再構築されます。 したがって、IMCIを含むテーブルでは、インスタントADD列機能はサポートされません。 解決策は、
loose_imci_enable_add_column_instant_ddl
をONに設定することで、インスタントCOLUMN機能を有効にすることです。 このようにして、IMCIはPolarDBによってバックグラウンドで非同期的に再構築され、一時的に利用できなくなります。 詳細については、「DDLステートメントを実行してIMCIを動的に作成および削除する」をご参照ください。VARCHAR列の長さを即座に増やすには、VARCHAR列の値を格納するために使用されるバイト数が同じであることを確認します。 サイズが0〜255バイトの範囲内のVARCHAR列には、1バイトのストレージが必要です。 サイズが256バイト以上のVARCHAR列には、2バイトのストレージが必要です。 VARCHAR列の長さを同じ範囲 (0〜255バイトまたは256バイト以上) 内で制御した場合のみ、ストレージ要件は変わりません。 これらのシナリオでは、ALTER TABLEステートメントの実行時にメタデータのみが更新されます。 長さが255バイトのしきい値を超えると、PolarDBは自動的にCOPYアルゴリズムを使用します。 このプロセスにはテーブルロックが含まれ、その間は読み取り操作のみが許可されます。
変更されたVARCHAR列の長さが同じバイトサイズの範囲内にあるかどうかわからない場合は、DDL操作に
ALGORITHM=INPLACE
句を使用します。 インスタント列拡張がサポートされていない場合、エラーが返されます。 例:ALTER TABLE table_name ALGORITHM=INPLACE, CHANGE COLUMN c1 c1 VARCHAR(256); エラー0A000: ALGORITHM=INPLACEはサポートされていません。 理由: 列タイプINPLACEを変更できません。 ALGORITHM=COPYを試してください。
VARCHAR値によって消費されるスペースは、実際の長さによって異なります。 そのため、VARCHAR列の最大長を256バイト以上に設定して、列長拡張のテーブルコピー (ALGORITHM=copy) を回避することを推奨します。
loose_innodb_support_instant_modify_charset
がONに設定されていて、次の条件が満たされている場合、メタデータのみを変更して、列の文字セットをUTF8mb3からUTF8mb4に変更できます。 条件が満たされない場合、COPYアルゴリズムが使用される。 これにより、テーブルのロックと再構築が行われ、その間は読み取り操作のみが許可されます。列タイプは、CHAR、VARCHAR、ENUM、またはTEXTです。
変更する列にインデックスが存在しません。
列の最大長は、255バイトまで、または255バイト以上のいずれかで一貫しています。
ALGORITHM=INPLACEを指定すると、テーブルの再構築を必要とせずにDDLを強制的に実行できます。 DDL操作がCOPYアルゴリズムを使用してのみ実行できる場合、エラーが返されます。 例:
ALTER TABLEテストは列b charを変更します (1) CHARACTER SET utf8mb4デフォルトnull、algorithm = inplace; エラー1846 (0A000): ALGORITHM=INPLACEはサポートされていません。 理由: 列タイプINPLACEを変更できません。 ALGORITHM=COPYを試してください。
ENUM列またはSET列の定義を変更すると、データ型のストレージサイズが変更されず、リストの最後にメンバーが追加された場合にのみ、メタデータが変更されます。 それ以外の場合は、テーブルコピーが必要です。
PolarDB for MySQLの5.7
操作 | 同時DMLを許可 | 再構築テーブル | メタデータのみを変更 | パラレルDDLをサポート |
列の追加 | はい | 1なし | はい1 | はい1 |
列を削除する | はい | はい | 継続しない | 継続する |
列の名前変更 | はい | 継続しない | 継続する | 非該当 |
列の並べ替え | はい | はい | 継続しない | 継続する |
列のデフォルト値を指定する | はい | 継続しない | 継続する | 非該当 |
列コメントの変更 | はい | 継続しない | 継続する | 非該当 |
列データ型の変更 | 継続しない | 継続する | いいえ | いいえ |
VARCHAR列の長さを拡張する | はい2 | 継続しない | 継続する | 非該当 |
文字セットをUTF8mb3からUTF8mb4に変更する | 継続しない | 継続する | いいえ | いいえ |
列のデフォルト値を削除する | はい | 継続しない | 継続する | 非該当 |
自動インクリメント値の変更 | はい | 継続しない | 継続する | 非該当 |
列をNULLにする | はい | はい | 継続しない | 継続する |
列をNULLではないようにする | はい | はい | 継続しない | 継続する |
ENUMまたはSET列の定義を変更する | はい | いいえ | はい3 | 非該当 |
インスタントADD COLUMN機能を有効にするには、
loose_innodb_support_instant_add_column
をONに設定します。 この機能を使用すると、テーブルの最後にのみ列を追加できます。 テーブルにプライマリキーが指定されていない場合は、必ずimplicit_primery_key
パラメーターをOFFに設定してください。 これにより、テーブルの末尾に暗黙の主キー列があるため、列の追加に失敗するのを防ぎます。 インスタントADD COLUMN機能は、圧縮テーブル (ROW_FORMAT=compressed) 、フルテキストインデックスを持つテーブル、または一時テーブルではサポートされません。 クラスターがインスタントADD COLUMN機能をサポートしていない場合、システムはINPLACEアルゴリズムを使用して列を追加します。 これにより、テーブルの再構築がトリガーされます。 テーブルの再構築プロセス中、同時の読み取りおよび書き込み操作が許可されます。 並列DDL機能を使用して、列の追加を高速化できます。VARCHAR列の長さを即座に増やすには、VARCHAR列の値を格納するために使用されるバイト数が同じであることを確認します。 サイズが0〜255バイトの範囲内のVARCHAR列には、1バイトのストレージが必要です。 サイズが256バイト以上のVARCHAR列には、2バイトのストレージが必要です。 VARCHAR列の長さを同じ範囲 (0〜255バイトまたは256バイト以上) 内で制御した場合のみ、ストレージ要件は変わりません。 これらのシナリオでは、ALTER TABLEステートメントの実行時にメタデータのみが更新されます。 長さが255バイトのしきい値を超えると、PolarDBは自動的にCOPYアルゴリズムを使用します。 このプロセスにはテーブルロックが含まれ、その間は読み取り操作のみが許可されます。
変更されたVARCHAR列の長さが同じバイトサイズの範囲内にあるかどうかわからない場合は、DDL操作に
ALGORITHM=INPLACE
句を使用します。 インスタント列拡張がサポートされていない場合、エラーが返されます。 例:ALTER TABLE table_name ALGORITHM=INPLACE, CHANGE COLUMN c1 c1 VARCHAR(256); エラー0A000: ALGORITHM=INPLACEはサポートされていません。 理由: 列タイプINPLACEを変更できません。 ALGORITHM=COPYを試してください。
VARCHAR値によって消費されるスペースは、実際の長さによって異なります。 そのため、VARCHAR列の最大長を256バイト以上に設定して、列長拡張のテーブルコピー (ALGORITHM=copy) を回避することを推奨します。
ENUM列またはSET列の定義を変更すると、データ型のストレージサイズが変更されず、リストの最後にメンバーが追加された場合にのみ、メタデータが変更されます。 それ以外の場合は、テーブルコピーが必要です。
PolarDB for MySQLの5.6
操作 | 同時DMLを許可 | 再構築テーブル | メタデータのみを変更 | パラレルDDLをサポート |
列の追加 | はい | 1なし | はい1 | いいえ |
列を削除する | はい | はい | いいえ | いいえ |
列の名前変更 | はい | 継続しない | 継続する | 非該当 |
列の並べ替え | はい | はい | いいえ | いいえ |
列のデフォルト値を指定する | はい | 継続しない | 継続する | 非該当 |
列コメントの変更 | はい | 継続しない | 継続する | 非該当 |
列データ型の変更 | 継続しない | 継続する | いいえ | いいえ |
VARCHAR列の長さを拡張する | 継続しない | 継続する | いいえ | いいえ |
文字セットをUTF8mb3からUTF8mb4に変更する | 継続しない | 継続する | いいえ | いいえ |
列のデフォルト値を削除する | はい | 継続しない | 継続する | 非該当 |
自動インクリメント値の変更 | はい | 継続しない | 継続する | 非該当 |
列をNULLにする | はい | はい | いいえ | いいえ |
列をNULLではないようにする | はい | はい | いいえ | いいえ |
ENUMまたはSET列の定義を変更する | はい | いいえ | はい2 | 非該当 |
インスタントADD COLUMN機能を有効にするには、
loose_innodb_support_instant_add_列
パラメーターをONに設定します。 この機能を使用すると、テーブルの最後にのみ列を追加できます。 テーブルにプライマリキーが指定されていない場合は、必ずimplicit_primery_key
パラメーターをOFFに設定してください。 これにより、テーブルの末尾に暗黙の主キー列があるため、列の追加に失敗するのを防ぎます。 インスタントADD COLUMN機能は、圧縮テーブル (ROW_FORMAT=compressed) 、フルテキストインデックスを持つテーブル、一時テーブル、またはパーティションテーブルではサポートされません。 クラスターがインスタントADD COLUMN機能をサポートしていない場合、システムはINPLACEアルゴリズムを使用して列を追加します。 これにより、テーブルの再構築がトリガーされます。 テーブルの再構築プロセス中、同時の読み取りおよび書き込み操作が許可されます。説明PolarDB For MySQL 5.6の場合、インスタントADD COLUMN機能はカナリアリリースにあります。 この機能を使用するには、クォータセンターに移動し、クォータID
polardb_mysql_iac_56
に対応するクォータ名を見つけ、[適用] をクリックします。ENUM列またはSET列の定義を変更すると、データ型のストレージサイズが変更されず、リストの最後にメンバーが追加された場合にのみ、メタデータが変更されます。 それ以外の場合は、テーブルコピーが必要です。
テーブル操作
PolarDB for MySQL 8.0.2
操作 | 同時DMLを許可 | 再構築テーブル | メタデータのみを変更 | パラレルDDLをサポート |
ROW_FORMAT属性の変更 | はい | はい | 継続しない | 継続する |
KEY_BLOCK_SIZE属性の変更 | はい | はい | 継続しない | 継続する |
永続統計の設定 | はい | 継続しない | 継続する | 非該当 |
文字セットの指定 | はい | 継続しない | 継続する | 非該当 |
文字セットの変更 | 継続しない | 継続する | いいえ | いいえ |
テーブルの最適化 | はい | はい 説明
| 継続しない | 継続する |
テーブルの再構築 | はい | はい | 継続しない | 継続する |
テーブル名の変更 | はい | 継続しない | 継続する | 非該当 |
テーブルコメントの変更 | はい | 継続しない | 継続する | 非該当 |
PolarDB for MySQL 8.0.1
操作 | 同時DMLを許可 | 再構築テーブル | メタデータのみを変更 | パラレルDDLをサポート |
ROW_FORMAT属性の変更 | はい | はい | 継続しない | 継続する |
KEY_BLOCK_SIZE属性の変更 | はい | はい | 継続しない | 継続する |
永続統計の設定 | はい | 継続しない | 継続する | 非該当 |
文字セットの指定 | はい | 継続しない | 継続する | 非該当 |
文字セットの変更 | 継続しない | 継続する | いいえ | いいえ |
テーブルの最適化 | はい | はい 説明
| 継続しない | 継続する |
テーブルの再構築 | はい | はい | 継続しない | 継続する |
テーブル名の変更 | はい | 継続しない | 継続する | 非該当 |
テーブルコメントの変更 | はい | 継続しない | 継続する | 非該当 |
PolarDB for MySQLの5.7
操作 | 同時DMLを許可 | 再構築テーブル | メタデータのみを変更 | パラレルDDLをサポート |
ROW_FORMAT属性の変更 | はい | はい | 継続しない | 継続する |
KEY_BLOCK_SIZE属性の変更 | はい | はい | 継続しない | 継続する |
永続統計の設定 | はい | 継続しない | 継続する | 非該当 |
文字セットの指定 | はい | 継続しない | 継続する | 非該当 |
文字セットの変更 | 継続しない | 継続する | いいえ | いいえ |
テーブルの最適化 | はい | はい 説明
| 継続しない | 継続する |
テーブルの再構築 | はい | はい | 継続しない | 継続する |
テーブル名の変更 | はい | 継続しない | 継続する | 非該当 |
テーブルコメントの変更 | はい | 継続しない | 継続する | 非該当 |
PolarDB for MySQLの5.6
操作 | 同時DMLを許可 | 再構築テーブル | メタデータのみを変更 | パラレルDDLをサポート |
ROW_FORMAT属性の変更 | はい | はい | いいえ | いいえ |
KEY_BLOCK_SIZE属性の変更 | はい | はい | いいえ | いいえ |
永続統計の設定 | はい | 継続しない | 継続する | 非該当 |
文字セットの指定 | はい | 継続しない | 継続する | 非該当 |
文字セットの変更 | 継続しない | 継続する | いいえ | いいえ |
テーブルの最適化 | はい | はい 説明
| いいえ | いいえ |
テーブルを再作成する | はい | はい | いいえ | いいえ |
テーブル名の変更 | はい | 継続しない | 継続する | 非該当 |
テーブルコメントの変更 | はい | 継続しない | 継続する | 非該当 |
生成された列操作
PolarDB for MySQL 8.0.2
操作 | 同時DMLを許可 | 再構築テーブル | メタデータのみを変更 | パラレルDDLをサポート |
STORED列の追加 | いいえ 説明 操作にはSQL/Serverレイヤーが含まれるため、Online DDLを介したSTORED列の追加はサポートされません。 | はい | いいえ | いいえ |
STORED列の順序を変更する | 継続しない | 継続する | いいえ | いいえ |
STORED列を削除する | はい | はい | 継続しない | 継続する |
VIRTUAL列の追加 | はい | 継続しない | 継続する | 非該当 |
VIRTUAL列の順序を変更する | 継続しない | 継続する | いいえ | いいえ |
仮想列を削除する | はい | 継続しない | 継続する | 非該当 |
PolarDB for MySQL 8.0.1
操作 | 同時DMLを許可 | 再構築テーブル | メタデータのみを変更 | パラレルDDLをサポート |
STORED列の追加 | いいえ 説明 操作にはSQL/Serverレイヤーが含まれるため、Online DDLを介したSTORED列の追加はサポートされません。 | はい | いいえ | いいえ |
STORED列の順序を変更する | 継続しない | 継続する | いいえ | いいえ |
STORED列を削除する | はい | はい | 継続しない | 継続する |
VIRTUAL列の追加 | はい | 継続しない | 継続する | 非該当 |
VIRTUAL列の順序を変更する | 継続しない | 継続する | いいえ | いいえ |
仮想列を削除する | はい | 継続しない | 継続する | 非該当 |
PolarDB for MySQLの5.7
操作 | 同時DMLを許可 | 再構築テーブル | メタデータのみを変更 | パラレルDDLをサポート |
STORED列の追加 | いいえ 説明 操作にはSQL/Serverレイヤーが含まれるため、Online DDLを介したSTORED列の追加はサポートされません。 | はい | いいえ | いいえ |
STORED列の順序を変更する | 継続しない | 継続する | いいえ | いいえ |
STORED列を削除する | はい | はい | 継続しない | 継続する |
VIRTUAL列の追加 | はい | 継続しない | 継続する | 非該当 |
VIRTUAL列の順序を変更する | 継続しない | 継続する | いいえ | いいえ |
仮想列を削除する | はい | 継続しない | 継続する | 非該当 |
PolarDB for MySQLの5.6
PolarDB for MySQL 5.6は、生成された列操作をサポートしていません。
外部キー操作
PolarDB for MySQL 8.0.2
操作 | 同時DMLを許可 | 再構築テーブル | メタデータのみを変更 | パラレルDDLをサポート |
外部キーを追加する | はい1 | 1なし | はい1 | 非該当 |
外部キーを削除するDrop a foreign key | はい1 | 1なし | はい1 | 非該当 |
PolarDB for MySQL 8.0.1
操作 | 同時DMLを許可 | 再構築テーブル | メタデータのみを変更 | パラレルDDLをサポート |
外部キーを追加する | はい1 | 1なし | はい1 | 非該当 |
外部キーを削除するDrop a foreign key | はい1 | 1なし | はい1 | 非該当 |
PolarDB for MySQLの5.7
操作 | 同時DMLを許可 | 再構築テーブル | メタデータのみを変更 | パラレルDDLをサポート |
外部キーを追加する | はい1 | 1なし | はい1 | 非該当 |
外部キーを削除するDrop a foreign key | はい1 | 1なし | はい1 | 非該当 |
PolarDB for MySQLの5.6
操作 | 同時DMLを許可 | 再構築テーブル | メタデータのみを変更 | パラレルDDLをサポート |
外部キーを追加する | はい1 | 1なし | はい1 | 非該当 |
外部キーを削除するDrop a foreign key | はい1 | 1なし | はい1 | 非該当 |
1. foreign_key_checksオプションが無効になっており、メタデータのみが変更されている場合、インプレース外部キー操作がサポートされます。 これらの条件が満たされない場合、インプレース外部キー操作にはテーブルコピーとロックが必要です。
パーティション化操作
PolarDB for MySQL 8.0.2
操作 | 同時DMLを許可 | 再構築テーブル | メタデータのみを変更 | パラレルDDLをサポート |
パーティションを追加する | はい1 | 2なし | はい | いいえ |
パーティションを削除するDrop a partition | はい1 | 2なし | いいえ | いいえ |
パーティション分割されたテーブルのスペースを破棄する | いいえ | いいえ | いいえ | いいえ |
パーティションテーブルのスペースをインポートする | いいえ | いいえ | いいえ | いいえ |
パーティションを切り捨てる | はい | いいえ | いいえ | いいえ |
Coalesceパーティション | いいえ | はい3 | いいえ | いいえ |
パーティションの再編成 | はい1 | 7なし | いいえ | いいえ |
Exchangeパーティション | はい1 | 継続しない | 継続する | いいえ |
パーティションの分析 | はい | いいえ | 8なし | いいえ |
パーティションの確認 | はい | いいえ | 9なし | いいえ |
パーティションの最適化 | はい4 | はい4 | いいえ | はい4 |
パーティションの再構築 | はい1 | 7なし | いいえ | いいえ |
パーティションを修復する | はい | 10なし | いいえ | いいえ |
通常のテーブルを分割する | 継続しない | 継続する | はい5 | いいえ |
パーティション分割を削除 | 継続しない | 継続する | いいえ | いいえ |
部分インデックスの作成 | はい | 6なし | 継続しない | 継続する |
パーティションのメタデータロック (MDL) を有効にするために
loose_partition_level_mdl_enabled
パラメーターをtrueに設定した後、DDL操作は無関係なパーティションのDML操作に影響を与えません。 詳細については、「オンラインパーティションのメンテナンス」をご参照ください。ADD PARTITIONまたはDROP PARTITIONをRANGEまたはLISTパーティションで使用しても、テーブルを再構築する必要はありません。 ADD PARTITIONまたはDROP PARTITIONをHASHまたはKEYパーティションで使用するには、テーブルの再構築が必要です。 DROP PARTITIONは、HASHまたはKEYパーティションでは使用できません。
COALESCE PARTITIONは、HASHおよびKEYパーティションでのみ使用できます。
InnoDBテーブルでOPTIMIZE PARTITIONを実行すると、パーティションテーブル全体の再構築がトリガーされます。 テーブルの再構築中は、読み取りおよび書き込み操作が許可されます。 パラレルDDLを使用してテーブルの再構築を高速化するには、
innodb_parallel_build_primary_index
パラメーターをONに設定します。 詳細については、「パラレルDDL」をご参照ください。通常のテーブルは、レンジパーティションテーブルにのみ即座に変換できます。 詳細については、「共通テーブルを範囲パーティションテーブルに切り替える」をご参照ください。
PolarDB for MySQLを使用すると、特定のパーティションのインデックスを作成および削除できます。 詳細は、「部分インデックス」をご参照ください。
REORGANIZE PARTITIONおよびREBUILD PARTITIONは、指定されたパーティションのみに影響します。
ANALYZE PARTITIONは、テーブルのメタデータとデータではなく、統計のみを変更します。
CHECK PARTITIONは、テーブルのメタデータとデータを変更しません。
REPAIR PARTITIONは指定されたパーティションのみを再構築します。
PolarDB for MySQL 8.0.1
操作 | 同時DMLを許可 | 再構築テーブル | メタデータのみを変更 | パラレルDDLをサポート |
パーティションを追加する | いいえ | 1なし | はい | いいえ |
パーティションを削除するDrop a partition | いいえ | 2なし | いいえ | いいえ |
パーティション分割されたテーブルのスペースを破棄する | いいえ | いいえ | いいえ | いいえ |
パーティションテーブルのスペースをインポートする | いいえ | いいえ | いいえ | いいえ |
パーティションを切り捨てる | はい | いいえ | いいえ | いいえ |
Coalesceパーティション | 継続しない | 継続する | いいえ | いいえ |
パーティションの再編成 | いいえ | 4なし | いいえ | いいえ |
Exchangeパーティション | はい | はい | はい | いいえ |
パーティションの分析 | はい | はい | 5なし | いいえ |
パーティションの確認 | はい | はい | 6なし | いいえ |
パーティションの最適化 | はい3 | はい3 | いいえ | はい3 |
パーティションの再構築 | いいえ | 4なし | いいえ | いいえ |
パーティションを修復する | はい | 4なし | いいえ | いいえ |
通常のテーブルを分割する | 継続しない | 継続する | いいえ | いいえ |
パーティション分割を削除 | 継続しない | 継続する | いいえ | いいえ |
ADD PARTITIONまたはDROP PARTITIONをRANGEまたはLISTパーティションで使用しても、テーブルを再構築する必要はありません。 HASHおよびKEYパーティションでADD PARTITIONを使用するには、テーブルの再構築が必要です。
DROP PARTITIONは、HASHまたはKEYパーティションでは使用できません。
InnoDBテーブルでOPTIMIZE PARTITIONを実行すると、パーティションテーブル全体の再構築がトリガーされます。 テーブルの再構築中は、読み取りおよび書き込み操作が許可されます。 パラレルDDLを使用してテーブルの再構築を高速化するには、
innodb_parallel_build_primary_index
パラメーターをONに設定します。 詳細については、「パラレルDDL」をご参照ください。REORGANIZE PARTITION、REBUILD PARTITION、およびREPAIR PARTITIONは、指定されたパーティションのみに影響します。
ANALYZE PARTITIONは、テーブルのメタデータとデータではなく、統計のみを変更します。
CHECK PARTITIONは、テーブルのメタデータとデータを変更しません。
PolarDB for MySQLの5.7
操作 | 同時DMLを許可 | 再構築テーブル | メタデータのみを変更 | パラレルDDLをサポート |
パーティションを追加する | いいえ | 1なし | はい | いいえ |
パーティションを削除するDrop a partition | いいえ | 1なし | いいえ | いいえ |
パーティション分割されたテーブルのスペースを破棄する | いいえ | いいえ | いいえ | いいえ |
パーティションテーブルのスペースをインポートする | いいえ | いいえ | いいえ | いいえ |
パーティションを切り捨てる | はい | いいえ | いいえ | いいえ |
Coalesceパーティション | 継続しない | 継続する | いいえ | いいえ |
パーティションの再編成 | いいえ | 2なし | いいえ | いいえ |
Exchangeパーティション | はい | 継続しない | 継続する | いいえ |
パーティションの分析 | はい | いいえ | 3なし | いいえ |
パーティションの確認 | はい | いいえ | 4なし | いいえ |
パーティションの最適化 | 継続しない | 継続する | いいえ | いいえ |
パーティションの再構築 | いいえ | 2なし | いいえ | いいえ |
パーティションを修復する | はい | 2なし | いいえ | いいえ |
通常のテーブルを分割する | 継続しない | 継続する | いいえ | いいえ |
パーティション分割を削除 | 継続しない | 継続する | いいえ | いいえ |
ADD PARTITIONまたはDROP PARTITIONをRANGEまたはLISTパーティションで使用しても、テーブルを再構築する必要はありません。 ADD PARTITIONまたはDROP PARTITIONをHASHまたはKEYパーティションで使用するには、テーブルの再構築が必要です。 DROP PARTITIONは、HASHまたはKEYパーティションでは使用できません。
REORGANIZE PARTITION、REBUILD PARTITION、およびREPAIR PARTITIONは、指定されたパーティションのみに影響します。
ANALYZE PARTITIONは、テーブルのメタデータとデータではなく、統計のみを変更します。
CHECK PARTITIONは、テーブルのメタデータとデータを変更しません。
PolarDB for MySQLの5.6
操作 | 同時DMLを許可 | 再構築テーブル | メタデータのみを変更 | パラレルDDLをサポート |
パーティションを追加する | いいえ | 1なし | はい | いいえ |
パーティションを削除するDrop a partition | いいえ | 1なし | いいえ | いいえ |
パーティション分割されたテーブルのスペースを破棄する | いいえ | いいえ | いいえ | いいえ |
パーティションテーブルのスペースをインポートする | いいえ | いいえ | いいえ | いいえ |
パーティションを切り捨てる | はい | いいえ | いいえ | いいえ |
Coalesceパーティション | 継続しない | 継続する | いいえ | いいえ |
パーティションの再編成 | いいえ | 2なし | いいえ | いいえ |
Exchangeパーティション | はい | 継続しない | 継続する | いいえ |
パーティションの分析 | はい | いいえ | 3なし | いいえ |
パーティションの確認 | はい | いいえ | 4なし | いいえ |
パーティションの最適化 | 継続しない | 継続する | いいえ | いいえ |
パーティションの再構築 | いいえ | 2なし | いいえ | いいえ |
パーティションを修復する | はい | 2なし | いいえ | いいえ |
通常のテーブルを分割する | 継続しない | 継続する | いいえ | いいえ |
パーティション分割を削除 | 継続しない | 継続する | いいえ | いいえ |
ADD PARTITIONまたはDROP PARTITIONをRANGEまたはLISTパーティションで使用しても、テーブルを再構築する必要はありません。 ADD PARTITIONまたはDROP PARTITIONをHASHまたはKEYパーティションで使用するには、テーブルの再構築が必要です。 DROP PARTITIONは、HASHまたはKEYパーティションでは使用できません。
REORGANIZE PARTITION、REBUILD PARTITION、およびREPAIR PARTITIONは、指定されたパーティションのみに影響します。
ANALYZE PARTITIONは、テーブルのメタデータとデータではなく、統計のみを変更します。
CHECK PARTITIONは、テーブルのメタデータとデータを変更しません。
DDL実行メソッド
PolarDB for MySQLがINPLACEまたはINSTANTアルゴリズムを使用する場合、オンラインDDLを使用することを推奨します。 この方法は、より速い実行速度およびより高い安定性を提供する。
ただし、PolarDB for MySQLがCOPYアルゴリズムを使用する場合、DDLを実行するにはテーブルロックが必要であり、読み取りまたは書き込み操作はできません。 この場合、DDLの実行中に読み取りおよび書き込み操作を許可するデータ管理サービス (DMS) またはgh-ostなどのサードパーティのツールを使用することをお勧めします。 ただし、これらのツールは効率が悪く、大きなテーブルや並行性の高いシナリオで膨大なデータの増分を処理する場合に失敗する傾向があります。
次の表は、2つのDDL実行方法を比較しています。
実行方法 | 同時読み取りと書き込みを許可 | 実行速度 | バイナリロギングが必要 | 平行加速をサポート |
オンライン DDL | はい | 速い | 継続しない | 継続する |
DMSまたはgh-ostなどのサードパーティ製ツール | はい | 低 | はい | いいえ |
サードパーティのツールを使用してDDL操作を実行すると、テーブルの切り替えやメタデータの変更中にMDL-Xロックが取得されます。 これにより、テーブルが一時的にロックされます。 テーブルのロックを防ぐ方法については、「Nonblocking DDLステートメント」および「プリエンプティブルDDL」をご参照ください。