问题现像与分析
Oracle这个BUG你可能会遇到
近期技术群里经常出现这个问题,频次很高,我这发给大家看看:
症状基本一致:
Alert.log 里面出现如下信息:
Memory Notification: Library Cache Object loaded into SGAHeap size <heap size K>exceeds notification threshold(51200K)
...:KGL object name :<OBJECT NAME>
目前普遍出现在10g/11g/12c/19.3/19.24版本,生成大量的Trc文件会把目录塞满,导致业务无法运行,以下是一些群友的报错截图,
群友甲:
群友乙:
群友丙:
经过群里在Oracle干过研发的资深大佬分析trc日志,得出结论是Oracle的陈年BUG,共享池chunk分裂的问题
MOS里也确实是相关记载。具体可参见:
Memory Notification: Library Cache Object loaded into SGA / ORA-600 [KGL-heap-size-exceeded] (Doc ID 330239.1/2999897.1)
这些warning消息并不会造成进程失败。它们的出现是因为从 10gR2 数据库版本开始引入的事件消息传递机制和内存管理器相关机制。 由于共享池中的大对象可能会导致问题,因此开发了此警告阈值。 若某个sql分配的空间超过此警告阈值则向alert日志输出警告。 此警告只是通知给定的堆对象超出了定义的阈值大小,并生成跟踪文件,以便 DBA 可以检查可能昂贵的对象(从共享内存的角度来看)。 这些纯粹是警告消息,对数据库功能没有影响,尽管它们旨在告知客户应用程序中可能需要调整, 但是并不意味着 ORA-4031 将立即发生,除非共享池的大小非常小。
虽说是有明确的官方文档说明了是个BUG,但是还是有小伙伴的情况发现是应用的某个触发器触发的BUG。
解决办法
可以使用如下脚本检查默认值
select
nam.ksppinm NAME,
nam.ksppdesc DESCRIPTION,
val.KSPPSTVL
from
x$ksppi nam,
x$ksppsv val
where nam.indx = val.indx and nam.ksppinm like '%kgl_large_heap_%_threshold%';
在当前12.2和19C的版本中,这两个值默认值如下所示
NAME DESCRIPTION KSPPSTVL
-------------------------------------------------- -------------------------------------------------------------------------------- ------------------------------------------------------------
_kgl_large_heap_warning_threshold maximum heap size before KGL writes warnings to the alert log 52428800
_kgl_large_heap_assert_threshold maximum heap size before KGL raises an internal error 524288000
这里有两个解决方案:
1、Set _kgl_large_heap_warning_threshold to a very large value.就是把这个对应值调大,在增大这个参数阈值之前,需要同时考虑加大 SGA_TARGET 和 SHARED_POOL_SIZE 15% 是SGA有更充足的内存。
2、Set both _kgl_large_heap_warning_threshold and _kgl_large_heap_assert_threshold to zero.就是把这两个值都设置为0关闭告警。