在线修改列类型

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.0:内核小版本大于等于20250731。

  • MySQL 5.7:内核小版本大于等于20251031。

使用在线修改列类型功能时,有以下限制:

  • 引擎限制:仅支持InnoDB引擎。

  • 列类型限制:仅支持对以下数据类型进行类型修改或长度扩展:

    • 整数类型变大(类型修改):包括TINYINTSMALLINTMEDIUMINTINTBIGINT类型从小变大。例如:支持INTBIGINT修改,不支持BIGINTINT修改。

    • 字符串类型变长(长度扩展):包括CHAR类型和VARCHAR类型变长,例如:CHAR(M)修改至CHAR(N),需要N > M。

  • 其他限制:不支持修改分区键包含的列。

参数管理

参数说明

在线修改列类型功能受以下参数控制:

参数名称

说明

loose_rds_upgrade_datatype_online_enable

  • 描述:在线修改列类型功能开关。

  • 参数范围:全局参数。

  • 数据类型:Boolean

  • 默认值:OFF

  • 取值范围:ONOFF

  • 是否需要重启实例:否。

修改参数

  1. 访问RDS实例列表,在上方选择地域,然后单击目标实例ID。

  2. 在左侧导航栏中单击参数设置

  3. 可修改参数页签内搜索待修改参数,并配置参数值。

  4. 单击确定,然后单击提交参数,并在弹出的窗口中选择生效的时间段。

使用方法

您需要在控制台上设置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算法扩展c2c3列类型长度。

-- 类型修改:指定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;