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引擎。
索引限制:不支援修改索引列。
列類型限制:僅支援對以下資料類型進行類型修改或長度擴充:
整數類型變大(類型修改):包括
TINYINT、SMALLINT、MEDIUMINT、INT、BIGINT類型從小變大。例如:支援INT向BIGINT修改,不支援BIGINT向INT修改。字串類型變長(長度擴充):包括
CHAR類型和VARCHAR類型變長,例如:CHAR(M)修改至CHAR(N),需要N > M。
其他限制:不支援修改分區鍵包含的列。
參數管理
參數說明
秒級修改列類型功能受以下參數控制:
參數名稱 | 說明 |
|
|
|
|
|
|
修改參數
訪問RDS執行個體列表,在上方選擇地區,然後單擊目標執行個體ID。
在左側導覽列中單擊參數設定。
在可修改參數頁簽內搜尋待修改參數,並配置參數值。
單擊確定,然後單擊提交參數,並在彈出的視窗中選擇生效的時間段。
使用方法
您需要在控制台上將以下三個參數的值設定為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` 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演算法擴充
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` 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)