tiflash 告警:【TiDB ERR】[emergency]TiFlash_schema_error

https://docs.pingcap.com/zh/tidb/stable/data-type-date-and-time#datetime-类型
datetime 支持的范围是 0000-01-01 00:00:00.0000009999-12-31 23:59:59.999999,我试了一下在mysql 客户端会建表失败,改成 0000-01-01 00:00:00 就能建表成功了。
怀疑是这个默认值超出范围,某些地方没校验住,会有异常(虽然我本地还没复现出来)。如果急的话,先把check_time 的默认值改成范围内的值?
还有,您发的建表语句,单引号是中文的:joy:,你那边能建表成功吗?我替换成英文的单引号才建表成功。

1 个赞

我试了下sql_mode去掉 NO_ZERO_DATE可以建表成功,不过没能复现楼主的问题

check_time这个应该是sql_mode 的关系,但是还是不清楚为啥会报basic_string::_M_replace_aux问题

嗯这个是sql_mode 问题

我已经把check_time/add_time 字段都改成CURRENT_TIMESTAMP,现在重新扩容tiflash也会失败,错误日志一直报2022.04.06 13:59:05.853604 [ 1 ] Application: basic_string::_M_replace_aux
2022.04.06 13:59:21.359828 [ 1 ] Application: The configuration “path” is deprecated. Check [storage] section for new style.
2022.04.06 13:59:27.480685 [ 1 ] Application: basic_string::_M_replace_aux
2022.04.06 13:59:43.106669 [ 1 ] Application: The configuration “path” is deprecated. Check [storage] section for new style.
2022.04.06 13:59:49.228327 [ 1 ] Application: basic_string::_M_replace_aux
2022.04.06 14:00:04.754782 [ 1 ] Application: The configuration “path” is deprecated. Check [storage] section for new style.
2022.04.06 14:00:10.876427 [ 1 ] Application: basic_string::_M_replace_aux
2022.04.06 14:00:26.362460 [ 1 ] Application: The configuration “path” is deprecated. Check [storage] section for new style.
2022.04.06 14:00:32.483641 [ 1 ] Application: basic_string::_M_replace_aux

一开始 TiFlash 副本同步是成功的?只是查询会报错?现在是扩容 TiFlash 也会报错?您现在的环境上是有多少个表呢?不多的话,能否把设置了 TiFlash 副本同步的建表语句都发下?

业务反馈他操作表的顺序如下:
apk_icon_sample icon字段先是text类型, 然后插入图片, 发现字段长度不够用, 然后truncate table, 然后alter改类型, 然后插数据,一会就出现tiflash问题了

我这边刚才把对应的表drop掉了,最开始怀疑是不是longblob 特殊字段问题,重新创建不包含这个字段的表,然后scale-out tiflash 组建成功,又单独创建了一个只包含longblob的字段的表,scale-out tiflash 也成功了,纳闷了…看来不是这个字段的问题,于是又重新按照原先apk_icon_sample表结构创建一遍,然后scale-out tiflash竟然成功了…

缩容tiflash之前。需要先将对应的副本去掉。

按照官网执行的操作
alter table . set tiflash replica 0;
tiup cluster scale-in --node 10.0.1.4:9000

:mask: 用 5.2.1 版本重复了这个步骤,也还是没复现出来。你们现在插入数据后,查询正常了吗?

现在正常了

麻烦给下这个表执行过的所有 DDL。
curl http://{TiDBIP}:10080/ddl/history
或者 curl http://{TiDBIP}:10080/ddl/history?limit={number}

> set sql_mode='';
> CREATE TABLE test ( id int(16) NOT NULL AUTO_INCREMENT, PRIMARY KEY (id));
> alter table test add column b longblob not null default '';
 
-- Note that `set sql_mode=""` is required or the SQL will get blocked like
> CREATE TABLE test ( id int(16) NOT NULL AUTO_INCREMENT, PRIMARY KEY (id));
> alter table test add column b longblob not null default '';
ERROR 1101 (42000): BLOB/TEXT/JSON column 'b' can't have a default value

经过简化之后用上述语句可以复现出来相同的问题。是在 sql_mode=’’ 的情况下,给 longblob 字段设置了空字符串作为默认值。TiFlash 在处理这样生成的 schema 信息的默认值时,存在边界情况没处理好。后续版本的修复可以跟这个 issue https://github.com/pingcap/tiflash/issues/4596

如果在旧版本上遇到有类似的问题,需要通过日志确定是哪个表、哪个列导致的问题。可以通过 drop 掉该列,重新建一个不带 “not null” 以及 default 属性的 longblob 列来暂时绕过这个错误。

1 个赞

感谢,但是我的那张表not null 没设置默认值,同时我经过各种重建表竟然好了

此话题已在最后回复的 1 分钟后被自动关闭。不再允许新回复。