AliSQL はコミュニティ版 MySQL 8.0 を拡張し、列タイプの即時変更をサポートします。この操作では、すべてのテーブルデータをコピーするのではなく、メタデータのみを変更するため、テーブルサイズに関係なく数秒で完了します。
コミュニティ版 MySQL 8.0 では、列の追加と削除に INSTANT DDL を使用することで、データのコピーを回避します。ただし、列タイプの変更については COPY DDL にフォールバックするため、テーブル全体を書き換える必要があります。AliSQL は INSTANT DDL フレームワークを拡張して列タイプの変更にも対応し、同じメタデータのみのアプローチを適用します。
前提条件
開始する前に、以下を満たしていることを確認してください。
-
MySQL 8.0 を実行し、マイナーエンジンバージョンが 20251031 以降の ApsaraDB RDS for MySQL インスタンス
インスタンスがこの要件を満たしていない場合は、まずアップグレードしてください。
制限事項
| 制約 | 詳細 |
|---|---|
| ストレージエンジン | InnoDB のみ |
| インデックス列 | インデックス列の変更はサポートされていません |
| パーティションキー列 | パーティションキーに含まれる列の変更はサポートされていません |
| サポートされる整数型の変更 | 拡大のみ:TINYINT → SMALLINT → MEDIUMINT → INT → BIGINT。例えば、INT から BIGINT への変更はサポートされますが、BIGINT から INT への変更はサポートされません |
| サポートされる文字列型の変更 | CHAR および VARCHAR 列の長さの拡大のみ。CHAR(M) から CHAR(N) への変更では、N は M より大きい必要があります |
パラメーター
この機能を制御する 3 つのパラメーターがあります。列タイプの即時変更を機能させるには、3 つすべてを ON に設定する必要があります。
| パラメーター | 説明 | スコープ | デフォルト |
|---|---|---|---|
loose_rds_upgrade_datatype_instant_enable |
列タイプの即時変更を有効にします | グローバル | OFF |
loose_rds_upgrade_datatype_online_enable |
列タイプのオンライン変更を有効にします | グローバル | OFF |
loose_innodb_instant_ddl_enabled |
INSTANT DDL のマスタースイッチ | グローバル | ON |
3 つのパラメーターはすべてブール型で、ON または OFF を設定でき、インスタンスの再起動は必要ありません。
パラメーターの有効化
-
[インスタンス] ページに移動します。上部メニューで、RDS インスタンスが存在するリージョンを選択します。インスタンスを見つけて、その ID をクリックします。
-
左側のナビゲーションペインで、[パラメーター設定] をクリックします。
-
[変更可能なパラメータ] タブで、各パラメータを検索して、その値を
ONに設定します。 -
[OK]をクリックし、[パラメーターの送信]をクリックします。表示されるウィンドウで、変更が有効になる時間範囲を選択します。
列タイプの即時変更
以下の例では、次のテーブルを使用します。
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;
すべての例では、ALGORITHM=INSTANT を使用して、変更をメタデータのみの操作として実行します。
列タイプの変更
c1 を int から bigint に変更します:
ALTER TABLE `t1` MODIFY `c1` bigint DEFAULT NULL, ALGORITHM=INSTANT;
文字列長の拡大
c2 (CHAR) と c3 (VARCHAR) の長さを拡張します:
ALTER TABLE `t1` MODIFY `c2` char(20) DEFAULT NULL, ALGORITHM=INSTANT;
ALTER TABLE `t1` MODIFY `c3` varchar(100) DEFAULT NULL, ALGORITHM=INSTANT;
システムによるアルゴリズムの選択
ALGORITHM= を省略すると、システムが列の型変更に最も適切なアルゴリズムを自動的に選択します:
ALTER TABLE `t1` MODIFY `c1` bigint DEFAULT NULL;
ALGORITHM=INPLACE を指定すると、変更はオンライン (インプレース方式を使用) で実行されますが、即時には実行されません。
変更の確認
現在のバージョンでは、即時変更された列を個別に表示することはサポートされていません。次の SQL を使用してテーブル列情報をクエリできます。クエリ結果の HAS_DEFAULT 列の値が 1 の場合、その列は即時列追加機能によって追加されたか、即時変更されたものです。
SELECT * FROM INFORMATION_SCHEMA.INNODB_COLUMNS WHERE TABLE_ID =
(SELECT TABLE_ID FROM INFORMATION_SCHEMA.INNODB_TABLES WHERE NAME = "<database_name>/<table_name>");
出力例:
+----------+------+-----+-------+---------+-----+-------------+------------------------------------------------------------------------------------+
| TABLE_ID | NAME | POS | MTYPE | PRTYPE | LEN | HAS_DEFAULT | DEFAULT_VALUE |
+----------+------+-----+-------+---------+-----+-------------+------------------------------------------------------------------------------------+
| 1976 | id | 0 | 6 | 1283 | 4 | 0 | NULL |
| 1976 | c1 | 1 | 6 | 1032 | 8 | 1 | 0x38303030303030303030303030303030 |
| 1976 | c2 | 2 | 13 | 2162942 | 60 | 1 | 0x32303230323032303230323032303230323032303230323032303230323032303230323032303230 |
| 1976 | c3 | 3 | 12 | 2166799 | 300 | 1 | 0x |
+----------+------+-----+-------+---------+-----+-------------+------------------------------------------------------------------------------------+