分区表主键插入重复 bug

【 TiDB 使用环境】生产环境 /测试/ Poc
【 TiDB 版本】v6.5.2 v7.5.2 v8.1.0
【复现路径】创建column range 分区表,插入数据,新增分区,插入重复数据
【遇到的问题:问题现象及影响】违背唯一约束,插入了重复数据
截图此页面*
image

-- 创建分区表
CREATE TABLE `p1` (
  `id` bigint(12) NOT NULL,
  `create_time` datetime NOT NULL,
  `brand_type` varchar(8) NOT NULL DEFAULT 'Y' COMMENT '品牌',
  PRIMARY KEY (`id`,`create_time`,`brand_type`) /*T![clustered_index] CLUSTERED */
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_bin
PARTITION BY RANGE COLUMNS(`brand_type`,`create_time`)
(
PARTITION `p20240520A` VALUES LESS THAN ('A','2024-05-20 00:00:00'),
PARTITION `p20240520B` VALUES LESS THAN ('B','2024-05-20 00:00:00'),
PARTITION `p20240520C` VALUES LESS THAN ('C','2024-05-20 00:00:00'),
PARTITION `p20240520Z` VALUES LESS THAN ('Z','2024-05-20 00:00:00'));
-- 插入数据   
INSERT INTO `test`.`p1`(`id`, `create_time`, `brand_type`) VALUES (1, '2024-05-19 00:00:01', 'A');
INSERT INTO `test`.`p1`(`id`, `create_time`, `brand_type`) VALUES (2, '2024-05-19 00:00:01', 'B');
INSERT INTO `test`.`p1`(`id`, `create_time`, `brand_type`) VALUES (3, '2024-05-19 00:00:01', 'C');
INSERT INTO `test`.`p1`(`id`, `create_time`, `brand_type`) VALUES (4, '2024-05-19 00:00:01', 'Z');
-- 添加分区
 alter table test.p1 add PARTITION (
PARTITION `p20240521A` VALUES LESS THAN ('A','2024-05-21 00:00:00'),
PARTITION `p20240521B` VALUES LESS THAN ('B','2024-05-21 00:00:00'),
PARTITION `p20240521C` VALUES LESS THAN ('C','2024-05-21 00:00:00'),
PARTITION `p20240521Z` VALUES LESS THAN ('Z','2024-05-21 00:00:00'));
 
 -- 本该失败,却插入成功
INSERT INTO `test`.`p1`(`id`, `create_time`, `brand_type`) VALUES (2, '2024-05-19 00:00:01', 'B');
INSERT INTO `test`.`p1`(`id`, `create_time`, `brand_type`) VALUES (3, '2024-05-19 00:00:01', 'C');
INSERT INTO `test`.`p1`(`id`, `create_time`, `brand_type`) VALUES (4, '2024-05-19 00:00:01', 'Z');
 
select * from test.p1;

image

看起来确实是 bug :thinking:

试了下,只有添加最后一个分区就会出问题,只加前面3个的没事。但是跟最后一个分区名 value都没关系

关注下这个问题~

:grinning:我这边的是,只有第一个分区插入重复的时候是会失败,其他分区的成功。

看起来就是因为添加分区导致分区范围错误,插到不该插的分区了,或许 range columns 分区不应该做添加分区操作呢 :thinking: 帮你提了个 issue 跟踪下:https://github.com/pingcap/tidb/issues/54829

1 个赞

Mark.
执行新增分区的行为不兼容 mysql,mysql 会直接报错:ERROR 1493 (HY000): VALUES LESS THAN value must be strictly increasing for each partition

1 个赞

关注
看GitHub上已经有pr了,这解决速度够快!

关注问题解决

mark一下

mark一下,不错不错

看着确实像bug

的确需要官方给出解决方案。

插眼关注

感觉是 bug 我给改为 bug 反馈了,晚点让研发瞅瞅。

已经确认是 bug,在修了。

具体是啥bug

插眼关注

修复 PR:https://github.com/pingcap/tidb/pull/54839

2 个赞

Range partition 需要分区之间是严格递增的,TiDB 之前判断递增的逻辑有点问题,导致 add partition 成功了,现在已经在 master 上修复了