AliSQL はインスタントカラム型変更に対応しています。この機能は、テーブル全体をコピーすることなくメタデータのみを変更するため、変更時間が大幅に短縮され、運用効率が向上します。
機能
背景:バージョン 8.0 以降、コミュニティ版 MySQL は INSTANT DDL に対応しています。列の追加または削除はメタデータの変更のみで済み、データコピーを伴わないため、DDL 操作は数秒で完了します。しかし、カラム型変更については、コミュニティ版 MySQL 8.0 では時間のかかる COPY DDL 方式しか使用できませんでした。AliSQL はコミュニティ版 MySQL を拡張し、INSTANT DDL アルゴリズムを使用してインスタントカラム型変更に対応しています。
概要:AliSQL のインスタントカラム型変更機能は、カラム型を変更する際にデータコピーを行いません。この機能は、コミュニティ版 MySQL の INSTANT DDL 実行フレームワークを使用します。操作ではメタデータのみを変更します。このプロセスは他の INSTANT DDL 操作と同じで、数秒で完了します。
前提条件
この機能を使用するには、ApsaraDB RDS インスタンスが次のいずれかのバージョン要件を満たす必要があります。バージョンが要件を満たしていない場合は、メジャーエンジンバージョンのアップグレードまたはマイナーエンジンバージョンのアップグレードを実行できます。
MySQL 8.4
MySQL 8.0 (マイナーエンジンバージョンが 20251031 以降)
この機能には、以下の制限事項があります。
ストレージエンジン:この機能は InnoDB ストレージエンジンのみに対応しています。
インデックス列:インデックス列は変更できません。
カラム型:以下のカラム型変更と長さ拡張のみを実行できます。
整数型の拡張 (カラム型変更) :
TINYINT、SMALLINT、MEDIUMINT、INT、BIGINTは、小さい型から大きい型への変更のみ可能です。たとえば、INTからBIGINTへの変更は可能ですが、BIGINTからINTへの変更はできません。文字列型の拡張 (長さ拡張) :
CHAR型およびVARCHAR型の長さを増やすことができます。たとえば、列を CHAR(M) から CHAR(N) に変更する場合、N は M より大きい必要があります。
その他の制限事項:パーティションキーの一部である列は変更できません。
パラメータ管理
パラメータ
以下のパラメータでインスタントカラム型変更機能を制御します。
パラメータ | 説明 |
|
|
|
|
|
|
パラメータの変更
- RDSインスタンスにアクセスし、上部のリージョンを選択し、対象のRDSインスタンスのIDをクリックします。
左側のナビゲーションペインで、[パラメーター設定] をクリックします。
[変更可能なパラメーター] タブで、変更したいパラメーターを検索し、その値を設定します。
[OK] をクリックし、[パラメーターを送信] をクリックします。表示されるダイアログボックスで、変更が有効になる時間範囲を選択します。
使用方法
インスタントカラム型変更を有効にするには、コンソールで次の 3 つのパラメータを ON に設定します。
loose_rds_upgrade_datatype_online_enableloose_rds_upgrade_datatype_instant_enableloose_innodb_instant_ddl_enabled
次の例では、以下の構造の t1 という名前のテーブルを使用します。
CREATE TABLE `t1` (
`id` int NOT NULL,
`c1` int DEFAULT NULL,
`c2` varchar(10) DEFAULT NULL,
`c3` char(100) DEFAULT NULL,
`c4` varchar(100) DEFAULT NULL,
PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;INSTANT アルゴリズムによるカラム型の変更
カラム型変更と長さ拡張の両方で INSTANT アルゴリズムを指定できます。
カラム型変更:
INSTANTアルゴリズムを指定して、c1 列の型をbigintに変更します。長さ拡張:
INSTANTアルゴリズムを指定して、c2 列とc3列の長さを拡張します。
アルゴリズムとして INPLACE を指定した場合、操作はインスタントカラム型変更ではなく、オンラインカラム型変更を実行します。
-- カラム型変更:INSTANT アルゴリズムを指定して c1 のカラム型を変更します。
ALTER TABLE `t1` MODIFY `c1` bigint DEFAULT NULL, ALGORITHM=INSTANT;
-- 変更結果を表示します。
SHOW CREATE TABLE `t1`\G
*************************** 1. row ***************************
Table: t1
Create Table: CREATE TABLE `t1` (
`id` int NOT NULL,
`c1` bigint DEFAULT NULL,
`c2` varchar(10) DEFAULT NULL,
`c3` char(100) DEFAULT NULL,
`c4` varchar(100) DEFAULT NULL,
PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb3
1 row in set (0.00 sec)
-- 長さ拡張:INSTANT アルゴリズムを指定して c2 列と c3 列の長さを拡張します。
ALTER TABLE `t1` MODIFY `c2` char(20) DEFAULT NULL, ALGORITHM=INSTANT;
ALTER TABLE `t1` MODIFY `c3` varchar(100) DEFAULT NULL, ALGORITHM=INSTANT;
-- 変更結果を表示します。
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,
`c4` 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;インスタント変更された列の表示
INFORMATION_SCHEMA.INNODB_COLUMNS テーブルの PARENT_PHYSICAL_POSITION フィールドを確認することで、どの列がインスタント変更されたかを特定できます。値が -1 の場合は標準の列を示し、それ以外の値はインスタント変更された列を示します。
-- INNODB_TABLES テーブルをクエリして、サンプルテーブルの TABLE_ID を検索します。
SELECT * FROM INFORMATION_SCHEMA.INNODB_TABLES WHERE NAME = 'demo/t1';
+----------+---------+------+--------+-------+------------+---------------+------------+--------------+--------------------+-----------------------+-----------------------+---------------------+
| TABLE_ID | NAME | FLAG | N_COLS | SPACE | ROW_FORMAT | ZIP_PAGE_SIZE | SPACE_TYPE | INSTANT_COLS | TOTAL_ROW_VERSIONS | INITIAL_COLUMN_COUNTS | CURRENT_COLUMN_COUNTS | TOTAL_COLUMN_COUNTS |
+----------+---------+------+--------+-------+------------+---------------+------------+--------------+--------------------+-----------------------+-----------------------+---------------------+
| 2197 | demo/t1 | 33 | 7 | 1129 | Dynamic | 0 | Single | 0 | 3 | 4 | 4 | 7 |
+----------+---------+------+--------+-------+------------+---------------+------------+--------------+--------------------+-----------------------+-----------------------+---------------------+
1 row in set (0.00 sec)
-- TABLE_ID を使用して、INNODB_COLUMNS テーブルから列情報を取得します。
-- クエリ結果では、PARENT_PHYSICAL_POSITION フィールド (値が -1 ではない) でインスタント変更された列を特定できます。
SELECT * FROM INFORMATION_SCHEMA.INNODB_COLUMNS WHERE TABLE_ID = 2197;
+----------+------+-----+-------+---------+-----+-------------+---------------+---------------+-----------------+--------------+------------------+--------------------------+
| TABLE_ID | NAME | POS | MTYPE | PRTYPE | LEN | HAS_DEFAULT | DEFAULT_VALUE | VERSION_ADDED | VERSION_DROPPED | PHYSICAL_POS | VERSION_MODIFIED | PARENT_PHYSICAL_POSITION |
+----------+------+-----+-------+---------+-----+-------------+---------------+---------------+-----------------+--------------+------------------+--------------------------+
| 2197 | id | 0 | 6 | 1283 | 4 | 0 | NULL | 0 | 0 | 0 | 0 | -1 |
| 2197 | c1 | 1 | 6 | 1032 | 8 | 1 | NULL | 1 | 0 | 6 | 0 | 3 |
| 2197 | c2 | 2 | 13 | 2162942 | 60 | 1 | NULL | 2 | 0 | 7 | 0 | 4 |
| 2197 | c3 | 3 | 12 | 2166799 | 300 | 1 | NULL | 3 | 0 | 8 | 0 | 5 |
+----------+------+-----+-------+---------+-----+-------------+---------------+---------------+-----------------+--------------+------------------+--------------------------+
4 rows in set (0.02 sec)