AliSQL支援線上修改列類型功能(Online Modify Column),其將列類型修改操作下沉至InnoDB引擎層,實現了不阻塞讀寫的線上變更。
功能說明
背景:自社區MySQL 5.6版本起,大部分DDL均支援線上執行(Online DDL),DDL執行過程中可以對資料表進行正常的讀寫操作。但是對於修改列類型的操作,一直到MySQL 8.0版本都只能通過COPY DDL方式執行。AliSQL在社區MySQL的基礎上,實現了線上修改列類型功能,支援通過INPLACE DDL方式執行修改列操作。
簡介:AliSQL線上修改列類型(Online Modify Column)功能在修改列類型時無需在Server層通過COPY方式按行讀取和插入,而是將修改列類型操作下沉到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執行個體列表,在上方選擇地區,然後單擊目標執行個體ID。
在左側導覽列中單擊參數設定。
在可修改參數頁簽內搜尋待修改參數,並配置參數值。
單擊確定,然後單擊提交參數,並在彈出的視窗中選擇生效的時間段。
使用方法
您需要在控制台上設定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演算法線上修改列類型(含類型修改和長度擴充):
類型修改:指定INPLACE演算法修改
c1列類型為bigint。長度擴充:指定INPLACE演算法擴充
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;