AliSQL は、列型の変更操作を InnoDB エンジンレイヤーにプッシュダウンするオンラインカラム変更機能をサポートしています。これにより、読み書き操作をブロックすることなく、オンラインでの変更が可能になります。
仕組み
背景: MySQL 5.6 以降、ほとんどのデータ定義言語 (DDL) ステートメントはオンライン DDL をサポートしており、DDL プロセス中にテーブルに対する読み書き操作が可能です。しかし、MySQL 8.0 に至るまで、列の型を変更するにはCOPY DDL メソッドが必要でした。AliSQL はコミュニティ版 MySQL をベースに、INPLACE DDL メソッドを使用して列を変更できるオンラインカラム変更機能を実装しています。
概要: AliSQL のオンラインカラム変更機能は、COPY メソッドで行われる、サーバーレイヤーで行を 1 行ずつ読み取って挿入する必要がありません。代わりに、列型の変更操作を InnoDB エンジンレイヤーにプッシュダウンし、コミュニティのINPLACE DDL 実行フレームワークを再利用します。プロセス全体は他のINPLACE DDL 操作と同様で、変更中にテーブルに対する通常の読み書き操作が可能です。
前提条件と制限
オンラインカラム変更機能を使用するには、インスタンスは次のいずれかのデータベースバージョンを使用している必要があります。マイナーエンジンバージョンが必要なバージョンより古い場合は、マイナーエンジンバージョンをアップグレードできます。
MySQL 8.4
MySQL 8.0:マイナーエンジンバージョン 20250731 以降。
MySQL 5.7:マイナーエンジンバージョン 20251031 以降。
オンラインカラム変更機能には、次の制限があります。
エンジンの制限: InnoDB エンジンのみがサポートされています。
列型の制限: 次のデータ型に対して、型の変更と長さの拡張のみがサポートされています。
整数型のサイズを大きくする (型の変更):これには、
TINYINT、SMALLINT、MEDIUMINT、INT、BIGINTなど、より小さい整数型からより大きい整数型への変更が含まれます。たとえば、列のINTからBIGINTへの変更はサポートされていますが、BIGINTからINTへの変更はサポートされていません。文字列型の長さを大きくする (長さの拡張):これは、
CHARおよびVARCHAR型の長さを拡張する場合に適用されます。たとえば、列をCHAR(M)からCHAR(N)に変更するには、N が M より大きい必要があります。
その他の制限: パーティションキーの一部である列は変更できません。
パラメーター管理
パラメーター
オンラインカラム変更機能は、次のパラメーターによって制御されます。
パラメーター | 説明 |
|
|
パラメーターの変更
- RDSインスタンスにアクセスし、上部のリージョンを選択し、対象のRDSインスタンスのIDをクリックします。
左側のナビゲーションペインで、[パラメータ設定] をクリックします。
[編集可能なパラメータ] タブで、変更するパラメーターを見つけ、その値を設定します。
[OK] をクリックし、次に [パラメータの送信] をクリックします。表示されるダイアログボックスで、変更が有効になるタイミングを選択します。
使用方法
オンラインカラム変更機能を有効にするには、コンソールで loose_rds_upgrade_datatype_online_enable パラメーターを ON に設定します。次の例では、以下の構成の t1 という名前のテーブルを使用します。
CREATE TABLE `t1` (
`id` int NOT NULL,
`c1` int DEFAULT NULL,
`c2` char(10) DEFAULT NULL,
`c3` varchar(50) DEFAULT NULL,
PRIMARY KEY (`id`)
) ENGINE=InnoDB;INPLACE アルゴリズムの指定
型の変更や長さの拡張など、オンラインでの列の変更に INPLACE アルゴリズムを指定できます。
型の変更:
c1列の型をbigintに変更します。長さの拡張:
c2列とc3列の長さを拡張します。
-- 型の変更:INPLACE アルゴリズムを使用して c1 列の型を変更します。
ALTER TABLE `t1` MODIFY `c1` bigint DEFAULT NULL, ALGORITHM=INPLACE;
-- 結果を表示します。
SHOW CREATE TABLE `t1`\G
*************************** 1. row ***************************
Table: t1
Create Table: CREATE TABLE `t1` (
`id` int NOT NULL,
`c1` bigint DEFAULT NULL,
`c2` char(10) DEFAULT NULL,
`c3` varchar(50) DEFAULT NULL,
PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb3
1 row in set (0.00 sec)
-- 長さの拡張:INPLACE アルゴリズムを使用して c2 列と c3 列の長さを拡張します。
ALTER TABLE `t1` MODIFY `c2` char(20) DEFAULT NULL, ALGORITHM=INPLACE;
ALTER TABLE `t1` MODIFY `c3` varchar(100) DEFAULT NULL, ALGORITHM=INPLACE;
-- 結果を表示します。
SHOW CREATE TABLE `t1`\G
*************************** 1. row ***************************
Table: t1
Create Table: CREATE TABLE `t1` (
`id` int NOT NULL,
`c1` bigint DEFAULT NULL,
`c2` char(20) DEFAULT NULL,
`c3` varchar(100) DEFAULT NULL,
PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb3
1 row in set (0.00 sec)
アルゴリズムを指定しない場合
アルゴリズムを指定しない場合、システムは列型の変更に最も適したアルゴリズムを自動的に選択します。
ALTER TABLE `t1` MODIFY `c1` bigint DEFAULT NULL;