背景
某项目alert日志中偶然报错如下:
ORA-00600: internal error code, arguments: [KGL-heap-size-exceeded]
报错的过程中业务变慢,业务处理tps几乎为0,且大量产生cdmp core文件导致/oracle目录爆满
一会业务恢复正常,但是高峰期又反复出现类似问题
问题排查:
检查故障时间点的awr,发现shared pool相关的等待很严重,怀疑故障时刻shared pool的占用很大
且KGL占用9G+
发现报错的sqlsql version count数达到了900+(_cursor_obsolete_threshold设为1024),查看version count高的原因
select c.sql_id,
c.SQL_TYPE_MISMATCH,
c.BIND_EQUIV_FAILURE,
b.POSITION,
b.DATATYPE_STRING,
b.LAST_CAPTURED
from V$SQL_BIND_CAPTURE b, v$sql_shared_cursor c
where c.CHILD_ADDRESS = b.CHILD_ADDRESS
and c.SQL_ID = '9pvt6prqzddvy';
发现BIND_EQUIV_FAILURE为Y,导致cursor无法共享
首先这个环境的sga为128G,shared_pool设置了20G,的确有点小了,Shared Pool Statistics占用已达到90%左右,将shared_pool调整到40g,故障不再出现,但是上面的sql的version count仍旧很高,尝试将_cursor_obsolete_threshold减少到50(之前害怕硬解析增高没有调小),version count问题得到缓解。
后来查询mos,发现BIND_EQUIV_FAILURE 可能是12.2的bug(2610645.1),解决方案:
打上 Patch 28794230
使用如下的workaround:
alter system set "_optimizer_use_feedback"=false scope=spfile;
alter system set "_optimizer_adaptive_cursor_sharing"=false scope=spfile;
alter system set "_optimizer_extended_cursor_sharing_rel"=none scope=spfile;
alter system set "_optimizer_use_feedback"=false;
alter system set "_optimizer_adaptive_cursor_sharing"=false;
alter system set "_optimizer_extended_cursor_sharing_rel"=none;
由于故障不再出现,没有参考上面的解决方法