オンラインDDLは、MySQL 5.6を実行するApsaraDB for RDSインスタンスで利用可能な新機能です。
この機能を使用すると、DDL操作と同時に実行されるデータ操作言語 (DML) 操作やSELECTクエリをブロックすることなく、テーブルでのインデックス作成などのデータ定義言語 (DDL) 操作を実行できます。
alter table <変換する形式のテーブルの名前> engine=innodb;
ApsaraDB RDS For MySQLでサポートされているその他の機能については、「AliSQLのリリースノート」をご参照ください。
制限事項
| DDL操作 | インプレース対応 | テーブルコピーが必要 | DML同時実行許可 | クエリ同時実行許可 | 補足 |
| テーブルに共通インデックスを作成する | 必須 | 任意 | 必須 | 必須 | なし |
| テーブルにフルテキストインデックスを作成する | 必須 | 任意 | 任意 | 必須 | テーブルコピー方法を使用して、最初のフルテキストインデックスを作成する必要があります。 次に、インプレース方式を使用して、テーブルに他のフルテキストインデックスを作成できます。 |
| テーブルからインデックスを削除する | 必須 | 任意 | 必須 | 必須 | このDDL操作は、テーブルのメタデータのみを変更します。 |
| テーブルの最適化 | 必須 | 必須 | 必須 | 必須 | テーブルにフルテキストインデックスが作成されている場合、ALGORITHMオプションをINPLACEに設定することはできません。 |
| テーブルの列にデフォルト値を設定する | 必須 | 任意 | 必須 | 必須 | このDDL操作は、テーブルのメタデータのみを変更します。 |
| テーブルの自動インクリメント列にデフォルト値を設定します。 | 必須 | 任意 | 必須 | 必須 | このDDL操作は、テーブルのメタデータのみを変更します。 |
| テーブルに外部キー制約を追加する | 必須 | 任意 | 必須 | 必須 | set foreign_key_checks=0; コマンドを実行してforeign_key_checksオプションを無効にすると、テーブルをコピーする必要はありません。 |
| テーブルから外部キー制約を削除する | 必須 | 任意 | 必須 | 必須 | foreign_key_checksオプションを有効または無効にできます。 |
| テーブルの列の名前を変更する | 必須 | 任意 | 必須 | 必須 | このDDL操作がデータ型を変更せずに列名のみを変更する場合、同時DML操作が許可されます。 |
| テーブルに列を追加する | 必須 | 必須 | 必須 | 必須 |
追加する列がauto_increment列の場合、同時DML操作は実行できません。 ALGORITHMオプションをINPLACEに設定できますが、この設定ではテーブルデータが再編成され、オーバーヘッドが増加します。 |
| テーブルから列を削除する | 必須 | 必須 | 必須 | 必須 | ALGORITHMオプションをINPLACEに設定できますが、この設定ではテーブルデータが再編成され、オーバーヘッドが増加します。 |
| テーブル内の列のシーケンスを変更する | 必須 | 必須 | 必須 | 必須 | ALGORITHMオプションをINPLACEに設定できますが、この設定ではテーブルデータが再編成され、オーバーヘッドが増加します。 |
| テーブルのRow_Format属性の変更 | 必須 | 必須 | 必須 | 必須 | ALGORITHMオプションをINPLACEに設定できますが、この設定ではテーブルデータが再編成され、オーバーヘッドが増加します。 |
| テーブルのKey_Block_Size属性の変更 | 必須 | 必須 | 必須 | 必須 | ALGORITHMオプションをINPLACEに設定できますが、この設定ではテーブルデータが再編成され、オーバーヘッドが増加します。 |
| テーブルの列の値をNULLに設定します。 | 必須 | 必須 | 必須 | 必須 | ALGORITHMオプションをINPLACEに設定できますが、この設定ではテーブルデータが再編成され、オーバーヘッドが増加します。 |
| テーブルの列の値をNOT NULLに設定します。 | 必須 | 必須 | 必須 | 必須 |
このDDL操作は、SQL_MODEオプションがSTRICT_ALL_TABLESまたはSTRICT_TRANS_TABLESに設定され、列にNULL値が含まれていない場合にのみ成功します。 ALGORITHMオプションをINPLACEに設定できますが、この設定ではテーブルデータが再編成され、オーバーヘッドが増加します。 |
| テーブル内の列のデータ型を変更する | 任意 | 必須 | 任意 | 必須 | なし |
| テーブルに主キーを追加する | 必須 | 必須 | 必須 | 必須 |
ALGORITHMオプションをINPLACEに設定できますが、この設定ではテーブルデータが再編成され、オーバーヘッドが増加します。 また、列の値をNOT NULLに設定した場合、ALGORITHMオプションをINPLACEに設定することはできません。 |
| テーブルの主キーを削除して新しいキーを追加する | 必須 | 必須 | 必須 | 必須 |
ALGORITHMオプションをINPLACEに設定できるのは、ALTER TABLEステートメントを1つ実行して既存の主キーを削除し、新しい主キーを追加する場合のみです。 ALGORITHMオプションをINPLACEに設定できますが、この設定ではテーブルデータが再編成され、オーバーヘッドが増加します。 |
| テーブルの主キーを削除する | 任意 | 必須 | 任意 | 必須 | なし |
| テーブルの文字セットを変換する | 任意 | 必須 | 任意 | 必須 | 新しい文字セットで別のエンコード形式を使用する場合は、テーブルを再構築する必要があります。 |
| テーブルの新しい文字セットを指定する | 任意 | 必須 | 任意 | 必須 | 新しい文字セットで別のエンコード形式を使用する場合は、テーブルを再構築する必要があります。 |
| forceオプションを使用してテーブルを再構築する | 必須 | 必須 | 必須 | 必須 | テーブルにフルテキストインデックスが作成されている場合、ALGORITHMオプションをINPLACEに設定することはできません。 |
|
テーブルの再構築 alter table... engine=innodb |
必須 | 必須 | 必須 | 必須 | テーブルにフルテキストインデックスが作成されている場合、ALGORITHMオプションをINPLACEに設定することはできません。 |
|
テーブルの永続統計属性を設定する |
必須 | 任意 | 必須 | 必須 | このDDL操作は、テーブルのメタデータのみを変更します。 |
- In-place supported: DDL操作のALGORITHMオプションによって制御されます。 この方法は、コピーテーブル方式よりも少ないディスク領域とI/Oリソースを消費します。
- Copy-table required: DDL操作のALGORITHMオプションによって制御されます。 この方法は、インプレース方法よりも多くのディスク領域とI/Oリソースを消費します。
- DML同時実行許可: DDL操作のLOCKオプションによって制御されます。
- クエリの同時実行許可: ほとんどの場合、DDL操作と同時のクエリが許可されます。
- 詳細については、「オンラインDDL操作」をご参照ください。
- テーブルに対するDDL操作は、テーブルメタデータを変更します。 したがって、そのテーブルのメタデータロックを待つことができます。 メタデータロックの処理方法については、「DMSを使用したメタデータロックの解放」をご参照ください。
- インプレース方式は、テーブルコピー方式とは逆に動作する。 ただし、インプレースメソッドが指定されている場合でも、DDL操作にはテーブルコピーが含まれる可能性があります。たとえば、テーブルに列を追加するために使用されるDDL操作です。
設定の提案
- ALGORITHM: DDL操作を実行するときは、ディスク領域の使用やI/Oの問題によるパフォーマンスの低下を避けるため、このオプションをINPLACEに設定することを推奨します。 DDL操作がこの設定をサポートしていない場合は、エラーが返されます。
alter table area_bak algorithm=inplace、父のテキストを変更します。エラー1846 (0A000): ALGORITHM=INPLACEはサポートされていません。 理由: 列タイプINPLACEを変更できません。 ALGORITHM=COPYを試してください。 - LOCK: DDL操作を実行するときは、このオプションをNONEに設定することを推奨します。 これにより、DDL操作と同時にDML操作をスムーズに実行できます。 DDL操作がこの設定をサポートしていない場合は、エラーが返されます。
は、テーブルエリアALGORITHM=コピー、ロック=なし、文字セットutf8mb4に変換します。エラー1846 (0A000): LOCK=NONEはサポートされていません。 理由: COPYアルゴリズムにはロックが必要です。 LOCK=SHAREDを試してください。
デフォルトでは、ApsaraDB RDS for MySQLはALGORITHMオプションをINPLACEに、LOCKオプションをNONEに設定するため、これら2つのオプションを設定する必要はありません。 ただし、DDL操作によってシステムの負荷が増加したり、ターゲットテーブルに対するDML操作がブロックされたりするおそれがある場合は、ALGORITHMオプションをINPLACEに、LOCKオプションをNONEに設定してテストすることをお勧めします。 したがって、2つの設定のいずれかがサポートされていない場合はエラーが返されます。
例:
alter table area algorithm=inplace, lock=none, add index idx_fa (father);
データベースエンジンのバージョン (MySQL 5.5など) がオンラインDDL操作をサポートしていない場合は、Perconaのpt-online-schema-changeツールを使用できます。
ALTER TABLEの構文については、「ALTER TABLE構文」をご参照ください。
トラブルシューティング
大規模なテーブルに対して同時DML操作を使用してオンラインDDL操作を実行すると、次のエラーが返される場合があります。
変更テーブルrd_order_recインデックスidx_cr_time_detail (cr_time、detail) を追加します。エラー1799(HY000): インデックス 'idx_cr_time_detail 'を作成するには、'innodb_online_alter_log_max_size' バイト以上の変更ログが必要でした。 もう一度お試しください。
原因
システムは、テーブルの変更時またはインデックスの作成時に一時ログファイルを作成することにより、DDL操作中に実行した同時DML操作を記録します。 一時ログファイルは、innodb_sort_buffer_sizeパラメーターで指定されたサイズから、nnodb_online_alter_log_max_sizeパラメーターで指定されたサイズに拡大できます。
一時ログファイルが最大サイズを超えると、DDL操作は失敗メッセージを返し、コミットされていないすべての同時DML操作をロールバックします。 したがって、innodb_online_alter_log_max_sizeパラメーターを使用して適切なファイルサイズを指定することを推奨します。これにより、より多くの同時DML操作が許可されます。 ただし、ファイルサイズが大きくなると、DDL操作でテーブルをロックしてログデータをテーブルに適用するのにかかる時間が長くなります。
解決策
