近日某客户现场中台业务发生主备切换,主机coredump,收集相关日志coredump分析后,初步确认为临时表引擎设置为temptable,在多表连表查询时触发的内存指针BUG,宕机时堆栈信息如下:
gdb分析得到宕机时对应的SQL信息
gdb
(gdb)f 10
(gdb)printf "%s\n", thd->m_query_string.str
得到具体SQL,确认为该SQL导致的问题
具体结论:在进行聚合查询时产生临时表时,使用的internal_tmp_mem_storage_engine 是temptable时,当达到临时表内存分配上限,会将临时表移至磁盘,此时内存中的数据指针已经失效。但类似blob、varchar的大记录,仍然有可能使用到老的失效指针去进行访问,导致异常CRASH。
解决方案:
调整internal_tmp_mem_storage_engine参数值为memory,后未再出现!