适用版本:Oracle Server - Enterprise Edition - Version: 10.2.0.3 and later [Release: 10.2 and later ]
数据库启动失败源于SGA_MAX_SIZE参数从900MB增加值1200MB
错误1:当没有设置大池参数时
ORA-04030: out of process memory when trying to allocate 32 bytes (sql area,tmp)
报错ORA-04030:当试图分配32bytes时进程内存溢出
错误2:当设置有大池参数时
ORA-12853: insufficient memory for PX buffers: current 0K, max needed 354288K
报错ORA-12853:缓冲区内存不足:当前OK,最大需要354288K
ORA-04031: unable to allocate 21544 bytes of shared memory ("large pool","unknown object","largepool","PX msg pool")
报错ORA-04031:无法分配21544 bytes共享内存(“大池”,“未知对象”,“大池”,“PX MSG池”)
尝试修改实例SGA最大值从900MB到1200MB,但由于CPU_COUNT参数过高和增加粒度大小引起错误4031或者4030
oracle内存大小取决于CPU_COUNT参数中最小缓冲区大小
10g : max (CPU_COUNT, number of processor groups) * max(Granule size, 4MB)
11g : max (4MB * CPU_COUNT, Granule size * number of processor groups)
当参数PARALLEL_AUTOMATIC_TUNING 为真值(默认为真),大池被使用,否则共享池被用在这个区域。
o _PARALLEL_MIN_MESSAGE_POOL 参数可通过以下两种算法设置大小
1. CPU_COUNT*PARALLEL_MAX_SERVERS*1.5*(OS msg bufr size)
2. CPU_COUNT*5*1.5*(OS message size)
* _PARALLEL_MIN_MESSAGE_POOL参数可根据算法的内部因素设置大小,额外的2MB给共享池为每个cpu_count参数
粒度大小设置
如果SGA_MAX_SIZE参数设置超过1GB,粒度大小通常会从4MB增长到16MB
SGA组件例如共享池用多种增加粒度大小,所以每个组件往往需要更多的内存。尤其是,最低缓冲区要增加一倍,
这样会导致较小的内存给其他组件使用,从而出现错误ORA-4031。
例Sun Solaris T5XXX has threaded CPUs有2个物理CPU、8核心、每个核心8线程,Oracle评估CPU_COUNT参数值为128。
当SGA_MAX_SIZE=900MB时,高速缓冲区大小最低等于512MB,共享池可以用338MB
当SGA_MAX_SIZE=1200MB时,高速缓冲区大小最低等于1024MB,共享池可以用176MB,所以报ORA-4031错误即使SGA_MAX_SIZE参数大小较大。
因此Oracle开发审查通过8316255个错误的情况。这个错误被关闭不是一个错误。
开发表明,你必须谨慎调整cpu_count参数的值:
“......我们强烈建议您不要调整cpu_count参数,因为它会影响其他功能和Oracle参数。
例如,每个CPU处理能力可能不足以维持高负载(如高速缓存融合消息)。此外,一些等相关参数如GC锁存器将根据设定。”
在11g中修复了一些类似的个案,应有助于缓解CUP_COUNT有关缓冲区高速缓存大小的问题。
在10G的解决办法可以手动设置DB_CACHE_SIZE和其他SGA组件,并删除了ASMM(将SGA_TARGET参数设置为0)功能。