单表数据量超过20亿行,进行插入时报错 RROR 9010 (HY000): TiKV server reports stale command

为提高效率,请提供以下信息,问题描述清晰能够更快得到解决:
【 TiDB 使用环境】
5.7.25-TiDB-v4.0.0

【概述】 场景 + 问题概述
单表数据量超过20亿行,进行插入时报错 RROR 9010 (HY000): TiKV server reports stale command,单列插入测试,最后定位其中一列,只要包含 “广西”,则插入或更新失败,执行的sql语句如下:
UPDATE
sy_cs_mm_cn_bond_risk_detail
SET
ISSUER = ‘广西’
WHERE fingerId = ‘dfb70aa904053d449c9c88a097277208’

执行结果返回报错信息如下:
ERROR 9010 (HY000): TiKV server reports stale command

执行截图如下:
image

【背景】 做过哪些操作

【现象】 业务和数据库现象

【问题】 当前遇到的问题

【业务影响】

【TiDB 版本】

【应用软件及版本】

【附件】 相关日志及配置信息

  • TiUP Cluster Display 信息
  • TiUP CLuster Edit config 信息

监控(https://metricstool.pingcap.com/)

  • TiDB-Overview Grafana监控
  • TiDB Grafana 监控
  • TiKV Grafana 监控
  • PD Grafana 监控
  • 对应模块日志(包含问题前后 1 小时日志)

若提问为性能优化、故障排查类问题,请下载脚本运行。终端输出的打印结果,请务必全选并复制粘贴上传。

能提供下表结构 ,字符集设定,以及 tidb 的日志么?

CREATE TABLE sy_cs_mm_cn_bond_risk_detail (
id bigint(20) NOT NULL AUTO_INCREMENT COMMENT ‘自增id’,
bondId int(11) DEFAULT NULL COMMENT ‘债券id’,
secuCode varchar(10) DEFAULT NULL COMMENT ‘债券代码’,
sname varchar(100) DEFAULT NULL COMMENT ‘债券简称’,
cname varchar(200) DEFAULT NULL COMMENT ‘债券全称’,
issuer varchar(200) DEFAULT NULL COMMENT ‘债券发行人’,
secuMarket int(11) DEFAULT NULL COMMENT ‘证券市场’,
underwriter varchar(200) DEFAULT NULL COMMENT ‘债券主承销商’,
startDate datetime DEFAULT NULL COMMENT ‘债券起息日’,
endDate datetime DEFAULT NULL COMMENT ‘债券到期日’,
subjectType varchar(50) DEFAULT NULL COMMENT ‘事项主体类型’,
websiteSnapshot varchar(1000) DEFAULT NULL COMMENT ‘网站截图url’,
eventId varchar(100) NOT NULL COMMENT ‘事件标识’,
eventType varchar(50) DEFAULT NULL COMMENT ‘事件类型’,
eventSubject varchar(100) DEFAULT NULL COMMENT ‘事件主体’,
eventNum1 varchar(100) DEFAULT NULL COMMENT ‘文书号1’,
eventNum2 varchar(100) DEFAULT NULL COMMENT ‘文书号2’,
eventNum3 varchar(100) DEFAULT NULL COMMENT ‘文书号3’,
party1 varchar(1000) DEFAULT NULL COMMENT ‘涉事方1’,
party2 varchar(1000) DEFAULT NULL COMMENT ‘涉事方2’,
party3 varchar(1000) DEFAULT NULL COMMENT ‘涉事方3’,
cash1 decimal(19,4) DEFAULT NULL COMMENT ‘涉事金额1(人民币元)’,
cash2 decimal(19,4) DEFAULT NULL COMMENT ‘涉事金额2(人民币元)’,
cash3 decimal(19,4) DEFAULT NULL COMMENT ‘涉事金额3(人民币元)’,
label1 varchar(100) DEFAULT NULL COMMENT ‘事件标签1’,
label2 varchar(100) DEFAULT NULL COMMENT ‘事件标签2’,
label3 varchar(100) DEFAULT NULL COMMENT ‘事件标签3’,
priority varchar(50) DEFAULT NULL COMMENT ‘重要程度’,
eventDesc text DEFAULT NULL COMMENT ‘事件描述’,
detail text DEFAULT NULL COMMENT ‘事件详情’,
eventSrc varchar(100) DEFAULT NULL COMMENT ‘事件来源’,
eventUrl varchar(1000) DEFAULT NULL COMMENT ‘事件来源链接’,
eventTime datetime DEFAULT NULL COMMENT ‘事件发生时间’,
endTime datetime DEFAULT NULL COMMENT ‘事件结束时间’,
pubTime datetime DEFAULT NULL COMMENT ‘事件发布时间’,
subTime datetime DEFAULT NULL COMMENT ‘事件获取时间’,
relationLink text DEFAULT NULL COMMENT ‘关系链路’,
createDate date DEFAULT NULL COMMENT ‘生成日期’,
secuMarket2 varchar(50) NOT NULL COMMENT ‘债券市场-zxjt’,
fingerId varchar(100) NOT NULL COMMENT ‘数据指纹id’,
dataStatus int(4) NOT NULL COMMENT ‘数据状态’,
createTime timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT ‘创建时间’,
modifyTime timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT ‘修改时间’,
PRIMARY KEY (id),
UNIQUE KEY fingerId_unique (fingerId),
KEY eventType_index (eventType),
KEY eventSubject_index (eventSubject),
KEY bondId_index (bondId),
KEY pubTime_index (pubTime),
KEY modifyTime_idx (modifyTime),
KEY index_pei (startDate,eventId,issuer),
KEY startDate_index (startDate),
KEY underwriter_index (underwriter),
KEY subTime_index (subTime),
KEY issuer_index (issuer),
KEY pub_eventid_issuer_idx (pubTime,eventId,issuer)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_bin AUTO_INCREMENT=1209327404 COMMENT=‘债券信批表’

建议更换字符集在试试

utf8mb4_bin | utf8mb4

用这些

这是tidb的报错日志

仅更换字段的字符集还是表的字符集也要换?

不知道表更换字符集后,是否可以覆盖字段的,我还没试过

我只知道Mysql 字段如果设定了字符集,必须每个字段进行更换,更换表的无效,不能覆盖

还有个办法,建个新表试试

建两个新表,一个保持原有的字符集
一个保持新的字符集
你看看结果

我这边试过了,我在test库里创建了一个相同的表,执行同样的插入语句是可以插入的。是不是和数据量太大有关系?

和数据量没多大关系的

执行插入和更新都可以么?

是的,test库里执行插入和更新都可以;而且奇怪的是其他的都没有问题,只要是 issuer这个字段包含 广西 这个词就有问题,我尝试将两个字中间加上空格这样也是可以插入的,会不会是触发了bug?

所以,文档就推荐使用 utf8mb4
Mysql 也是推荐使用这个

我已经换成了utf8mb4了,还是不行
CREATE TABLE sy_cs_mm_cn_bond_risk_detail (
id bigint(20) NOT NULL AUTO_INCREMENT COMMENT ‘自增id’,
bondId int(11) DEFAULT NULL COMMENT ‘债券id’,
secuCode varchar(10) DEFAULT NULL COMMENT ‘债券代码’,
sname varchar(100) DEFAULT NULL COMMENT ‘债券简称’,
cname varchar(200) DEFAULT NULL COMMENT ‘债券全称’,
issuer varchar(200) CHARACTER SET utf8mb4 COLLATE utf8mb4_bin DEFAULT NULL COMMENT ‘债券发行人’,
secuMarket int(11) DEFAULT NULL COMMENT ‘证券市场’,
underwriter varchar(200) DEFAULT NULL COMMENT ‘债券主承销商’,
startDate datetime DEFAULT NULL COMMENT ‘债券起息日’,
endDate datetime DEFAULT NULL COMMENT ‘债券到期日’,
subjectType varchar(50) DEFAULT NULL COMMENT ‘事项主体类型’,
websiteSnapshot varchar(1000) DEFAULT NULL COMMENT ‘网站截图url’,
eventId varchar(100) NOT NULL COMMENT ‘事件标识’,
eventType varchar(50) DEFAULT NULL COMMENT ‘事件类型’,
eventSubject varchar(100) DEFAULT NULL COMMENT ‘事件主体’,
eventNum1 varchar(100) DEFAULT NULL COMMENT ‘文书号1’,
eventNum2 varchar(100) DEFAULT NULL COMMENT ‘文书号2’,
eventNum3 varchar(100) DEFAULT NULL COMMENT ‘文书号3’,
party1 varchar(1000) DEFAULT NULL COMMENT ‘涉事方1’,
party2 varchar(1000) DEFAULT NULL COMMENT ‘涉事方2’,
party3 varchar(1000) DEFAULT NULL COMMENT ‘涉事方3’,
cash1 decimal(19,4) DEFAULT NULL COMMENT ‘涉事金额1(人民币元)’,
cash2 decimal(19,4) DEFAULT NULL COMMENT ‘涉事金额2(人民币元)’,
cash3 decimal(19,4) DEFAULT NULL COMMENT ‘涉事金额3(人民币元)’,
label1 varchar(100) DEFAULT NULL COMMENT ‘事件标签1’,
label2 varchar(100) DEFAULT NULL COMMENT ‘事件标签2’,
label3 varchar(100) DEFAULT NULL COMMENT ‘事件标签3’,
priority varchar(50) DEFAULT NULL COMMENT ‘重要程度’,
eventDesc text DEFAULT NULL COMMENT ‘事件描述’,
detail text DEFAULT NULL COMMENT ‘事件详情’,
eventSrc varchar(100) DEFAULT NULL COMMENT ‘事件来源’,
eventUrl varchar(1000) DEFAULT NULL COMMENT ‘事件来源链接’,
eventTime datetime DEFAULT NULL COMMENT ‘事件发生时间’,
endTime datetime DEFAULT NULL COMMENT ‘事件结束时间’,
pubTime datetime DEFAULT NULL COMMENT ‘事件发布时间’,
subTime datetime DEFAULT NULL COMMENT ‘事件获取时间’,
relationLink text DEFAULT NULL COMMENT ‘关系链路’,
createDate date DEFAULT NULL COMMENT ‘生成日期’,
secuMarket2 varchar(50) NOT NULL COMMENT ‘债券市场-zxjt’,
fingerId varchar(100) NOT NULL COMMENT ‘数据指纹id’,
dataStatus int(4) NOT NULL COMMENT ‘数据状态’,
createTime timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT ‘创建时间’,
modifyTime timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT ‘修改时间’,
PRIMARY KEY (id),
UNIQUE KEY fingerId_unique (fingerId),
KEY eventType_index (eventType),
KEY eventSubject_index (eventSubject),
KEY bondId_index (bondId),
KEY pubTime_index (pubTime),
KEY modifyTime_idx (modifyTime),
KEY index_pei (startDate,eventId,issuer),
KEY startDate_index (startDate),
KEY underwriter_index (underwriter),
KEY subTime_index (subTime),
KEY issuer_index (issuer),
KEY pub_eventid_issuer_idx (pubTime,eventId,issuer)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_bin AUTO_INCREMENT=1209327404 COMMENT=‘债券信批表’


这没换呢

CREATE TABLE sy_cs_mm_cn_bond_risk_detail (
id bigint(20) NOT NULL AUTO_INCREMENT COMMENT ‘自增id’,
bondId int(11) DEFAULT NULL COMMENT ‘债券id’,
secuCode varchar(10) CHARACTER SET utf8 COLLATE utf8_bin DEFAULT NULL COMMENT ‘债券代码’,
sname varchar(100) CHARACTER SET utf8 COLLATE utf8_bin DEFAULT NULL COMMENT ‘债券简称’,
cname varchar(200) CHARACTER SET utf8 COLLATE utf8_bin DEFAULT NULL COMMENT ‘债券全称’,
issuer varchar(200) DEFAULT NULL COMMENT ‘债券发行人’,
secuMarket int(11) DEFAULT NULL COMMENT ‘证券市场’,
underwriter varchar(200) CHARACTER SET utf8 COLLATE utf8_bin DEFAULT NULL COMMENT ‘债券主承销商’,
startDate datetime DEFAULT NULL COMMENT ‘债券起息日’,
endDate datetime DEFAULT NULL COMMENT ‘债券到期日’,
subjectType varchar(50) CHARACTER SET utf8 COLLATE utf8_bin DEFAULT NULL COMMENT ‘事项主体类型’,
websiteSnapshot varchar(1000) CHARACTER SET utf8 COLLATE utf8_bin DEFAULT NULL COMMENT ‘网站截图url’,
eventId varchar(100) CHARACTER SET utf8 COLLATE utf8_bin NOT NULL COMMENT ‘事件标识’,
eventType varchar(50) CHARACTER SET utf8 COLLATE utf8_bin DEFAULT NULL COMMENT ‘事件类型’,
eventSubject varchar(100) CHARACTER SET utf8 COLLATE utf8_bin DEFAULT NULL COMMENT ‘事件主体’,
eventNum1 varchar(100) CHARACTER SET utf8 COLLATE utf8_bin DEFAULT NULL COMMENT ‘文书号1’,
eventNum2 varchar(100) CHARACTER SET utf8 COLLATE utf8_bin DEFAULT NULL COMMENT ‘文书号2’,
eventNum3 varchar(100) CHARACTER SET utf8 COLLATE utf8_bin DEFAULT NULL COMMENT ‘文书号3’,
party1 varchar(1000) CHARACTER SET utf8 COLLATE utf8_bin DEFAULT NULL COMMENT ‘涉事方1’,
party2 varchar(1000) CHARACTER SET utf8 COLLATE utf8_bin DEFAULT NULL COMMENT ‘涉事方2’,
party3 varchar(1000) CHARACTER SET utf8 COLLATE utf8_bin DEFAULT NULL COMMENT ‘涉事方3’,
cash1 decimal(19,4) DEFAULT NULL COMMENT ‘涉事金额1(人民币元)’,
cash2 decimal(19,4) DEFAULT NULL COMMENT ‘涉事金额2(人民币元)’,
cash3 decimal(19,4) DEFAULT NULL COMMENT ‘涉事金额3(人民币元)’,
label1 varchar(100) CHARACTER SET utf8 COLLATE utf8_bin DEFAULT NULL COMMENT ‘事件标签1’,
label2 varchar(100) CHARACTER SET utf8 COLLATE utf8_bin DEFAULT NULL COMMENT ‘事件标签2’,
label3 varchar(100) CHARACTER SET utf8 COLLATE utf8_bin DEFAULT NULL COMMENT ‘事件标签3’,
priority varchar(50) CHARACTER SET utf8 COLLATE utf8_bin DEFAULT NULL COMMENT ‘重要程度’,
eventDesc text CHARACTER SET utf8 COLLATE utf8_bin DEFAULT NULL COMMENT ‘事件描述’,
detail text CHARACTER SET utf8 COLLATE utf8_bin DEFAULT NULL COMMENT ‘事件详情’,
eventSrc varchar(100) CHARACTER SET utf8 COLLATE utf8_bin DEFAULT NULL COMMENT ‘事件来源’,
eventUrl varchar(1000) CHARACTER SET utf8 COLLATE utf8_bin DEFAULT NULL COMMENT ‘事件来源链接’,
eventTime datetime DEFAULT NULL COMMENT ‘事件发生时间’,
endTime datetime DEFAULT NULL COMMENT ‘事件结束时间’,
pubTime datetime DEFAULT NULL COMMENT ‘事件发布时间’,
subTime datetime DEFAULT NULL COMMENT ‘事件获取时间’,
relationLink text CHARACTER SET utf8 COLLATE utf8_bin DEFAULT NULL COMMENT ‘关系链路’,
createDate date DEFAULT NULL COMMENT ‘生成日期’,
secuMarket2 varchar(50) CHARACTER SET utf8 COLLATE utf8_bin NOT NULL COMMENT ‘债券市场-zxjt’,
fingerId varchar(100) CHARACTER SET utf8 COLLATE utf8_bin NOT NULL COMMENT ‘数据指纹id’,
dataStatus int(4) NOT NULL COMMENT ‘数据状态’,
createTime timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT ‘创建时间’,
modifyTime timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT ‘修改时间’,
PRIMARY KEY (id),
UNIQUE KEY fingerId_unique (fingerId),
KEY eventType_index (eventType),
KEY eventSubject_index (eventSubject),
KEY bondId_index (bondId),
KEY pubTime_index (pubTime),
KEY modifyTime_idx (modifyTime),
KEY index_pei (startDate,eventId,issuer),
KEY startDate_index (startDate),
KEY underwriter_index (underwriter),
KEY subTime_index (subTime),
KEY issuer_index (issuer),
KEY pub_eventid_issuer_idx (pubTime,eventId,issuer)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_bin AUTO_INCREMENT=1209327404 COMMENT=‘债券信批表’

字段和表都换了,还是不行

而且是同样的表结构,新建一张表是可以插入的

字段的字符集和排序规则与表的不一致啊,可以试着改成一致后看下

我仅update issuer这个字段不行,其他的字段是可以的

UPDATE
sy_cs_mm_cn_bond_risk_detail
SET
issuer = ‘广西交通投资集团有限公司’
WHERE id = 1208908092

这个语句执行卡一会后就报错,更新其他字段是没有问题的,比如一下语句是可以执行成功的
UPDATE
sy_cs_mm_cn_bond_risk_detail
SET
sname = ‘广西交通投资集团有限公司’
WHERE id = 1208908092

刚才有小伙伴发现了类似的案例:

你可以排查一下,是不是这个问题

优先排查掉字符集的问题…

我应该怎么排查?我用一摸一样的表结构,新创建一张表就可以插入了。。。。旧表就是不行