MySQL では、DDL 操作は複雑で時間がかかる場合があります。わずかなミスでもビジネスに影響を与える可能性があります。PolarDB for MySQL は EXPLAIN DDL 機能を導入しており、事前に実行の詳細を理解することで、DDL 操作がビジネスに与える影響を正確に評価できます。
はじめに
MySQL エコシステムにおける DDL 操作は複雑で、実行に長い時間がかかります。大量のハードウェアリソースを消費するだけでなく、テーブルをロックする可能性もあります。不適切な使用は、ビジネスに深刻な影響を与える可能性があります。さらに、実行の特徴は、DDL 操作によって異なる場合があります。たとえば、列の追加はテーブルの再構築を必要とせず、数秒で完了できます。ただし、列タイプの変更にはテーブル全体の再構築が必要であり、処理中は書き込み操作は許可されません。
PolarDB for MySQL は、DDL 操作の実行の特徴 (ロックの競合が存在するかどうか、テーブルの再構築が必要かどうかなど) を評価するのに役立つ EXPLAIN DDL 機能を提供します。EXPLAIN SQL と同様に、実行前に DDL 文に対して EXPLAIN を実行して、詳細な分析情報を得ることができます。
サポートされているバージョン
お使いの PolarDB for MySQL クラスタは、次のいずれかのデータベースエンジンバージョンで実行されています。
PolarDB for MySQL 8.0.1 (リビジョンバージョン 8.0.1.1.49 以降)
PolarDB for MySQL 8.0.2 (リビジョンバージョン 8.0.2.2.27 以降)
注意事項
EXPLAIN DDL 操作は、InnoDB ストレージエンジンを使用するテーブルでのみサポートされています。
EXPLAIN DDL 操作では、実際のデータは変更されません。
EXPLAIN DDL 操作は、プライマリノードと読み取り専用ノードの両方で実行できます。ただし、「Possible blocked MDLs」フィールドには、現在のノードでの潜在的なロックの競合のみが表示されます。
使用方法
パラメータ
loose_polar_enable_explain_ddl パラメータを設定して、EXPLAIN DDL 機能をアクティブにします。収集する潜在的な MDL ブロックスレッドの数を、loose_polar_max_collect_thd_num_in_explain_ddl パラメータを設定して指定します。詳細については、「クラスタパラメータとノードパラメータを設定する」をご参照ください。次の表に、パラメータを示します。
パラメータ | レベル | 説明 |
loose_polar_enable_explain_ddl | グローバル | EXPLAIN DDL 機能をオンまたはオフにします。有効な値:
|
loose_polar_max_collect_thd_num_in_explain_ddl | グローバル | 収集する潜在的な MDL ブロックスレッドの数を指定します。 有効な値:1 ~ 512。デフォルト値は 16 です。 |
構文
{ EXPLAIN | DESCRIBE | DESC } ALTER TABLE ...次の表に、出力フィールドを示します。
フィールド | 説明 | 有効な値 |
エラー番号 | エラーコード。 |
|
アルゴリズム | DDL 操作が使用する実行アルゴリズム。 |
|
メタデータのみ | DDL 操作がテーブル内の実際のデータではなく、メタデータのみを変更するかどうかを示します。 |
|
再構築されたテーブル | DDL 操作でテーブルの再構築が必要かどうかを示します。 |
|
並列サポート | DDL 操作で高速化のために並列 DDL がサポートされているかどうかを示します。 |
|
並列度 | DDL 操作が使用するスレッド数。 |
|
同時 DML | DDL 操作中に同時読み取りと書き込みがサポートされているかどうかを示します。 |
|
ブロックされる可能性のある MDL | 前提条件 | カンマで区切られたプロセス ID の文字列。 |
エラーメッセージ | 現在の DDL 操作の [エラー番号] に関連付けられているエラーメッセージです。 | 文字列です。 |
推奨情報 | 現在の DDL 操作を最適化するための提案。 | 文字列です。 説明 以下の内容を含む提案が表示されますが、これらに限定されません。
|
ステートメント | 現在の DDL ステートメント。 | DDL ステートメント |
例
DDL 操作の実行機能をクエリする
Algorithm、Metadata Only、Rebuilt Table、および Concurrent DML フィールドを EXPLAIN DDL 出力から分析することで、DDL 操作の実行機能を理解できます。
Concurrent DMLフィールドの Yes 値は、DDL 実行が同時読み取りおよび書き込み操作をサポートしていることを示します。ビジネスの読み取りおよび書き込みリクエストはブロックされません。Rebuilt Tableフィールドの Yes 値は、DDL 操作でテーブルの完全な再構築が必要であることを示します。大きな表領域の場合、これは時間がかかる可能性があります。このような DDL は、オフピーク時に実行できます。Metadata Onlyフィールドの Yes 値は、DDL 操作がテーブル内のデータを変更しないことを示します。このような操作は、テーブルサイズに関係なく数秒で完了するため、データベース ワークロードへの影響は最小限に抑えられます。
次の DDL 実行例を参照してください。
テストテーブル構造:
SHOW CREATE TABLE t1\G *************************** 1. row *************************** Table: t1 Create Table: CREATE TABLE `t1` ( `a` int(11) DEFAULT NULL, `b` char(1) DEFAULT NULL, `c` char(1) DEFAULT NULL ) ENGINE=InnoDB DEFAULT CHARSET=utf8 1 row in set (0.00 sec)列追加操作を EXPLAIN する:
EXPLAIN ALTER TABLE t1 ADD COLUMN d INT;実行結果:
*************************** 1. row *************************** Error No: 0 Algorithm: INSTANT Metadata Only: Yes Rebuilt table: No Parallel Support: Not Need Parallel Degree: 1 Concurrent DML: Yes Possible blocked MDLs: Error Msg: Suggest Info: Statement: EXPLAIN ALTER TABLE t1 ADD COLUMN d int 1 row in set (0.00 sec)結果は、列追加操作が INSTANT アルゴリズムをサポートし、メタデータのみを変更し(テーブルの再構築は不要)、同時 DML アクセスをサポートしていることを示しています。この DDL 操作は、ビジネスへの影響を最小限に抑えながら、数秒で実行できます。
テーブル名前変更操作を EXPLAIN する:
EXPLAIN ALTER TABLE t1 rename t1_rn;実行結果:
*************************** 1. row *************************** Error No: 0 Algorithm: INPLACE Metadata Only: Yes Rebuilt table: No Parallel Support: Not Need Parallel Degree: 1 Concurrent DML: Yes Possible blocked MDLs: Error Msg: Suggest Info: Statement: EXPLAIN ALTER TABLE t1 rename t1_rn 1 row in set (0.01 sec)結果は、テーブル名前変更操作が INPLACE アルゴリズムをサポートし、メタデータのみを変更し(テーブルの再構築は不要)、同時 DML アクセスをサポートしていることを示しています。この DDL 操作は、テーブル内のデータを変更しないため、ビジネスへの影響は最小限に抑えられます。
列定義変更操作を EXPLAIN する:
EXPLAIN ALTER TABLE t1 modify COLUMN a char(1);実行結果:
*************************** 1. row *************************** Error No: 0 Algorithm: COPY Metadata Only: No Rebuilt table: Yes Parallel Support: No Parallel Degree: 1 Concurrent DML: No Possible blocked MDLs: Error Msg: Suggest Info: Statement: EXPLAIN ALTER TABLE t1 modify COLUMN a char(1) 1 row in set (0.01 sec)結果は、列定義変更操作が COPY アルゴリズムをサポートし、データの再構築が必要であり、同時 DML アクセスをサポートしていないことを示しています。この DDL 操作はビジネスに大きな影響を与えるため、注意して実行する必要があります。
テーブル再構築操作を EXPLAIN する:
EXPLAIN ALTER TABLE t1 engine= innodb;実行結果:
*************************** 1. row *************************** Error No: 0 Algorithm: INPLACE Metadata Only: No Rebuilt table: Yes Parallel Support: Yes But Not Enable Parallel Degree: 1 Concurrent DML: Yes Possible blocked MDLs: Error Msg: Suggest Info: 1. This DDL operation could use Parallel DDL to speed up. Statement: EXPLAIN ALTER TABLE t1 engine= innodb結果は、テーブル再構築操作が INPLACE アルゴリズムをサポートし、テーブルの完全な再構築が必要であり、同時 DML アクセスをサポートしていることを示しています。実行中にデータアクセスは許可されますが、テーブルの完全な再構築は大量のデータベース リソースを消費するため、この DDL 操作はオフピーク時に実行することをお勧めします。
現在の DDL 操作が高速化のために並列 DDL をサポートしているかどうかをクエリする
PolarDB for MySQL は、並列 DDL 機能を活用して DDL 操作を高速化します。EXPLAIN DDL 出力の Parallel Support フィールドと Parallel Degree フィールドを確認することで、現在の DDL 操作が高速化のために並列 DDL をサポートしているかどうかを判断できます。
現在の DDL 操作が並列 DDL をサポートしているが、このクラスタで機能が有効になっていない場合、Suggest Info フィールドに This DDL operation could use Parallel DDL to speed up. メッセージが表示されます。並列 DDL を有効にする方法の詳細については、「並列 DDL」をご参照ください。
現在の DDL 操作が並列 DDL をサポートし、クラスタで機能が有効になっている場合、EXPLAIN DDL は現在のクラスタ ワークロードに基づいて最適な並列処理の次数を提案します。Suggest Info フィールドに This DDL operation can be accelerated by increasing the value of 'innodb_polar_parallel_ddl_threads'. The recommended value is 8. メッセージが表示されます。高速化効果を高めるために、推奨値に従って
innodb_polar_parallel_ddl_threadsパラメーターを調整できます。
次の実行例を参照してください。
並列 DDL を無効にし、セカンダリ インデックス追加操作を EXPLAIN する:
MySQL [test]> SHOW variables LIKE "%parallel_ddl_threads%"; +----------------------------------------------------+-------+ | Variable_name | Value | +----------------------------------------------------+-------+ | innodb_polar_innovate_default_parallel_ddl_threads | 1 | | innodb_polar_parallel_ddl_threads | 1 | +----------------------------------------------------+-------+ 2 rows in set (0.03 sec)結果は、並列 DDL が有効になっていないことを示しています。セカンダリ インデックス追加操作を EXPLAIN します。
EXPLAIN ALTER TABLE t1 ADD index k_a(a);実行結果:
*************************** 1. row *************************** Error No: 0 Algorithm: INPLACE Metadata Only: No Rebuilt table: No Parallel Support: Yes But Not Enable Parallel Degree: 1 Concurrent DML: Yes Possible blocked MDLs: Error Msg: Suggest Info: 1. This DDL operation could use Parallel DDL to speed up. Statement: EXPLAIN ALTER TABLE t1 ADD index k_a(a) 1 row in set (0.01 sec)Parallel Support フィールドの Yes But Not Enabled 値は、現在の DDL 操作が並列 DDL 機能によって高速化できるが、クラスタで機能が有効になっていないことを示しています。その結果、この DDL 操作は高速化のために並列 DDL を使用しません。さらに、Suggest Info フィールドは、並列 DDL を有効にすることを提案しています。
並列 DDL を有効にし、セカンダリ インデックス追加操作を EXPLAIN する:
並列処理の次数を 2 に設定します。
MySQL [test]> SET innodb_polar_parallel_ddl_threads = 2 ; Query OK, 0 rows affected (0.00 sec)セカンダリ インデックス追加操作を EXPLAIN します。
EXPLAIN ALTER TABLE t1 ADD index k_a(a);実行結果:
*************************** 1. row *************************** Error No: 0 Algorithm: INPLACE Metadata Only: No Rebuilt table: No Parallel Support: Yes Parallel Degree: 2 Concurrent DML: Yes Possible blocked MDLs: Error Msg: Suggest Info: 1. This DDL operation can be accelerated BY increasing the VALUE OF 'innodb_polar_parallel_ddl_threads'. The recommended VALUE IS 8. Statement: explain ALTER TABLE t1 ADD index k_a(a) 1 row in set (0.01 sec)
Parallel Degree フィールドの値は 2 で、操作で 2 つのスレッドが使用されていることを示しています。さらに、クラスタ ワークロードが低いため、Suggest Info フィールドは、高速化のために並列処理の次数を 8 に増やすことを提案しています。
潜在的な MDL ブロック検出
DDL 実行は、ターゲットテーブルのコミットされていないトランザクションによってブロックされる可能性があり、極端な場合には、アクティブな接続の問題が発生し、クラスタがクラッシュする可能性があります。EXPLAIN DDL 出力の Possible blocked MDLs フィールドは、潜在的なロックの競合を事前に特定するのに役立ちます。潜在的なロックの競合が存在する場合、フィールドには、コミットされていないトランザクションとの接続のプロセス ID が一覧表示されます。KILL コマンドまたは KILL QUERY コマンドを実行してトランザクションを終了し、DDL 操作がブロックされないようにすることで、問題を解決できます。
簡単な例を次に示します。接続 1 で、トランザクションをコミットせずに t1 テーブルにアクセスします。接続 2 で、t1 テーブルで EXPLAIN DDL 操作を実行します。Possible blocked MDLs フィールドには、コミットされていないトランザクションとの接続のプロセス ID が一覧表示され、Suggest Info には対応する提案が示されます。
接続 1:
トランザクションをコミットせずに t1 テーブルにアクセスします。
MySQL [test]> begin; Query OK, 0 rows affected (0.00 sec) MySQL [test]> select * from t1; Empty set (0.00 sec)接続 2:
t1 テーブルで EXPLAIN DDL 操作を実行します。
EXPLAIN ALTER TABLE t1 engine= innodb; *************************** 1. row *************************** Error No: 0 Algorithm: INPLACE Metadata Only: No Rebuilt table: Yes Parallel Support: Yes But Not Enable Parallel Degree: 1 Concurrent DML: Yes Possible blocked MDLs: 18 Error Msg: Suggest Info: 1. This DDL operation may be blocked BY the threads listed under 'Possible blocked MDLs'. 2. This DDL operation could use Parallel DDL TO speed up. Statement: EXPLAIN ALTER TABLE t1 engine= innodb