TiDB Server 执行特定 SQL 崩溃

【TiDB版本】5.7.25-TiDB-v4.0.0
【问题描述】执行以下 SQL 导致了 TiDB Server 崩溃

replace into hidden.hidden_mongo_tel_analysis_apply
(orderid, inserttimespan, lc_countrate, lc_3countrate, lc_6countrate, call_3time_15srate,
top10_call_count, top10_call_3count, top10_call_6time, call_6time, call_count, call_3count,
call_type_countrate, call_type_6countrate, total_3fee, create_time)
select a.orderid,
date_sub(str_to_date(json_unquote(json_extract(d.thedata, ‘$.create_date’)), ‘%Y-%m-%d %h:%i:%s’), interval ‘8’ hour) inserttimespan,
json_unquote(json_extract(a.thedata, ‘$.lc_countrate’)) lc_countrate,
json_unquote(json_extract(a.thedata, ‘$.lc_3countrate’)) lc_3countrate,
json_unquote(json_extract(a.thedata, ‘$.lc_6countrate’)) lc_6countrate,
json_unquote(json_extract(a.thedata, ‘$.call_3time_15srate’)) call_3time_15srate,
json_unquote(json_extract(a.thedata, ‘$.top10_call_count’)) top10_call_count,
json_unquote(json_extract(a.thedata, ‘$.top10_call_3count’)) top10_call_3count,
json_unquote(json_extract(a.thedata, ‘$.top10_call_6time’)) top10_call_6time,
json_unquote(json_extract(a.thedata, ‘$.call_6time’)) call_6time,
json_unquote(json_extract(a.thedata, ‘$.call_count’)) call_count,
json_unquote(json_extract(a.thedata, ‘$.call_3count’)) call_3count,
json_unquote(json_extract(a.thedata, ‘$.call_type_countrate’)) call_type_countrate,
json_unquote(json_extract(a.thedata, ‘$.call_type_6countrate’)) call_type_6countrate,
json_unquote(json_extract(a.thedata, ‘$.total_3fee’)) total_3fee,
d.create_time
from mongo.mongo_mobile_report_data_recent_analysis a
join mongo.mongo_mobile_datas d on a.orderid=d.orderid
where d.create_time > ‘2015-01-01 00:00:00’

这个 SQL 其实没什么特殊,类似的 SQL 我之前在 3.0.* 上也运行过多次。

这是相关的 tidb.log.zip (999.2 KB) 和 tidb_stderr.log.zip (414.7 KB)

问题挺严重的,请帮忙尽快看一下。

你好,

  1. explain 该 sql 看下执行计划,目前是否有同数据量的 3.x 的环境也执行下 explain 看下区别。

  2. 当前 sql 是 2015 年之后的数据,数据量比较大,可以限制下时间区间或者增加 limit 分页,减少返回数据量,再看下。

  3. 可否 tail -f tidb.log 并在 shell 中执行该语句,看 tidb log 的返回报错和前端返回的信息是什么,上传下。

  4. tidb log 中存在关于该语句的 expensivequery,应该是超过是 mem-quota-query 参数限制,可以修改加大该参数,但是需要注意 tidb-server oom 的问题

这是 explain 的结果:

“Insert_1” “N/A” “root” “N/A”
“└─Projection_9” “4166.67” “root” “mongo.mongo_mobile_report_data_recent_analysis.orderid, date_sub(str_to_date(json_unquote(cast(json_extract(mongo.mongo_mobile_datas.thedata, $.create_date), var_string(16777216))), %Y-%m-%d %h:%i:%s), 8, HOUR)->Column#38, json_unquote(cast(json_extract(mongo.mongo_mobile_report_data_recent_analysis.thedata, $.lc_countrate), var_string(16777216)))->Column#39, json_unquote(cast(json_extract(mongo.mongo_mobile_report_data_recent_analysis.thedata, $.lc_3countrate), var_string(16777216)))->Column#40, json_unquote(cast(json_extract(mongo.mongo_mobile_report_data_recent_analysis.thedata, $.lc_6countrate), var_string(16777216)))->Column#41, json_unquote(cast(json_extract(mongo.mongo_mobile_report_data_recent_analysis.thedata, $.call_3time_15srate), var_string(16777216)))->Column#42, json_unquote(cast(json_extract(mongo.mongo_mobile_report_data_recent_analysis.thedata, $.top10_call_count), var_string(16777216)))->Column#43, json_unquote(cast(json_extract(mongo.mongo_mobile_report_data_recent_analysis.thedata, $.top10_call_3count), var_string(16777216)))->Column#44, json_unquote(cast(json_extract(mongo.mongo_mobile_report_data_recent_analysis.thedata, $.top10_call_6time), var_string(16777216)))->Column#45, json_unquote(cast(json_extract(mongo.mongo_mobile_report_data_recent_analysis.thedata, $.call_6time), var_string(16777216)))->Column#46, json_unquote(cast(json_extract(mongo.mongo_mobile_report_data_recent_analysis.thedata, $.call_count), var_string(16777216)))->Column#47, json_unquote(cast(json_extract(mongo.mongo_mobile_report_data_recent_analysis.thedata, $.call_3count), var_string(16777216)))->Column#48, json_unquote(cast(json_extract(mongo.mongo_mobile_report_data_recent_analysis.thedata, $.call_type_countrate), var_string(16777216)))->Column#49, json_unquote(cast(json_extract(mongo.mongo_mobile_report_data_recent_analysis.thedata, $.call_type_6countrate), var_string(16777216)))->Column#50, json_unquote(cast(json_extract(mongo.mongo_mobile_report_data_recent_analysis.thedata, $.total_3fee), var_string(16777216)))->Column#51, mongo.mongo_mobile_datas.create_time”
" └─HashJoin_38" “4166.67” “root” “inner join, equal:[eq(mongo.mongo_mobile_datas.orderid, mongo.mongo_mobile_report_data_recent_analysis.orderid)]”
" ├─TableReader_50(Build)" “3333.33” “root” “data:Selection_49”
" │ └─Selection_49" “3333.33” “cop[tikv]” “gt(mongo.mongo_mobile_datas.create_time, 2015-01-01 00:00:00.000000)”
" │ └─TableFullScan_48" “10000.00” “cop[tikv]” “table:d” “keep order:false, stats:pseudo”
" └─TableReader_55(Probe)" “10000.00” “root” “data:TableFullScan_54”
" └─TableFullScan_54" “10000.00” “cop[tikv]” “table:a” “keep order:false, stats:pseudo”

数据量不大,最多 100多万而已。

3.x 的环境已经没有了,为了大事务特性升级到 4.0 了。

另外,tidb.log 和 tidb_stderr.log 里好像也没有发现相关的异常日志啊

hi,

问题在上面已经被确定,辛苦看下。调整加该参数,但是要注意 oom 问题。4.0 的 sql 内存方面你的监控粒度会更加精细。

了解是怎么回事了,我尝试调整一下。但是它居然把 TiDB Server 搞崩了啊。

可以描述下是如何调整的呢?

嗯,我准备控制一下批量大小。

:+1: