开启alter-primary-key修改旧表引发异常

集群版本:v4.0.2
问题描述:从之前旧集群v3.0.x版本升级到最新v4.0.2,开启TiDB配置alter-primary-key: true
在旧表t1(之前主键为id)直接执行ALTER TABLE t1 ADD PRIMARY KEY (id,create_time);
ddl可以执行成功,但原表数据无法访问(出现异常[err="[tikv:10000][components/tidb_query/src/batch/executors/table_scan_executor.rs:338]: Data is corrupted, missing data for NOT NULL column (offset = 0)"])
开启alter-primary-key后创建的表无问题
期望结果:在开启alter-primary-key创建表的,若执行ALTER TABLE t1 ADD PRIMARY KEY (id,create_time);直接报错

  1. 麻烦发下表结构
  2. 是 create_time 之前有很多空值吗?

CREATE TABLE tb_goods_track (
id bigint(20) NOT NULL COMMENT ‘id’,
waybill_number varchar(20) COLLATE utf8mb4_unicode_ci NOT NULL DEFAULT ‘’ COMMENT ‘运单号’,
transport_tool_type tinyint(2) DEFAULT 0 COMMENT ‘运输工具类型(1:车, 2:场地, 飞机)’,
nodeId varchar(64) COLLATE utf8mb4_unicode_ci DEFAULT ‘’ COMMENT ‘运输工具标识(车牌号或场地id或航班号)’,
node_type tinyint(2) DEFAULT NULL COMMENT ‘’‘组织类型(0.其他 10.分拨中心 20.取派中心)’’,’,
unloading_time int(11) DEFAULT 0 COMMENT ‘卸货时间’,
waybill_number_create_time bigint(20) NOT NULL DEFAULT 0 COMMENT ‘运单创建时间’,
loading_time int(11) DEFAULT 0 COMMENT ‘装货时间’,
create_time int(11) DEFAULT 0 COMMENT ‘创建时间’,
update_time int(11) DEFAULT 0 COMMENT ‘修改时间’,
department_id bigint(20) DEFAULT 0 COMMENT ‘场地对应的组织架构id’,
KEY idx_waybill_number (waybill_number),
KEY idx_waybill_number_node_id (waybill_number,nodeId),
PRIMARY KEY (id)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;

ALTER TABLE tb_goods_track ADD PRIMARY KEY (id, waybill_number, waybill_number_create_time);

waybill_number_create_time是后面加的字段,历史数据存在空值

您好,参照您的步骤,我尝试再 add primary key时就会报错。尝试创建一个测试表3个列测试,也是同样的报错,能否麻烦您帮忙用测试表,模拟还原一下,多谢。

之前那个表执行以上操作后不能使用,drop掉重新建了,问题可以复现(用另一个表)





这个是表结构,目前正在执行修改主键(这个是可以执行成功的,待成功后反馈表就不能使用了)

可否加微信沟通交流(试过3个表,都有类似情况,ddl执行完表数据完全无法访问)


另一个表执行是报错(类似主键为null信息),执行完里面的数据也无法访问

请问具体是3.x哪个版本?我们再测试下升级之后是否有相同问题,多谢。

集群安装最初版本应该是v3.0.1,后续随tidb版本发布升级(v3.0.3->v3.0.5->v3.0.8->v3.0.10->v3.0.14->v4.0.0->v4.0.1->v4.0.2)
目前是否还需保留现场方便咱们排查问题(若不需要,就先drop table重建表,让测试环境业务先正常恢复)?

不好意思,可以恢复测试环境业务恢复使用了。

此问题是旧表的 primary key 是整型单列的情况下,会有此问题出现。已经在 https://github.com/pingcap/tidb/pull/18340 修复,并 cherry-pick 到对应的 3.* 和 4.* 分支,会在 4.0.3(目前还没有发版)带上此 bug-fix。

好的,收到

:handshake:

此话题已在最后回复的 1 分钟后被自动关闭。不再允许新回复。