tidb报错:[error="[types:1406]Data Too Long, field len 40, data len 64"]

【 TiDB 使用环境】线上
【 TiDB 版本】v4.0.9
【遇到的问题】

  1. tidb频繁报错:Data Too Long
    [2022/08/30 10:52:27.997 +08:00] [ERROR] [handle.go:187] [“[stats] error occurred when read table stats”] [table=log_need_retry_method] [error=“[types:1406]Data Too Long, field len 40, data len 64”]
  2. 有个表频繁的进行analyze,但是该表的数据没有怎么变动

【复现路径】做过哪些操作出现的问题

【已经尝试过的修复操作】
ALTER TABLE mysql.stats_buckets MODIFY upper_bound LONGBLOB NOT NULL;
ALTER TABLE mysql.stats_buckets MODIFY lower_bound LONGBLOB;
ALTER TABLE mysql.stats_histograms MODIFY last_analyze_pos LONGBLOB DEFAULT NULL;

【问题现象及影响】昨天导致了tidb的内存突然升高到峰值。

我看到这个修复操作了,但是针对的版本,好像不是4.X的

目前尝试修复操作后,有没有改善?

用这个语句查一下看看

SELECT
b.TABLE_SCHEMA,b.table_name,ROUND((1-a.modify_count/a.count)*100,0) healthy
FROM mysql.stats_meta a
LEFT JOIN INFORMATION_SCHEMA.TABLES b ON a.table_id = b.TIDB_TABLE_ID
WHERE b.TABLE_SCHEMA = ‘’
AND b.table_name = ‘’
ORDER BY table_id;

执行了命令后问题还是依旧,没有任何用处

执行了你的命令显示healthy是100

“Data Too Long, field len 40, data len 64” 表结构有变化过吗?

这个库是原生的吗? 还是从别的库中恢复或者同步迁移来的?

数据库、或表的 编码有变过吗? 或者库和表的编码是一致的吗? 都是UTF8 吗?

那应该是正常的,不会触发自动analyze才对

库是原生的,没有做个任何的的东西变更。

这问题好奇怪呀

怀疑这个表有问题了

线上着急处理问题的话, 可以尝试重建表 导入数据后 rename 试试

就是比较奇怪为什么会这样,表使用都没有问题的。

  1. 我觉得还是要明确内存飙升和这个报错的关联性;
  2. 在内存飙升的时候,可以抓下 tidb profile;
  3. 对于报错的问题,能在测试环境提供复现步骤吗?

你这个sql 是程序调用的还是 手动从命令行执行的?

如果是命令行执行 尝试调下shell 的语言(LANG或者 NLS_LANG) 试试

这个是tidb的日志中出现的。

目前看下来内存的飙升和这个报错是没有关系的。
报错的问题我将表拿到测试环境中,但是测试环境并不报错。有点奇怪

哦哦,所以要解决的问题是哪个? 解决内存问题还是抓 profile 吧:thinking:

怎么抓 profile ?