このトピックでは、クラウドネイティブデータベース PolarDB for MySQL での一般的なデータ定義言語 (DDL) 操作について説明します。このガイドは、DDL の動作をクエリして理解し、運用リスクを評価し、ビジネスへの影響を軽減するのに役立ちます。
DDL 操作の概要
MySQL エコシステムでは、DDL 操作は複雑です。インデックス、プライマリキー、列、テーブル、外部キー、生成列操作など、さまざまな種類が含まれます。DDL 操作は時間がかかり、リソースを大量に消費し、テーブルロックを伴います。不適切に処理されると、ビジネス運用を中断させ、壊滅的な障害を引き起こす可能性があります。
PolarDB for MySQL の DDL モジュールは、長年の開発を通じて大幅に改善され、パフォーマンスとロックの安定性が向上しました。このトピックでは、PolarDB for MySQL のさまざまなバージョンにおける一般的な DDL 操作の動作を、以下の側面に基づいて説明します。
同時 DML (非ロック) を許可: 非ロック DDL (Online DDL) 文は、メタデータを変更するときにのみ排他的テーブルロックを要求します。このロックは通常 1 秒未満で終了します。スキーマ進化中、ターゲットテーブルからの読み取りと書き込みが可能です。これにより、本番環境での応答速度と可用性が向上します。対照的に、Online DDL をサポートしない文は、その全期間にわたってテーブルをロックし、同時書き込み操作を妨げます。DDL 操作が長時間実行されると、ビジネスに大きな影響を与える可能性があります。
テーブルの再構築 (長い実行時間): このタイプの DDL 操作は、新しいテーブルスキーマに基づいてプライマリキーとすべてのセカンダリインデックスを再作成します。このプロセスは通常、長い時間がかかります。
説明PolarDB for MySQL は並列 DDL をサポートしています。カーネルメソッドを使用して DDL を実行するパフォーマンスは、gh-ost や pt-osc などのサードパーティツールを使用するよりも大幅に優れています。
メタデータのみを変更 (数秒で完了): このタイプの DDL 操作は、テーブルデータを変更せずにメタデータのみを変更します。これらの操作の実行時間はテーブルサイズとともに増加せず、通常は数秒で完了します。
並列 DDL のサポート (マルチスレッドアクセラレーション): インデックスの作成やテーブルの再構築など、大きなテーブルに対する操作の場合、PolarDB は並列 DDL をサポートしています。この機能は、複数のスレッドを使用して DDL 実行効率を向上させ、パフォーマンスを最大 15〜20 倍向上させることができます。詳細については、「並列 DDL」をご参照ください。
パフォーマンスへの影響 (ロックレス変更): ロックレス変更チケットを使用したロックレススキーマ進化の実装は、一時的な切断を防ぎ、オフピーク時間帯にビジネスに影響を与えません。
説明この操作はオフピーク時間帯に実行してください。この操作により、1 秒あたりの入出力操作 (IOPS) と CPU 使用率が増加する可能性があります。
DDL 実行アルゴリズム
PolarDB for MySQL は、次の 3 つの DDL 実行アルゴリズムをサポートしています。
INSTANT アルゴリズム: INSTANT アルゴリズムは、データディクショナリ内のメタデータのみを変更します。既存データを変更またはコピーせず、テーブルを再構築しません。したがって、操作はテーブルサイズに依存せず、数秒で完了します。
INPLACE アルゴリズム: INPLACE アルゴリズムでは、データレプリケーションと再構築がエンジン内で完了するため、実行が高速になります。INPLACE アルゴリズムを使用するほとんどの DDL 操作では、同時読み取りおよび書き込みアクセスが許可されるため、ビジネスへの影響が最小限に抑えられます。さらに、RENAME TABLE や ADD COMMENT など、INPLACE アルゴリズムを使用する一部の DDL 操作は、テーブルデータを変更せずにメタデータのみを変更します。これらの操作は数秒で完了できます。
COPY アルゴリズム: COPY アルゴリズムは、元のテーブルから新しいテーブルにすべてのデータをコピーします。データレプリケーション中、元のテーブルには共有書き込み禁止 (SNW) ロックが保持されます。したがって、DDL 操作中は読み取り操作のみがサポートされます。同時書き込み操作はブロックされ、ビジネスに大きな影響を与えます。
同時読み取りおよび書き込み操作を許可する DDL 操作は、総称して Online DDL と呼ばれます。Online DDL は、ビジネスへの影響が最小限です。通常、DDL アルゴリズムを手動で指定する必要はありません。PolarDB は、INSTANT、INPLACE、COPY の順に最適なアルゴリズムを自動的に選択します。また、ALTER TABLE 文の ALGORITHM 句と LOCK 句を使用して、DDL の動作を詳細に制御することもできます。
ALGORITHM 句: 特定のアルゴリズムを使用して DDL 文を実行するには、ALGORITHM 句を指定できます。使用可能な値は DEFAULT、INSTANT、INPLACE、COPY です。DDL 操作が指定されたアルゴリズムをサポートしていない場合、すぐにエラーが返されます。
LOCK 句: LOCK 句は、DDL 実行中のテーブルへの同時アクセスを調整します。この句を使用して、テーブルの変更中に同時読み取りおよび書き込みアクセスのレベルを制御できます。使用可能なオプションとその説明は次のとおりです。
DEFAULT: カーネルは、DDL タイプに基づいて最大次数の同時読み取りと書き込みを許可します。
NONE: DDL 実行中に同時読み取りと書き込みを許可します。サポートされていない場合は、エラーが返されます。
SHARED: 同時読み取りを許可しますが、書き込みをブロックします。同時読み取りがサポートされていない場合は、エラーが返されます。
EXCLUSIVE: DDL 操作中にすべての同時読み取りおよび書き込み操作を禁止します。
ALTER TABLE の実行中にテーブルにアクセスできなくなるのを防ぐために、ALTER TABLE 文で LOCK 句を指定できます。DDL 実行中のロック動作が指定された要件を満たさない場合、操作はすぐに停止されます。
EXPLAIN DDL 機能を使用した DDL 実行動作のプレビュー
このトピックでは、一般的な DDL 操作の実行動作をリストします。ただし、PolarDB は機能が豊富であるため、実際の DDL 実行動作はさまざまな要因の影響を受ける可能性があります。これらの要因には、ターゲットテーブルの構造、インスタンスパラメーターの構成、および特定の機能が有効になっているかどうかが含まれます。
スキーマ進化のセキュリティと予測可能性を向上させるために、EXPLAIN DDL 機能を使用して、複雑な DDL 操作を実行する前にその実行動作をプレビューできます。
DDL 文の実行動作を表示するには、次の構文を使用します。
{ EXPLAIN | DESCRIBE | DESC } ALTER TABLE ...EXPLAIN DDL を使用すると、次の主要な情報を取得できます。
現在の DDL 操作が正常に実行できるかどうか。
現在の DDL 操作で使用されるアルゴリズムタイプ。値は
INSTANT、INPLACE、またはCOPYです。現在の DDL 操作がテーブルデータ全体を再構築する必要があるかどうか。テーブル全体の再構築には通常、長い時間がかかります。
現在の DDL 文の実行中に同時 DML 操作が許可されるかどうか。
現在の DDL 操作がコミットされていないトランザクションによってブロックされるかどうか。
現在の DDL 操作が並列 DDL アクセラレーションをサポートしているかどうか。サポートされている場合、現在の DDL 操作の並列処理の次数が表示されます。
この情報を事前に理解することで、DDL の影響をより正確に評価し、実行に適した時間を選択し、ロックされたテーブルや過度に長い実行時間など、オンラインサービスへの影響を効果的に回避できます。詳細については、「EXPLAIN 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 をサポート |
プライマリキーの追加 | はい | はい | いいえ | サポートされています |
プライマリキーの削除 | いいえ | はい | いいえ | サポートされていません |
元のプライマリキーを削除して新しいプライマリキーを追加 | はい | はい | いいえ | サポートされています |
PolarDB for MySQL 8.0.1
操作 | 同時 DML を許可 | テーブルを再構築 | メタデータのみを変更 | 並列 DDL をサポート |
プライマリキーの追加 | はい | はい | いいえ | サポート |
プライマリキーの削除 | いいえ | はい | いいえ | サポートされていません |
元のプライマリキーを削除して新しいプライマリキーを追加 | はい | はい | いいえ | サポート |
PolarDB for MySQL 5.7
操作 | 同時 DML を許可 | テーブルを再構築 | メタデータのみを変更 | 並列 DDL をサポート |
プライマリキーの追加 | はい | はい | いいえ | サポートされています |
プライマリキーの削除 | いいえ | はい | いいえ | サポートされていません |
元のプライマリキーを削除して新しいプライマリキーを追加 | はい | はい | いいえ | サポートされています |
PolarDB for MySQL 5.6
操作 | 同時 DML を許可 | テーブルを再構築 | メタデータのみを変更 | 並列 DDL をサポート |
プライマリキーの追加 | はい | はい | いいえ | サポートされていません |
プライマリキーの削除 | いいえ | はい | いいえ | サポートされていません |
元のプライマリキーを削除して新しいプライマリキーを追加 | はい | はい | いいえ | サポートされていません |
次のシナリオでは、sql_mode クラスターパラメーターに STRICT_TRANS_TABLES または STRICT_ALL_TABLES が含まれている場合にのみ、同時 DML が許可されます。
プライマリキーの追加
元のプライマリキーを削除して新しいプライマリキーを追加
カラム操作
PolarDB for MySQL 8.0.2
操作 | 同時 DML を許可 | テーブルを再構築 | メタデータのみを変更 | 並列 DDL をサポート |
カラムを追加する | はい | いいえ¹ | はい¹ | サポートされています¹ |
カラムを削除する | はい | はい | いいえ | サポートされています |
列の名前変更 | はい | いいえ | はい | 該当なし |
カラムを並べ替える | はい | はい | いいえ | サポートされています |
列のデフォルト値の設定 | はい | いいえ | はい | 該当なし |
カラムコメントを変更する | はい | いいえ | はい | 該当なし |
列の型の変更 | いいえ | はい | いいえ | サポートされていません |
VARCHAR の長さの拡張 | はい² | いいえ | はい | 該当なし |
文字セットを UTF8mb3 から UTF8mb4 に変更する | いいえ | いいえ³ | はい³ | サポートされていません |
列のデフォルト値の削除 | はい | いいえ | はい | 該当なし |
自動インクリメント値を変更する | はい | いいえ | はい | 該当なし |
列を NULL に変更 | はい | はい | いいえ | サポート |
列を NOT NULL に変更 | いいえ | はい | いいえ | サポートされていません |
ENUM/SET 列の定義の変更 | はい | いいえ | はい⁴ | 該当なし |
カラム即時追加機能は、テーブルの末尾にのみ列を追加することをサポートしています。テーブルに指定されたプライマリキーがない場合、テーブルの末尾にある暗黙のプライマリキー列が原因で列追加操作が失敗するのを防ぐために、
implicit_primary_keyパラメーターを OFF に設定する必要があります。カラム即時追加機能は、圧縮テーブル (ROW_FORMAT=COMPRESSED)、フルテキストインデックスを持つテーブル、または一時テーブルではサポートされていません。クラスターがカラム即時追加機能をサポートしていない場合、システムは INPLACE アルゴリズムを使用して列を追加します。これにより、テーブルの再構築がトリガーされます。テーブルの再構築プロセス中、同時読み取りおよび書き込み操作が許可されます。並列 DDL 機能を使用して、列の追加を高速化することもできます。VARCHAR 列の長さを拡張する場合、高速な列拡張をサポートするには、長さを格納するために必要なバイト数が同じである必要があります。具体的には、0〜255 バイトの VARCHAR 列は、その長さを格納するために 1 バイトを必要とします。256 バイト以上の VARCHAR 列は 2 バイトを必要とします。ALTER TABLE 文は、VARCHAR 列の長さの拡張が特定の範囲内 (0〜255 バイト、または 256 バイトからより大きなサイズなど) である場合にのみメタデータを変更できます。VARCHAR 列の長さを 256 バイト未満から 256 バイト以上に変更する場合、PolarDB はデフォルトで Copy DDL を使用します。これにより、全期間にわたってテーブルがロックされます。DML 書き込み操作はサポートされませんが、読み取り操作はサポートされます。
VARCHAR 列の変更範囲が上記の条件を満たすかどうかわからない場合は、
ALGORITHM=INPLACEを使用して、現在の DDL 操作に 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 バイト以上に設定することを検討してください。これにより、フィールドを拡張するときに COPY アルゴリズムを使用する必要がなくなります。
次の条件が満たされる場合、列の文字セットを UTF8mb3 から UTF8mb4 に変更すると、データを変更せずにメタデータのみが変更されます。それ以外の場合、COPY アルゴリズムを使用してテーブルが再構築されます。再構築中、テーブルは全期間ロックされます。ターゲットテーブルからは読み取りのみ可能で、書き込み操作はブロックされます。
カラムタイプは CHAR、VARCHAR、ENUM、または TEXT です。
変更された列にインデックスが存在しない。
文字セット変換の前後で、列の最大ストレージ長が 256 バイト未満であるか、255 バイトより大きい。
ALGORITHM=INPLACE を指定して、非再構築メソッドを使用して 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 の末尾に要素を追加する場合にのみ、テーブル全体を再構築せずにメタデータのみを変更できます。それ以外の場合、テーブルを再構築するには COPY アルゴリズムが必要です。
PolarDB for MySQL 8.0.1
操作 | 同時 DML を許可 | テーブルを再構築 | メタデータのみを変更 | 並列 DDL をサポート |
カラムを追加する | はい | いいえ¹ | はい¹ | サポートされています¹ |
カラムを削除する | はい | はい | いいえ | サポート |
列の名前変更 | はい | いいえ | はい | 該当なし |
カラムを並べ替える | はい | はい | いいえ | サポートされています |
列のデフォルト値の設定 | はい | いいえ | はい | 該当なし |
カラムコメントを変更する | はい | いいえ | はい | 該当なし |
列の型の変更 | いいえ | はい | いいえ | サポートされていません |
VARCHAR の長さの拡張 | はい² | いいえ | はい | 該当なし |
文字セットを UTF8mb3 から UTF8mb4 に変更する | いいえ | いいえ³ | はい³ | サポートされていません |
列のデフォルト値の削除 | はい | いいえ | はい | 該当なし |
自動インクリメント値を変更する | はい | いいえ | はい | 該当なし |
列を NULL に変更 | はい | はい | いいえ | サポートされています |
列を NOT NULL に変更 | いいえ | はい | いいえ | サポートされていません |
ENUM/SET 列の定義の変更 | はい | いいえ | はい⁴ | 該当なし |
カラム即時追加機能は、テーブルの末尾にのみ列を追加することをサポートしています。テーブルにプライマリキーがない場合、テーブルの末尾にある暗黙のプライマリキー列が原因で列追加操作が失敗するのを防ぐために、
implicit_primary_keyパラメーターを OFF に設定する必要があります。カラム即時追加機能は、圧縮テーブル (ROW_FORMAT=COMPRESSED)、フルテキストインデックスを持つテーブル、または一時テーブルではサポートされていません。クラスターがカラム即時追加機能をサポートしていない場合、システムは INPLACE アルゴリズムを使用して列を追加します。これにより、テーブル全体の再構築がトリガーされます。再構築中、同時読み取りおよび書き込み操作が許可されます。並列 DDL 機能を使用して操作を高速化することもできます。さらに、テーブルに列ストアインデックスが含まれている場合、列を追加するには列ストアインデックスを再構築する必要があるため、カラム即時追加機能はサポートされていません。
loose_imci_enable_add_column_instant_ddlパラメーターを ON に設定して、カラム即時追加機能を有効にできます。この場合、PolarDB はバックグラウンドで非同期に列ストアインデックスを再構築します。再構築中、列ストアインデックスは一時的に利用できなくなります。詳細については、「列ストアインデックスを動的に追加または削除するための DDL 構文」をご参照ください。VARCHAR 列の長さを拡張する場合、高速な列拡張をサポートするには、長さを格納するために必要なバイト数が同じである必要があります。具体的には、0〜255 バイトの VARCHAR 列は、その長さを格納するために 1 バイトを必要とします。256 バイト以上の VARCHAR 列は 2 バイトを必要とします。ALTER TABLE 文は、VARCHAR 列の長さの拡張が特定の範囲内 (0〜255 バイト、または 256 バイトからより大きなサイズなど) である場合にのみメタデータを変更できます。VARCHAR 列の長さを 256 バイト未満から 256 バイト以上に変更する場合、PolarDB はデフォルトで Copy DDL を使用します。これにより、全期間にわたってテーブルがロックされます。DML 書き込み操作はサポートされませんが、読み取り操作はサポートされます。
VARCHAR 列の変更範囲が上記の条件を満たすかどうかわからない場合は、
ALGORITHM=INPLACEを使用して、現在の DDL 操作に 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 バイト以上に設定することを検討してください。これにより、フィールドを拡張するときに COPY アルゴリズムを使用する必要がなくなります。
loose_innodb_support_instant_modify_charsetパラメーターが ON に設定され、次の条件が満たされる場合、列の文字セットを UTF8mb3 から UTF8mb4 に変更すると、データを変更せずにメタデータのみが変更されます。それ以外の場合、COPY アルゴリズムを使用してテーブルが再構築されます。再構築中、テーブルは全期間ロックされます。ターゲットテーブルからは読み取りのみ可能で、書き込み操作はブロックされます。カラムタイプは CHAR、VARCHAR、ENUM、または TEXT です。
変更された列にインデックスが存在しない。
文字セット変換の前後で、列の最大ストレージ長が 256 バイト未満であるか、255 バイトより大きい。
ALGORITHM=INPLACE を指定して、非再構築メソッドを使用して 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 の末尾に要素を追加する場合にのみ、テーブル全体を再構築せずにメタデータのみを変更できます。それ以外の場合、テーブルを再構築するには COPY アルゴリズムが必要です。
PolarDB for MySQL 5.7
操作 | 同時 DML を許可 | テーブルを再構築 | メタデータのみを変更 | 並列 DDL をサポート |
カラムを追加する | はい | いいえ¹ | はい¹ | サポートされています¹ |
カラムを削除する | はい | はい | いいえ | サポートされています |
列の名前変更 | はい | いいえ | はい | 該当なし |
カラムを並べ替える | はい | はい | いいえ | サポートされています |
列のデフォルト値の設定 | はい | いいえ | はい | 該当なし |
カラムコメントを変更する | はい | いいえ | はい | 該当なし |
列の型の変更 | いいえ | はい | いいえ | サポートされていません |
VARCHAR の長さの拡張 | はい² | いいえ | はい | 該当なし |
文字セットを UTF8mb3 から UTF8mb4 に変更する | いいえ | はい | いいえ | サポートされていません |
列のデフォルト値の削除 | はい | いいえ | はい | 該当なし |
自動インクリメント値を変更する | はい | いいえ | はい | 該当なし |
列を NULL に変更 | はい | はい | いいえ | サポートされています |
列を NOT NULL に変更 | いいえ | はい | いいえ | サポートされていません |
ENUM/SET 列の定義の変更 | はい | いいえ | はい³ | 該当なし |
カラム即時追加機能を有効にするには、
loose_innodb_support_instant_add_columnパラメーターを ON に設定する必要があります。この機能は、テーブルの末尾にのみ列を追加することをサポートしています。テーブルにプライマリキーがない場合、テーブルの末尾にある暗黙のプライマリキー列が原因で操作が失敗するのを防ぐために、implicit_primary_keyパラメーターを OFF に設定する必要があります。カラム即時追加機能は、圧縮テーブル (ROW_FORMAT=COMPRESSED)、フルテキストインデックスを持つテーブル、または一時テーブルでもサポートされていません。クラスターがカラム即時追加機能をサポートしていない場合、システムは INPLACE アルゴリズムを使用して列を追加します。このプロセスはテーブルの再構築をトリガーし、同時読み取りおよび書き込み操作を許可します。並列 DDL 機能を使用して操作を高速化することもできます。VARCHAR 列の長さを拡張する場合、高速な列拡張をサポートするには、長さを格納するために必要なバイト数が同じである必要があります。具体的には、0〜255 バイトの VARCHAR 列は、その長さを格納するために 1 バイトを必要とします。256 バイト以上の VARCHAR 列は 2 バイトを必要とします。ALTER TABLE 文は、VARCHAR 列の長さの拡張が特定の範囲内 (0〜255 バイト、または 256 バイトからより大きなサイズなど) である場合にのみメタデータを変更できます。VARCHAR 列の長さを 256 バイト未満から 256 バイト以上に変更する場合、PolarDB はデフォルトで Copy DDL を使用します。これにより、全期間にわたってテーブルがロックされます。DML 書き込み操作はサポートされませんが、読み取り操作はサポートされます。
VARCHAR 列の変更範囲が上記の条件を満たすかどうかわからない場合は、
ALGORITHM=INPLACEを使用して、現在の DDL 操作に 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 バイト以上に設定することを検討してください。これにより、フィールドを拡張するときに COPY アルゴリズムを使用する必要がなくなります。
データ型のストレージサイズが変更されず、ENUM または SET の末尾に要素を追加する場合にのみ、テーブル全体を再構築せずにメタデータのみを変更できます。それ以外の場合、テーブルを再構築するには COPY アルゴリズムが必要です。
PolarDB for MySQL 5.6
操作 | 同時 DML を許可 | テーブルを再構築 | メタデータのみを変更 | 並列 DDL をサポート |
カラムを追加する | はい | いいえ¹ | はい¹ | サポートされていません |
カラムを削除する | はい | はい | いいえ | サポートされていません |
列の名前変更 | はい | いいえ | はい | 該当なし |
カラムを並べ替える | はい | はい | いいえ | サポートされていません |
列のデフォルト値の設定 | はい | いいえ | はい | 該当なし |
カラムコメントを変更する | はい | いいえ | はい | 該当なし |
列の型の変更 | いいえ | はい | いいえ | サポートされていません |
VARCHAR の長さの拡張 | いいえ | はい | いいえ | サポートされていません |
文字セットを UTF8mb3 から UTF8mb4 に変更する | いいえ | はい | いいえ | サポートされていません |
列のデフォルト値の削除 | はい | いいえ | はい | 該当なし |
自動インクリメント値を変更する | はい | いいえ | はい | 該当なし |
列を NULL に変更 | はい | はい | いいえ | サポートされていません |
列を NOT NULL に変更 | いいえ | はい | いいえ | サポートされていません |
ENUM/SET 列の定義の変更 | はい | いいえ | はい² | 該当なし |
カラム即時追加機能を有効にするには、
loose_innodb_support_instant_add_columnパラメーターを ON に設定する必要があります。テーブルの末尾にのみ列を追加できます。テーブルに指定されたプライマリキーがない場合、テーブルの末尾にある暗黙のプライマリキー列が原因で列追加操作が失敗するのを防ぐために、implicit_primary_keyパラメーターを OFF に設定する必要があります。さらに、カラム即時追加機能は、圧縮テーブル (ROW_FORMAT=COMPRESSED)、フルテキストインデックスを持つテーブル、一時テーブル、またはパーティションテーブルではサポートされていません。クラスターがカラム即時追加機能をサポートしていない場合、システムは INPLACE アルゴリズムを使用して列を追加します。これにより、テーブルの再構築がトリガーされます。テーブルの再構築プロセス中、同時読み取りおよび書き込み操作が許可されます。説明PolarDB for MySQL 5.6 のカラム即時追加機能は現在カナリアリリース中です。この機能を使用するには、Quota Center に移動し、[Quota ID]
polardb_mysql_iac_56を使用してクォータ名を見つけ、[アクション] 列の [適用] をクリックして有効にします。データ型のストレージサイズが変更されず、ENUM または SET の末尾に要素を追加する場合にのみ、テーブル全体を再構築せずにメタデータのみを変更できます。それ以外の場合、テーブルを再構築するには COPY アルゴリズムが必要です。
テーブル操作
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 カラムを追加する | いいえ 説明 Stored Column 式の追加には SQL/Server レイヤーが関与するため、Stored Column の追加時に Online DDL はサポートされません。 | はい | いいえ | サポートされていません |
STORED 列の順序変更 | いいえ | はい | いいえ | サポートされていません |
STORED 列の削除 | はい | はい | いいえ | サポートされています |
VIRTUAL カラムを追加する | はい | いいえ | はい | 該当なし |
VIRTUAL 列の順序変更 | いいえ | はい | いいえ | サポートされていません |
VIRTUAL 列の削除 | はい | いいえ | はい | 該当なし |
PolarDB for MySQL 8.0.1
操作 | 同時 DML を許可 | テーブルを再構築 | メタデータのみを変更 | 並列 DDL をサポート |
STORED カラムを追加する | いいえ 説明 Stored Column 式の追加には SQL/Server レイヤーが関与するため、Stored Column の追加時に Online DDL はサポートされません。 | はい | いいえ | サポートされていません |
STORED 列の順序変更 | いいえ | はい | いいえ | サポートされていません |
STORED 列の削除 | はい | はい | いいえ | サポートされています |
VIRTUAL カラムを追加する | はい | いいえ | はい | 該当なし |
VIRTUAL 列の順序変更 | いいえ | はい | いいえ | サポートされていません |
VIRTUAL 列の削除 | はい | いいえ | はい | 該当なし |
PolarDB for MySQL 5.7
操作 | 同時 DML を許可 | テーブルを再構築 | メタデータのみを変更 | 並列 DDL をサポート |
STORED カラムを追加する | いいえ 説明 Stored Column 式の追加には SQL/Server レイヤーが関与するため、Stored Column の追加時に Online DDL はサポートされません。 | はい | いいえ | サポートされていません |
STORED 列の順序変更 | いいえ | はい | いいえ | サポートされていません |
STORED 列の削除 | はい | はい | いいえ | サポートされています |
VIRTUAL カラムを追加する | はい | いいえ | はい | 該当なし |
VIRTUAL 列の順序変更 | いいえ | はい | いいえ | サポートされていません |
VIRTUAL 列の削除 | はい | いいえ | はい | 該当なし |
PolarDB for MySQL 5.6
PolarDB for MySQL 5.6 は生成列機能をサポートしていません。
外部キー操作
PolarDB for MySQL 8.0.2
操作 | 同時 DML を許可 | テーブルを再構築 | メタデータのみを変更 | 並列 DDL をサポート |
外部キーを追加する | はい¹ | いいえ¹ | はい¹ | 該当なし |
外部キーの削除 | はい¹ | いいえ¹ | はい¹ | 該当なし |
PolarDB for MySQL 8.0.1
操作 | 同時 DML を許可 | テーブルを再構築 | メタデータのみを変更 | 並列 DDL をサポート |
外部キーを追加する | はい¹ | いいえ¹ | はい¹ | 該当なし |
外部キーの削除 | はい¹ | いいえ¹ | はい¹ | 該当なし |
PolarDB for MySQL 5.7
操作 | 同時 DML を許可 | テーブルを再構築 | メタデータのみを変更 | 並列 DDL をサポート |
外部キーを追加する | はい¹ | いいえ¹ | はい¹ | 該当なし |
外部キーの削除 | はい¹ | いいえ¹ | はい¹ | 該当なし |
PolarDB for MySQL 5.6
操作 | 同時 DML を許可 | テーブルを再構築 | メタデータのみを変更 | 並列 DDL をサポート |
外部キーを追加する | はい¹ | いいえ¹ | はい¹ | 該当なし |
外部キーの削除 | はい¹ | いいえ¹ | はい¹ | 該当なし |
INPLACE DDL は、foreign_key_checks が無効で、メタデータのみが変更される場合にのみサポートされます。それ以外の場合、COPY DDL のみがサポートされ、テーブルは全期間ロックされます。
パーティションテーブル操作
PolarDB for MySQL 8.0.2
操作 | 同時 DML を許可 | テーブルを再構築 | メタデータのみを変更 | 並列 DDL をサポート |
パーティションを追加する (ADD) | はい¹ | いいえ² | はい | サポートされていません |
パーティションの削除 (DROP) | はい¹ | いいえ² | いいえ | サポートされていません |
パーティションテーブルスペースの破棄 (DISCARD) | いいえ | いいえ | いいえ | サポートされていません |
パーティションテーブルスペースのインポート (IMPORT) | いいえ | いいえ | いいえ | サポートされていません |
パーティションの切り捨て (TRUNCATE) | はい | いいえ | いいえ | サポートされていません |
パーティションのマージ (COALESCE) | いいえ | はい³ | いいえ | サポートされていません |
パーティションの再編成 (REORGANIZE) | はい¹ | No.⁷ | いいえ | サポートされていません |
パーティションの交換 (EXCHANGE) | はい¹ | いいえ | はい | サポートされていません |
パーティションの分析 (ANALYZE) | はい | いいえ | 番号⁸ | サポートされていません |
パーティションのチェック (CHECK) | はい | いいえ | 番号⁹ | サポートされていません |
パーティションの最適化 (OPTIMIZE) | はい⁴ | はい⁴ | いいえ | サポートされています⁴ |
パーティションの再構築 (REBUILD) | はい¹ | いいえ⁷ | いいえ | サポートされていません |
パーティションの修復 (REPAIR) | はい | いいえ¹⁰ | いいえ | サポートされていません |
テーブルのパーティションテーブルへの変換 | いいえ | はい | はい⁵ | サポートされていません |
パーティションテーブルの標準テーブルへの変換 | いいえ | はい | いいえ | サポートされていません |
部分インデックスを作成する | はい | 番号⁶ | いいえ | サポートされています |
パーティションレベルのメタデータロック (MDL) により、
loose_partition_level_mdl_enabledパラメーターを true に設定した後、DDL 操作が影響を受けないパーティションの DML に影響を与えないことが保証されます。詳細については、「オンラインパーティションメンテナンス」をご参照ください。RANGE および LIST パーティションテーブルのパーティションの追加または削除には、テーブルの再構築は必要ありません。HASH および KEY パーティションテーブルへのパーティションの追加には、テーブルの再構築が必要です。HASH および KEY パーティションテーブルからのパーティションの削除はサポートされていません。
HASH および KEY パーティションのみがサポートされています。
InnoDB エンジンを使用するテーブルで OPTIMIZE PARTITION 操作を実行すると、パーティションテーブル全体が再構築されます。再構築中、ターゲットテーブルでの読み取りおよび書き込み操作が許可されます。この場合、
innodb_parallel_build_primary_indexパラメーターを ON に設定して、並列 DDL 機能を使用して再構築を高速化できます。即時変換は、標準テーブルをレンジパーティションテーブルに迅速に変換することのみをサポートします。
PolarDB for MySQL は、パーティションレベルのインデックスの作成と削除をサポートしています。詳細については、「部分インデックス」をご参照ください。
パーティションの再編成または再構築は、データの再配布と再構築が必要な指定されたパーティションのみを再構築します。他のパーティションは影響を受けません。
パーティションの分析は、テーブルのメタデータやデータを変更せず、統計情報のみを変更します。
パーティションのチェックは、メタデータやデータを変更しません。
パーティションの修復は、修復が必要な指定されたパーティションのみを再構築します。
PolarDB for MySQL 8.0.1
操作 | 同時 DML を許可 | テーブルを再構築 | メタデータのみを変更 | 並列 DDL をサポート |
パーティションの追加 (ADD) | いいえ | いいえ¹ | はい | サポートされていません |
パーティションの削除 (DROP) | いいえ | いいえ² | いいえ | サポートされていません |
パーティションテーブルスペースの破棄 (DISCARD) | いいえ | いいえ | いいえ | サポートされていません |
パーティションテーブルスペースのインポート (IMPORT) | いいえ | いいえ | いいえ | サポートされていません |
パーティションの切り捨て (TRUNCATE) | はい | いいえ | いいえ | サポートされていません |
パーティションのマージ (COALESCE) | いいえ | はい | いいえ | サポートされていません |
パーティションの再編成 (REORGANIZE) | いいえ | 番号⁴ | いいえ | サポートされていません |
パーティションの交換 (EXCHANGE) | はい | はい | はい | サポートされていません |
パーティションの分析 (ANALYZE) | はい | はい | 番号⁵ | サポートされていません |
パーティションのチェック (CHECK) | はい | いいえ | 番号⁶ | サポートされていません |
パーティションの最適化 (OPTIMIZE) | はい³ | はい³ | いいえ | サポートされています³ |
パーティションの再構築 (REBUILD) | いいえ | いいえ⁴ | いいえ | サポートされていません |
パーティションの修復 (REPAIR) | はい | いいえ⁴ | いいえ | サポートされていません |
テーブルのパーティションテーブルへの変換 | いいえ | はい | いいえ | サポートされていません |
パーティションテーブルの標準テーブルへの変換 | いいえ | はい | いいえ | サポートされていません |
RANGE および LIST パーティションテーブルへのパーティションの追加には、テーブルの再構築は必要ありません。HASH および KEY パーティションテーブルへのパーティションの追加には、テーブルの再構築が必要です。
HASH および KEY パーティションテーブルからのパーティションの削除はサポートされていません。
InnoDB エンジンを使用するテーブルで OPTIMIZE PARTITION 操作を実行すると、パーティションテーブル全体が再構築されます。再構築中、ターゲットテーブルでの読み取りおよび書き込み操作が許可されます。
innodb_parallel_build_primary_indexパラメーターを ON に設定して、並列 DDL 機能を使用して再構築を高速化できます。パーティションの再編成、再構築、修復は、再編成、再構築、修復が必要な指定されたパーティションのみを再構築します。他のパーティションは影響を受けません。
パーティションの分析は、テーブルのメタデータやデータを変更せず、統計情報のみを変更します。
パーティションのチェックは、メタデータやデータを変更しません。
PolarDB for MySQL 5.7
操作 | 同時 DML を許可 | テーブルの再構築 | メタデータのみを変更 | 並列 DDL をサポート |
パーティションの追加 (ADD) | いいえ | いいえ¹ | はい | サポートされていません |
パーティションの削除 (DROP) | いいえ | いいえ¹ | いいえ | サポートされていません |
パーティションテーブルスペースの破棄 (DISCARD) | いいえ | いいえ | いいえ | サポートされていません |
パーティションテーブルスペースのインポート (IMPORT) | いいえ | いいえ | いいえ | サポートされていません |
パーティションの切り捨て (TRUNCATE) | はい | いいえ | いいえ | サポートされていません |
パーティションのマージ (COALESCE) | いいえ | はい | いいえ | サポートされていません |
パーティションの再編成 (REORGANIZE) | いいえ | いいえ² | いいえ | サポートされていません |
パーティションの交換 | はい | いいえ | はい | サポートされていません |
パーティションの分析 (ANALYZE) | はい | いいえ | いいえ³ | サポートされていません |
パーティションのチェック (CHECK) | はい | いいえ | いいえ⁴ | サポートされていません |
パーティションの最適化 (OPTIMIZE) | いいえ | はい | いいえ | サポートされていません |
パーティションの再構築 (REBUILD) | いいえ | いいえ² | いいえ | サポートされていません |
パーティションの修復 (REPAIR) | はい | いいえ² | いいえ | サポートされていません |
テーブルのパーティションテーブルへの変換 | いいえ | はい | いいえ | サポートされていません |
パーティションテーブルの標準テーブルへの変換 | いいえ | はい | いいえ | サポートされていません |
RANGE および LIST パーティションテーブルのパーティションの追加または削除には、テーブルの再構築は必要ありません。HASH および KEY パーティションテーブルへのパーティションの追加には、テーブルの再構築が必要です。HASH および KEY パーティションテーブルからのパーティションの削除はサポートされていません。
パーティションの再編成、再構築、修復は、再編成、再構築、修復が必要な指定されたパーティションのみを再構築します。他のパーティションは影響を受けません。
パーティションの分析は、テーブルのメタデータやデータを変更せず、統計情報のみを変更します。
パーティションのチェックは、メタデータやデータを変更しません。
PolarDB for MySQL 5.6
操作 | 同時 DML を許可 | テーブルの再構築 | メタデータのみを変更 | 並列 DDL をサポート |
パーティションの追加 (ADD) | いいえ | いいえ¹ | はい | サポートされていません |
パーティションの削除 (DROP) | いいえ | いいえ¹ | いいえ | サポートされていません |
パーティションテーブルスペースの破棄 (DISCARD) | いいえ | いいえ | いいえ | サポートされていません |
パーティションテーブルスペースのインポート (IMPORT) | いいえ | いいえ | いいえ | サポートされていません |
パーティションの切り捨て (TRUNCATE) | はい | いいえ | いいえ | サポートされていません |
パーティションのマージ (COALESCE) | いいえ | はい | いいえ | サポートされていません |
パーティションの再編成 (REORGANIZE) | いいえ | いいえ² | いいえ | サポートされていません |
パーティションの交換 (EXCHANGE) | はい | いいえ | はい | サポートされていません |
パーティションの分析 (ANALYZE) | はい | いいえ | いいえ³ | サポートされていません |
パーティションのチェック (CHECK) | はい | いいえ | No⁴ | サポートされていません |
パーティションの最適化 (OPTIMIZE) | いいえ | はい | いいえ | サポートされていません |
パーティションの再構築 (REBUILD) | いいえ | いいえ² | いいえ | サポートされていません |
パーティションの修復 (REPAIR) | はい | いいえ² | いいえ | サポートされていません |
テーブルのパーティションテーブルへの変換 | いいえ | はい | いいえ | サポートされていません |
パーティションテーブルの標準テーブルへの変換 | いいえ | はい | いいえ | サポートされていません |
RANGE および LIST パーティションテーブルのパーティションの追加または削除には、テーブルの再構築は必要ありません。HASH および KEY パーティションテーブルへのパーティションの追加には、テーブルの再構築が必要です。HASH および KEY パーティションテーブルからのパーティションの削除はサポートされていません。
パーティションの再編成、再構築、修復は、再編成、再構築、修復が必要な指定されたパーティションのみを再構築します。他のパーティションは影響を受けません。
パーティションの分析は、テーブルのメタデータやデータを変更せず、統計情報のみを変更します。
パーティションのチェックは、メタデータやデータを変更しません。
DDL 実行方法
PolarDB for MySQL が INPLACE または INSTANT アルゴリズムを使用して DDL 操作を実行する場合、カーネルメソッド (Online DDL) を使用することをお勧めします。このメソッドは高速で安定しています。
PolarDB for MySQL が COPY アルゴリズムを使用して DDL 操作を実行する場合、テーブルは全期間ロックされます。実行中、ターゲットテーブルでの読み取りおよび書き込み操作はブロックされます。この場合、DMS のロックフリー DDL や gh-ost などのサードパーティツールを使用して DDL 文を実行できます。これらのサードパーティツールは DDL 実行中の読み取りおよび書き込み操作を許可しますが、通常は低速です。大きなテーブルや高い同時実行性のシナリオでは、増分データが多すぎるために操作が失敗する可能性があります。
次の表は、カーネルメソッドとサードパーティツールを使用して DDL 操作を実行する場合の違いを比較したものです。
実行メソッド | 同時読み取りと書き込みを許可 | 実行速度 | バイナリログは必要ですか? | 並列アクセラレーション |
カーネル (Online DDL) | はい | 高速 | いいえ | サポートされています |
サードパーティツール (DMS のロックフリー DDL や gh-ost など) | はい | 低速 | はい | サポートされていません |
サードパーティツールを使用して DDL 操作を実行する場合でも、テーブルの切り替え (メタデータ変更) 中に MDL-X ロックが取得され、テーブルが一時的にロックされます。このテーブルロックの問題を回避するには、要件に応じて ノンブロッキング DDL 機能または プリエンプティブル DDL 機能を有効にできます。
お問い合わせ
DDL 操作についてご不明な点がございましたら、テクニカルサポートにお問い合わせください。