集群版本: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
);直接报错
- 麻烦发下表结构
- 是 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是后面加的字段,历史数据存在空值
可否加微信沟通交流(试过3个表,都有类似情况,ddl执行完表数据完全无法访问)
请问具体是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。
好的,收到
此话题已在最后回复的 1 分钟后被自动关闭。不再允许新回复。