真没想到,MySQL8.0 交换分区竟然有这样的 bug
根据之前的文章 MySQL 非分区表如何改造成分区表?我们知道分区表很适合用来做大表转储。最近生产做转储变更,发现 MySQL 8.0 交换分区竟然有个bug,即分区表上加字段后再交换分区,会报错 Error Code: 1731. Non matching attribute 'INSTANT COLUMN(s)' between partition and table.复现场景如下:
mysql> CREATE TABLE `TEST` (
`ID` bigint(20) NOT NULL AUTO_INCREMENT COMMENT '主键ID',
`NAME` varchar(200) DEFAULT NULL,
`CREATE_TIME` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
PRIMARY KEY (`CREATE_TIME`,`ID`),
KEY `IDX_NAME` (`NAME`),
KEY `IDX_ID` (`ID`)
) ENGINE=InnoDB AUTO_INCREMENT=2293142 DEFAULT CHARSET=utf8mb4 COMMENT='测试表'
PARTITION by RANGE COLUMNS(CREATE_TIME)
(PARTITION P202301 VALUES LESS THAN ('2023-02-01') ENGINE = InnoDB,
PARTITION P202302 VALUES LESS THAN ('2023-03-01') ENGINE = InnoDB,
PARTITION P202303 VALUES LESS THAN ('2023-04-01') ENGINE = InnoDB,
PARTITION P202304 VALUES LESS THAN ('2023-05-01') ENGINE = InnoDB,
PARTITION P202305 VALUES LESS THAN ('2023-06-01') ENGINE = InnoDB,
PARTITION P202306 VALUES LESS THAN ('2023-07-01') ENGINE = InnoDB,
PARTITION P202307 VALUES LESS THAN ('2023-08-01') ENGINE = InnoDB,
PARTITION P202308 VALUES LESS THAN ('2023-09-01') ENGINE = InnoDB,
PARTITION P202309 VALUES LESS THAN ('2023-10-01') ENGINE = InnoDB,
PARTITION P202310 VALUES LESS THAN ('2023-11-01') ENGINE = InnoDB,
PARTITION P202311 VALUES LESS THAN ('2023-12-01') ENGINE = InnoDB,
PARTITION P202312 VALUES LESS THAN ('2024-01-01') ENGINE = InnoDB,
PARTITION PMAX VALUES LESS THAN (MAXVALUE) ENGINE = InnoDB);
<br>
mysql> alter table TEST add `ADDRESS` varchar(200) DEFAULT NULL COMMENT '地址';
<br>
mysql> CREATE TABLE `TEST_P202301` (
`ID` bigint(20) NOT NULL AUTO_INCREMENT COMMENT '主键ID',
`NAME` varchar(200) DEFAULT NULL COMMENT '名字',
`CREATE_TIME` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
`ADDRESS` varchar(200) DEFAULT NULL COMMENT '地址',
PRIMARY KEY (`CREATE_TIME`,`ID`),
KEY `IDX_NAME` (`NAME`),
KEY `IDX_ID` (`ID`)
) ENGINE=InnoDB AUTO_INCREMENT=2293142 DEFAULT CHARSET=utf8mb4 COMMENT='测试表';
<br>
<br>
mysql> alter table TEST EXCHANGE PARTITION P202301 WITH TABLE TEST_P202301 without validation;
Error Code: 1731. Non matching attribute 'INSTANT COLUMN(s)' between partition and table.