使用Oracle 19c,必须要注意这个Bug

来源:这里教程网 时间:2026-03-03 20:41:26 作者:

今天数据库诊断付费文章订阅伙伴群中,有个小伙伴提到,一个抽取软件报错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的数据库专栏,收看更多精彩内容

相关推荐