在MySQL生态中,修改字段的类型需要使用COPY算法对全表数据进行重建,且重建过程中目标表只能查询数据,不能并发的写入数据。更糟糕的是,COPY算法采用单线程进行全表重建,其效率较低。因此,修改字段类型操作一直是MySQL生态下的痛点问题。为了解决这一问题,PolarDB MySQL版支持秒级修改字段(Instant Modify Column)功能,在修改字段类型时,只需变更表定义信息,无需修改已有数据,可以快速完成对任意大小表的字段类型修改操作。本文介绍如何使用秒级修改字段类型功能。
前提条件
PolarDB MySQL版8.0.2版本且修订版本为8.0.2.2.28及以上,您可以通过查询版本号来确认集群版本。
参数说明
参数名 | 级别 | 说明 |
loose_innodb_polar_instant_modify_column_enable | Global | 秒级修改字段功能控制开关。取值范围如下: |
loose_innodb_polar_instant_modify_column_max_times | Global | 设置单表允许的秒级修改字段最大次数。 取值范围:1~64。 默认值为16。 |
说明
PolarDB MySQL版秒级修改字段功能目前处于灰度发布阶段。如需使用请前往配额中心,根据配额IDpolarm_82_instant_modify_column找到配额名称,在对应的操作列单击申请来开通该功能。
使用限制
- 仅允许对以下数据类型进行长度扩展变更,不支持秒级修改除长度外的其他字段属性。具体支持的变更类型如下:
- 整数类型:支持在TINYINT、SMALLINT、MEDIUMINT、INT和BIGINT类型之间秒级修改,但仅支持秒级扩大长度,不支持秒级缩小长度。
例如,INT类型可以秒级修改为BIGINT类型,但无法将BIGINT类型秒级修改为INT类型。
字符串类型:
- 支持VARCHAR(N)类型秒级修改为VARCHAR(N+M)类型,其中N和M均为大于0的正整数。例如,VARCHAR(50)类型可以秒级修改为VARCHAR(300)类型,但不支持将VARCHAR(300)类型秒级修改为VARCHAR(50)类型。
- 支持CHAR(N)类型秒级修改为CHAR(N+M)类型,其中N和M均为大于0的正整数。例如,CHAR(30)类型可以秒级修改为CHAR(50)类型,但不支持将CHAR(50)类型秒级修改为CHAR(30)类型。
- 不支持分区表进行秒级修改字段操作。
说明
您可以在执行DDL操作前使用EXPLAIN DDL功能,直观地判断当前DDL操作是否支持INSTANT操作。详细内容请参见EXPLAIN DDL。
使用方法
指定ALGORITHM=INSTANT以强制使用秒级修改字段功能(推荐)
CREATE TABLE t(a int);SHOW CREATE TABLE t;
*************************** 1. row ***************************
Table: t
Create Table: CREATE TABLE `t` (
`a` int(11) DEFAULT NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8-- 指定使用INSTANT算法快速修改字段类型
ALTER TABLE t modify COLUMN a bigint DEFAULT NULL,algorithm=INSTANT;说明
使用上述语句时,若返回ERROR 1846 (0A000): ALGORITHM=INSTANT is not supported. Reason: Cannot change column type INPLACE. Try ALGORITHM=COPY/INPLACE.的错误,表示当前修改字段类型操作无法使用Instant算法执行。建议您查看loose_innodb_polar_instant_modify_column_enable参数是否已开启,并仔细核对使用限制。
不指定ALGORITHM或指定ALGORITHM=DEFAULT,由PolarDB MySQL自行选择最优执行方式
当不指定ALGORITHM或者指定为ALGORITHM=DEFAULT时,系统将按照如下优先级选择最优的算法进行修改字段类型操作。
ALTER TABLE test.test_table MODIFY COLUMN test_column bigint, ALGORITHM=DEFAULT;
ALTER TABLE test.test_table MODIFY COLUMN test_column bigint;说明
PolarDB MySQL版数据库在算法选择过程中遵循以下优先级顺序:
查看秒级修改的字段信息
在INFORMATION_SCHEMA数据库中新增了INNODB_INSTANT_COLUMNS表。该表记录了当前集群中所有曾进行过秒级修改的字段的信息(只有经过秒级修改的字段才会被收录在此表中)。该表结构如下:
SHOW CREATE TABLE INFORMATION_SCHEMA.INNODB_INSTANT_COLUMNS;
***************************[ 1. row ]***************************
Table | INNODB_INSTANT_COLUMNS
Create Table | CREATE TEMPORARY TABLE `INNODB_INSTANT_COLUMNS` (
`TABLE_ID` bigint(21) unsigned NOT NULL DEFAULT '0',
`TABLE_NAME` varchar(193) NOT NULL DEFAULT '',
`SCHEMA_NAME` varchar(193) NOT NULL DEFAULT '',
`COLUMN_NAME` varchar(193) NOT NULL DEFAULT '',
`MTYPE` int(11) NOT NULL DEFAULT '0',
`PRTYPE` int(11) NOT NULL DEFAULT '0',
`LEN` int(11) NOT NULL DEFAULT '0',
`HAS_DEFAULT` int(1) NOT NULL DEFAULT '0',
`DEFAULT_VALUE` mediumblob,
`CURRENT_VERSION` int(11) NOT NULL DEFAULT '0',
`OLD_VERSION_INFO` blob
) ENGINE=InnoDB DEFAULT CHARSET=utf8字段说明如下:
借助表INFORMATION_SCHEMA.INNODB_INSTANT_COLUMNS,您可以使用如下语句了解当前集群已被秒级修改的字段的情况:
SELECT * FROM INFORMATION_SCHEMA.INNODB_INSTANT_COLUMNS;说明
如果目标表使用了Instant算法进行字段类型修改操作,而后又执行了需要重建表的DDL操作(如DROP COLUMN等),系统将会删除INNODB_INSTANT_COLUMNS表中与该目标表相关的字段信息。




