今天数据库诊断付费文章订阅伙伴群中,有个小伙伴提到,一个抽取软件报错out of memory。
小伙伴不太理解的地方是,这里看上去有ora-04031错误。老实说,stream pool用的很少,我也很少见这个内存结构报4031错误。那么大概率就是用到了这个内存组健。从提供的图片来看,似乎stream pool的free memory还是非常多的,高达10GB。
刚好下午这会儿不太忙,就顺便看了下这个case,感觉有点意思。从我的理解,既然free memory 还有10GB之多,那么居然还报错,因此有没有可能是Oracle 19c这个版本中内存的管理有一些变化呢?我看了一下我的测试环境19.23环境,发现多了一个参数:
NAME VALUE DESCRIB
---------------------------------------------------------------------- -------------------- --------------------------------------------------------------------------------
__streams_pool_size 0 Actual size
in bytes of streams pool
streams_pool_size 0 size
in bytes of the streams pool
_bug34010877_enable_streams_pool_subpools FALSE
enable streams pool multiple subpools
_disable_streams_pool_auto_tuning FALSE
disable streams pool auto tuning
_streams_pool_max_size 0 streams pool maximum size when auto SGA enabled
_memory_broker_shrink_streams_pool 900 memory broker allow policy to shrink streams pool
_redo_transport_stream_writes TRUE Stream network writes?
_redo_transport_stream_test TRUE
test stream connection?
_disable_streams_diagnostics 0 streams diagnostics
_aq_streaming_threshold 10485760 large payload threshold size
10 rows selected.
实际上就是打了补丁,多了一个_bug34010877_enable_streams_pool_subpools 参数而已。 顾名思义,也就是说从某个版本开始,Oracle 默认情况之下,也将stream pool 变成了subpool结构,类似Oracle shared pool一样。我们知道,oracle 9i开始引入了shared pool的subpool 机制,后面版本中,默认会是7个子池。基于这个思路,我查了下mos,果然发现了这个官方的说明:
小伙伴这里查了下,果然还真是7个子池。 那么既然如此,就极有可能是个别子池free memory不足了,也就是说各个子池内存使用很不均匀,实际上这个问题还是挺常见的,特别是大家之前处理shared pool的时候。
经了解该网友使用的抽取软件使用oracle xstream,难怪需要要用stream pool。比较有意思的是,我发现oracle 23 Ai版本中,直接引入了一个新的参数:
而且我们发现_enable_streams_pool_subpools 默认就是false,也就是并没有启用这个功能。难道Oracle很早就意识到了这个问题了?
-----------------------------------------------------------------------------------
喜欢本文的朋友,欢迎关注公众号 Roger的数据库专栏,收看更多精彩内容
