记一次ORA-04030–无法分配内存的错误

错误内容:ORA-04030: 在尝试分配 8389132 字节 (pga heap,redo read buffer) 时进程内存不足  

错误的一般原因:

1、主机内存限制,包括windows 32上得1.7G限制

2、系统用户的shell限制,一般都是AIX上得/etc/security/limits中 data设置不够大。

3、pga设置过小,无法创建连接。

4、pga过小导致每个进程可以使用的pga内存过小

设置了PGA_AGGREGATE_TARGET以后,每个进程PGA内存的大小也是受限制的:

o 串行操作时,每个进程可用的PGA内存为MIN(PGA_AGGREGATE_TARGET * 5%, _pga_max_size/2),其中隐含参数_pga_max_size的默认值是200M,同样不建议修改它。

o 并行操作时,并行语句可用的PGA内存为PGA_AGGREGATE_TARGET * 30% / DOP (Degree Of Parallelism 并行度)。


案例:

操作系统:windows 2003 32bit

oracle: 9208

问题描述:  
1、在将数据库从9201升级到9208之后,应用连接数据库不稳定,有时会连接失败。

2、查看数据库告警日志,数据库启动后半小时左右开始报如下错误:

Fri May 10 09:51:45 2013  
Errors in file d:\oracle\admin\lssgsj\udump\lssgsj_ora_3964.trc:    
ORA-04030: 在尝试分配 8389132 字节 (pga heap,redo read buffer) 时进程内存不足    
Fri May 10 09:52:38 2013    
Errors in file d:\oracle\admin\lssgsj\udump\lssgsj_ora_3284.trc:    
ORA-04030: 在尝试分配 8389132 字节 (pga heap,redo read buffer) 时进程内存不足

处理过程如下:  
1、之前在升级数据库到9208时,将java pool 增大到了150M,此时将其改回原来的16M,重启数据库后仍然会报4030错误。    
2、考虑到windows 32位上内存限制,检查数据库内存配置:db_cache_size为900M,shared_pool为150M,PGA为400M;    
降低db_cache_size大小到700M,增大PGA到500M,重启数据库后仍然报错。    
3、降低SGA_MAX_SIZE,从1.2G修改为1G,并再次降低db_cache_size到500M,增大PGA到800M,重启数据库后没有在发生4030错误。


请使用浏览器的分享功能分享到微信等