このトピックでは、MySQL 5.6以降を実行するApsaraDB RDSインスタンスにオンラインDDL機能を使用する方法について説明します。
MySQL 5.6以降を実行するRDSインスタンスは、オンラインDDL機能をサポートしています。
この機能を使用すると、DDL操作と同時に実行されるDML操作やSELECTクエリをブロックすることなく、テーブルに対するインデックス作成などのDDL操作を実行できます。
データベースエンジンのバージョンをMySQL 5.5などの以前のバージョンからMySQL 5.6にアップグレードした後、テーブル形式が以前のバージョンであるため、テーブルに対して初めてDDL操作を実行できない場合があります。 この场合, 次の文を実行して, 表形式を変换してください。
ALTER TABLE <変換する形式のテーブルの名前> engine=innodb;ApsaraDB RDS For MySQLでサポートされている機能の詳細については、「AliSQLのリリースノート」をご参照ください。
ビジネスへの影響を避けるため、オフピーク時にすべてのDDL操作を実行することを推奨します。
制限事項
DDL操作 | インプレース対応 | テーブルコピーが必要 | DML同時実行許可 | クエリ同時実行許可 | 補足 |
テーブルに共通インデックスを作成する | 可 | 任意 | 可 | 可 | なし。 |
フルテキストインデックスの作成 | 可 | 任意 | 任意 | 可 | テーブルコピー方法を使用して、最初のフルテキストインデックスを作成する必要があります。 次に、インプレース方式を使用して、テーブルに他のフルテキストインデックスを作成できます。 |
インデックスの削除 | 可 | 任意 | 可 | 可 | このDDL操作は、テーブルのメタデータのみを変更します。 |
テーブルの最適化 | 可 | 可 | 可 | 可 | テーブルにフルテキストインデックスが作成されている場合、ALGORITHMオプションをINPLACEに設定することはできません。 |
テーブルの列にデフォルト値を設定する | 可 | 任意 | 可 | 可 | このDDL操作は、テーブルのメタデータのみを変更します。 |
テーブルの自動インクリメント列にデフォルト値を設定する | 可 | 任意 | 可 | 可 | このDDL操作は、テーブルのメタデータのみを変更します。 |
テーブルに外部キー制約を追加する | 可 | 任意 | 可 | 可 |
|
テーブルから外部キー制約を削除する | 可 | 任意 | 可 | 可 | foreign_key_checksオプションを有効または無効にできます。 |
テーブルの列の名前を変更する | 可 | 任意 | 可 | 可 | このDDL操作がデータ型を変更せずに列名のみを変更する場合、同時DML操作が許可されます。 |
テーブルに列を追加する | 可 | 可 | 可 | 可 | 追加する列が自動インクリメント列の場合、同時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リソースを消費します。
必要なテーブルコピー: 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エリアアルゴリズム=inplace, lock=none, add index idx_fa (father);MySQL 5.5などのデータベースエンジンバージョンがオンラインDDL操作をサポートしていない場合は、Perconaのpt-online-schema-changeツールを使用できます。
ALTER TABLEの構文の詳細については、「ALTER TABLE構文」をご参照ください。
トラブルシューティング
大規模なテーブルに対して同時DML操作を使用してオンラインDDL操作を実行すると、次のエラーが返される場合があります。
ALTER TABLE 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パラメーターの値で拡張できますが、innodb_online_alter_log_max_sizeパラメーターで指定されたサイズを超えることはできません。
一時ログファイルが最大サイズを超えると、DDL操作は失敗メッセージを返し、コミットされていないすべての同時DML操作をロールバックします。 したがって、innodb_online_alter_log_max_sizeパラメーターを使用して適切なファイルサイズを指定することを推奨します。これにより、より多くの同時DML操作が許可されます。 ただし、ファイルサイズが大きくなると、DDL操作でテーブルをロックしてログデータをテーブルに適用するのにかかる時間が長くなります。
解決策
RDSインスタンスがMySQL 5.6以降を実行している場合、ApsaraDB RDSコンソールでinnodb_online_alter_log_max_sizeパラメーターの値を変更できます。 詳細は、「インスタンスパラメーターの変更」をご参照ください。