TIDB迁移升级(5.1.4-->7.5.2)表导入出错, ERROR 8200 (HY000): Unsupported shard_row_id_bits for table with primary key as row id 。

【 TiDB 使用环境】生产环境
【 TiDB 版本】v5.1.4–>v7.5.2
【复现路径】
【遇到的问题:问题现象及影响】
问题:TIDB5.1版本(A集群)中的表结构我使用MySQLdump导出xx.sql,导入到TIDB7.5.2版本的B集群出错。
出错信息为:ERROR 8200 (HY000): Unsupported shard_row_id_bits for table with primary key as row id。请问如何解决?

5.1版本的表结构为:
CREATE TABLE sms_send_tmp (
msgid varchar(40) NOT NULL,
appid varchar(50) NOT NULL COMMENT ‘appid’,
mobile varchar(45) NOT NULL COMMENT ‘手机号’,
split_count_ok tinyint(3) unsigned DEFAULT NULL COMMENT ‘成功条数’,
split_count_fail tinyint(3) unsigned DEFAULT NULL COMMENT ‘失败条数’,
report_time datetime(3) DEFAULT NULL COMMENT ‘状态报告时间’,
report_desc varchar(100) DEFAULT NULL COMMENT ‘状态报告描述’,
rsa_mobile varchar(512) NOT NULL COMMENT ‘rsa手机号’,
md5_mobile varchar(32) NOT NULL COMMENT ‘md5手机号’,
send_status tinyint(3) NOT NULL DEFAULT ‘0’ COMMENT ‘0:已发送待接收状态报告 1:状态报告成功 -1:状态报告失败 -2:发送接口调用失败’,
PRIMARY KEY (msgid,md5_mobile) /*T![clustered_index] NONCLUSTERED /,
KEY idx_appid (appid),
KEY idx_report_time (report_time)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_bin/
!90000 SHARD_ROW_ID_BITS=4 */ COMMENT=‘短信发送记录表’

此表迁移到7.5.2版本会出错,如何解决?
ERROR 8200 (HY000): Unsupported shard_row_id_bits for table with primary key as row id
【资源配置】

有没有可能你这里的建表语句建的主键是聚簇索引导致?你可以把SHARD_ROW_ID_BITS=4先去掉,建表试试,然后再show create table xxx看下你的建表语句建的主键是否是聚簇索引。

聚簇索引和SHARD_ROW_ID_BITS=4是不兼容的,具体可以看下:https://docs.pingcap.com/zh/tidb/v7.5/clustered-indexes#限制

这么写就行了:
CREATE TABLE sms_send_tmp (

msgid varchar(40) NOT NULL,

appid varchar(50) NOT NULL COMMENT ‘appid’,

mobile varchar(45) NOT NULL COMMENT ‘手机号’,

split_count_ok tinyint(3) unsigned DEFAULT NULL COMMENT ‘成功条数’,

split_count_fail tinyint(3) unsigned DEFAULT NULL COMMENT ‘失败条数’,

report_time datetime(3) DEFAULT NULL COMMENT ‘状态报告时间’,

report_desc varchar(100) DEFAULT NULL COMMENT ‘状态报告描述’,

rsa_mobile varchar(512) NOT NULL COMMENT ‘rsa手机号’,

md5_mobile varchar(32) NOT NULL COMMENT ‘md5手机号’,

send_status tinyint(3) NOT NULL DEFAULT ‘0’ COMMENT ‘0:已发送待接收状态报告 1:状态报告成功 -1:状态报告失败 -2:发送接口调用失败’,

PRIMARY KEY (msgid,md5_mobile) NONCLUSTERED ,

KEY idx_appid (appid),

KEY idx_report_time (report_time)

) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_bin SHARD_ROW_ID_BITS=4 COMMENT=‘短信发送记录表’;

报错来看还是和聚簇索引 和 Shard_row_id_bits 不能共同支持的原因,可以参考另外一个帖子了解一下报错问题。lightning local模式数据迁移fail to split region - #3,来自 Lucien-卢西恩

可以使用 Lightning 导入成功的情况,看一下下游的 Table 的 schema 以及 show table region 的命令查看当前表数据是否已经 sharding 来判断是否已经生效。

检查下这个参数呢tidb_enable_clustered_index

https://docs.pingcap.com/zh/tidb/stable/system-variables#tidb_enable_clustered_index-从-v50-版本开始引入

这个参数先改成一样的设置

看上去不是和聚簇索引相关? 建表中显示的是 NONCLUSTERED 。 把最后的注释由 /*!90000 SHARD_ROW_ID_BITS=4 */
改为 /*T! SHARD_ROW_ID_BITS=4 */ 可以建表。
原表:
PRIMARY KEY (msgid,md5_mobile) /*T![clustered_index] NONCLUSTERED /,
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_bin/
!90000 SHARD_ROW_ID_BITS=4 */

—>
PRIMARY KEY (msgid,md5_mobile) /*T![clustered_index] NONCLUSTERED */,
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_bin /*T! SHARD_ROW_ID_BITS=4 */ COMMENT=‘短信黑名单记录表’;

上面的带这个的建表SQL是你Dumplings导出来的?有看过在5.1.4版本show create table出来的建表语句和导出来的建表语句是否一样吗?

mysql 客户端下建表SQL语句改为如下OK。
CREATE TABLE sms_send (
msgid varchar(40) NOT NULL,
appid varchar(50) NOT NULL COMMENT ‘appid’,
mobile varchar(45) NOT NULL COMMENT ‘手机号’,
message varchar(700) NOT NULL COMMENT ‘短信消息’,
appendid varchar(10) NOT NULL COMMENT ‘扩展码’,
sp varchar(10) NOT NULL COMMENT ‘sp’,
fixed_sp varchar(50) DEFAULT NULL COMMENT ‘入参fixed_sp手动指定则记录’,
gmt_create datetime(3) NOT NULL COMMENT ‘生成时间’,
client_ip varchar(50) DEFAULT NULL,
split_count tinyint(3) unsigned DEFAULT NULL COMMENT ‘拆分条数’,
split_count_ok tinyint(3) unsigned DEFAULT NULL COMMENT ‘成功条数’,
split_count_fail tinyint(3) unsigned DEFAULT NULL COMMENT ‘失败条数’,
report_time datetime(3) DEFAULT NULL COMMENT ‘状态报告时间’,
report_desc varchar(100) DEFAULT NULL COMMENT ‘状态报告描述’,
rsa_mobile varchar(512) NOT NULL COMMENT ‘rsa手机号’,
md5_mobile varchar(32) NOT NULL COMMENT ‘md5手机号’,
send_status tinyint(3) NOT NULL DEFAULT ‘0’ COMMENT ‘0:已发送待接收状态报告 1:状态报告成功 -1:状态报告失败 -2:发送接口调用失败’,
PRIMARY KEY (msgid,md5_mobile) NONCLUSTERED ,
KEY idx_sms_send_gmt_create (gmt_create),
KEY idx_sms_send_md5mobile (md5_mobile),
KEY idx_appid (appid),
KEY idx_sms_send_message_gmt_create (message,gmt_create),
KEY idx_report_time (report_time)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_bin SHARD_ROW_ID_BITS=4 COMMENT=‘短信发送记录表’ ;