【TiDB 版本】v4.0.9
【问题描述】
tidb的日志里面出现很多字段长度不够的错误。
出现这些错误上下文并没有执行的sql。很奇怪。
应该是业务写入超过字段预设的大小的报错,可以从业务log 或者 业务同学确认一下。看看需不需要做一下 DDL变更。
这个错报的,不知道哪个库,也不知道i哪个字段,也不知道啥sql。就一个表。我们库都有这个表,要改,还要每个库都要改。业务测没有,如果有这样的,也就会插入数据报错了。而且这个错误会一直在刷
1、这个报错信息确实不友好,如果可以显示报错的 table name 和 column name 会更有利于定位问题~~
2、针对这个报错,可以尝试将 general log 打开,看能否打印出相关的 sql,general log 开启方式参考:
https://docs.pingcap.com/zh/tidb/stable/system-variables#tidb_general_log
好的,感谢
这个字段长度报错又来了。现在开启了general log,但是也没有相关的sql。
,可以看出再这个报错的时候,io明显高了。,看到报错日志的上下有在analyze tableims_a08_51
.`ims_task_user。我找到对应的库当中,查看,将字段15的长度改长了。就不报错了。可以看到io瞬间降下来了。 日志也不报错了。但是问了业务那边,没有改动任务东西。但是这个错误真的很疑惑?io高的原因是,一直在analyze这张表。
辛苦手动 analyze table 这个表看看能否重现这个问题。
不会的。试过了
麻烦提供一下以下信息:
[root@ims-tidb-monitor ~]# curl http://172.16.0.57:10080/stats/dump/ims_a08_51/ims_task_user
[types:1406]Data Too Long, field len 15, data len 18[root@ims-tidb-monitor ~]# 直接报长度不够
请问是线上环境吗?可以先选择非业务高峰期,先删除了这个表的统计信息,再重新收集统计信息 。
再尝试执行 curl http://{tidb_ip}:{tidb_status_port}/stats/dump/{db}/{table}
看看有没有报错。
是线上环境。暂时不敢动。等后面再说吧
好的,有新进展了可以再反馈下
根据之前的沟通,tidb日志里面总是报长度错误,删除统计信息,再分析表,同样还是报错。一直未能解决。
这个是为开启general log ,tidb 日志
回答您的1:不是统计信息有问题,是tidb日志里面报字段长度错误。
2:开启了general log,但是也没有具体的sql,这是截出来的日志 test.log (1.4 MB)
3: CREATE TABLE ims_sys_oper_log
(
oper_id
int(11) NOT NULL AUTO_INCREMENT COMMENT ‘日志主键’,
title
varchar(50) COLLATE utf8mb4_general_ci DEFAULT ‘’ COMMENT ‘模块标题’,
business_type
int(2) DEFAULT ‘0’ COMMENT ‘业务类型(0其它 1新增 2修改 3删除)’,
method
varchar(100) COLLATE utf8mb4_general_ci DEFAULT ‘’ COMMENT ‘方法名称’,
operator_type
int(1) DEFAULT ‘0’ COMMENT ‘操作类别(0其它 1后台用户 2手机端用户)’,
oper_name
varchar(50) COLLATE utf8mb4_general_ci DEFAULT ‘’ COMMENT ‘操作人员’,
user_id
varchar(1000) COLLATE utf8mb4_general_ci DEFAULT ‘’ COMMENT ‘会员账号’,
oper_url
varchar(2000) COLLATE utf8mb4_general_ci DEFAULT ‘’ COMMENT ‘请求URL’,
oper_ip
varchar(50) COLLATE utf8mb4_general_ci DEFAULT ‘’ COMMENT ‘主机地址’,
oper_location
varchar(255) COLLATE utf8mb4_general_ci DEFAULT ‘’ COMMENT ‘操作地点’,
oper_param
text COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT ‘请求参数’,
status
int(1) DEFAULT ‘0’ COMMENT ‘操作状态(0正常 1异常)’,
error_msg
varchar(2000) COLLATE utf8mb4_general_ci DEFAULT ‘’ COMMENT ‘错误消息’,
oper_time
datetime DEFAULT NULL COMMENT ‘操作时间’,
PRIMARY KEY (oper_id
),
KEY optime_idx
(oper_time
),
KEY idx_oper_name
(oper_name
)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci AUTO_INCREMENT=120001 COMMENT=‘操作日志记录’ ;
4:添加长度是,是之前有很类似的报错,我都是通过改变字段的长度来解决的。例如:原先长度是varchar(10) 然后报错说最大需要50,会通过更改长度varchar(100)来解决报错的。但是这个问题一直都存在,且无法判断是哪里的原因。业务也没有报错的现象,如果不更改长度的话,日志会一直报错。