全部產品
Search
文件中心

ApsaraDB RDS:秒級修改列類型

更新時間:May 13, 2026

AliSQL支援秒級修改列類型功能,修改列類型時僅修改中繼資料而無需全量拷貝資料,可大幅降低修改耗時,提升營運效率。

功能說明

背景:社區MySQL從8.0版本開始支援INSTANT DDL,加列和刪列操作只需要修改中繼資料,而無需拷貝資料,DDL可以秒級完成。但是對於修改列類型的操作,社區MySQL 8.0還是只能通過COPY DDL的方式執行,DDL耗時較長。AliSQL在社區MySQL的基礎上,支援秒級修改列類型功能,通過INSTANT DDL的方式執行修改列類型操作。

簡介:AliSQL 秒級修改列類型(Instant Modify Column)功能在修改列類型時無需再進行資料拷貝,而是複用社區INSTANT DDL的執行架構,在修改列類型時,只需要進行中繼資料的修改,整個修改列類型的執行過程和其他INSTANT DDL完全相同,修改列類型的過程可以秒級完成。

適用範圍

資料庫版本需滿足以下要求才能使用秒級修改列類型功能,當版本不符合要求時,可以升級資料庫大版本核心小版本

  • MySQL 8.4

  • MySQL 8.0且核心小版本大於等於20251031

使用該功能時,有以下限制條件:

  • 引擎節流:僅支援InnoDB引擎。

  • 索引限制:不支援修改索引列。

  • 列類型限制:僅支援對以下資料類型進行類型修改或長度擴充:

    • 整數類型變大(類型修改):包括TINYINTSMALLINTMEDIUMINTINTBIGINT類型從小變大。例如:支援INTBIGINT修改,不支援BIGINTINT修改。

    • 字串類型變長(長度擴充):包括CHAR類型和VARCHAR類型變長,例如:CHAR(M)修改至CHAR(N),需要N > M。

  • 其他限制:不支援修改分區鍵包含的列。

參數管理

參數說明

秒級修改列類型功能受以下參數控制:

參數名稱

說明

loose_rds_upgrade_datatype_instant_enable

  • 描述:秒級修改列類型功能開關。

  • 參數範圍:全域參數。

  • 資料類型:Boolean

  • 預設值:OFF

  • 取值範圍:ONOFF

  • 是否需要重啟執行個體:否。

loose_rds_upgrade_datatype_online_enable

  • 描述:線上修改列類型功能開關。

  • 參數範圍:全域參數。

  • 資料類型:Boolean

  • 預設值:OFF

  • 取值範圍:ONOFF

  • 是否需要重啟執行個體:否。

loose_innodb_instant_ddl_enabled

  • 描述:INSTANT DDL總開關。

  • 參數範圍:全域參數。

  • 資料類型:Boolean

  • 預設值:ON

  • 取值範圍:ONOFF

  • 是否需要重啟執行個體:否。

修改參數

  1. 訪問RDS執行個體列表,在上方選擇地區,然後單擊目標執行個體ID。

  2. 在左側導覽列中單擊參數設定

  3. 可修改參數頁簽內搜尋待修改參數,並配置參數值。

  4. 單擊確定,然後單擊提交參數,並在彈出的視窗中選擇生效的時間段。

使用方法

您需要在控制台上將以下三個參數的值設定為ON,開啟秒級修改列類型功能:

  • loose_rds_upgrade_datatype_online_enable

  • loose_rds_upgrade_datatype_instant_enable

  • loose_innodb_instant_ddl_enabled

為方便後續說明,假設待修改的資料表為t1,表結構如下所示:

CREATE TABLE `t1` (
  `id` int NOT NULL,
  `c1` char(10) 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演算法擴充c2c3列類型長度。

說明

如果將演算法指定為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` char(10) DEFAULT NULL,
  `c3` varchar(50) 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,
  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 查詢樣本表的ID(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)