Oceanbase数据库500租户告警--模块LobReader使用异常分析
文档编写这块确是不太好,但出现故障后又想记录点什么,仅仅记录下信息,并分享下问题的处理思路
上午十一点半左右收到告警信息,500租户使用率异常,告警信息如下
"【云境平台告警通知】: 资源类型:OceanBase集群; 资源名称:xxxx; 发生时间:2024-06-21 11:36:14; 告警内容:OCP告警通知-单条告警 - 名称:OceanBase 500租户的占用内存大小超限 - 级别:严重 - 生成时间:2024-06-21T11:36:12+08:00 -告警详情: 集群:,主机:xxx.xxx.xxx.xx,告警:OceanBase 500租户的占用内存大小超限。占用内存 109.626 GB 超过 100 GB。; 最后告警时间:2024-06-21 11:36:14; 承载业务:xxxx"
接到告警信息后,随即登录对应的集群查看了下500租户的内存使用情况,截图如下
从下面的截图信息能看到对应的异常mod_name=LobReader,在官方网站上搜索了下也没有找到出处,但从字面上看到肯定是和Lob字段相关的查询,导致500租户LobReader模块内存异常
对该模块观察内存并未下降一直在增长,最大已经增长到了接近400G,截图信息如下:
主机是c3的服务器,总内存750G,一直增长有将内存打爆的风险,从告警到异常模块使用到400g不到半个小时,需要紧急处理,提工单也来不及
模块异常增长分析根据经验,其实并不复杂,肯定是某个SQL导致的,且这个SQL和LOB字段相关,分析思路有了,那么就是分析当前数据库有无正在执行的大查询(全表扫描)
从后台部署的脚本来查看正在执行的全表扫描SQL,发现了一条陌生的SQL,SQL信息如下:
根据上面的分析思路,我们判断是lob字段导致的,那我们观察下这个SQL对应的列是否有lob字段既可,经过查看表结构,发现了这个表确是含有一个lob字段,那么和我们的猜想是一样的,可能就是这个SQL导致的问题
问题SQL的执行相关信息
如果这个表很小,也不可能是这个SQL导致的,那我继续查看了下这个表的行数,通过下面的查询,我发现这个表接近6000w的数据,验证了上面的分析,全表扫描并含有Lob字段,最终将LobReader模块内存打爆
后续也将问题SQL发给业务,最终定位到在问题时间段,业务通过odc执行了查询,在发现不对后立即将回话关闭了,但是SQL已经发送到了数据库,最终导致了500租户内存模块异常