紧急求救 ora-04030
各位大神帮忙啊,前天检查公司的数据库批量程序执行情况发现批量中断,程序捕获的错误为ORA-04030,手工执行该程序仍然报错,程序大致如下:select distinct t.a,t.b,sum(t.c) over(parition by t.d,t.e) value from big_table t;而big_table 的数据量大致为100万左右。操作系统:AIX6.1 
数据库:ORACLE 10.2.5.0 RAC我的调查步骤大致如下:1.检查pga sga
sga_target 8G
pga_aggregate_target 2G操作系统总内存为18G2.检查操作系统ulimitroot 用户的所有ulimit 值为 unlimited 只有data 为131072 ,两节点参数相同 
oracle 用户node1 所有值为unlimited, node2上stack 为4000000(大致)3.检查监听ps -ef|grep lsnrps v 12345678(lsnr的进程id)发现LIM 为xx 可见对监听没有限制4.执行测试sql监控select a.inst_id,b.name,a.value/1024||'K' from gv$sesstat a,gv$statname b
where a.inst_id = b.inst_id
and a.statistics# = b.statistics#
and a.sid = '123'
and b.name like '%mem%';监控结果为当session pga memory 达到110M左右的时候报ora-04030此时两节点操作系统内存剩余大于4G。查询临时表空间使用情况
select count(*) from gv$sort_usage;临时表空间的在sql执行过程中会使用(count值由31变为32)
我自己的分析:
由于在sql执行过程中系统并未受到很大压力,而且操作系统内存剩余很多,应该为系统参数限制了内存的继续申请。由于系统启动crs时使用root用户执行/etc/init.crs 而root用户的data存在限制而导致了ora-04030的产生。我的问题:1.我的分析有什么错误请指出
2.是否还有其他操作系统或数据库级别的参数限制了内存的申请由于是生产数据库,我不能随便测试,还请大神们指点啊!!!!!

解决方案 »

  1.   

    distinct需要排序,你的sort_area_size多大?
      

  2.   

    我的pga是自动管理的 
    pga_aggregate_target 2Gshow parameter sort_area_size 看到的值为65535
      

  3.   

    注意看一下下面几个参数的设定,如果用的是缺省值,估计是设得太小了调大点就可以了如果,按缺省值,内存再多也没用的,Oracle只会按自己设的大小使用内存,有时会影响执行效率,只是我们看不到而已,比如说db_cache_sizesort_area_size
    shared_pool_size
    pga_aggregate_target可能还有类似的参数,在 initXXX.ora 里面还有就是确认下,这个错误只是偶尔出现吧
      

  4.   

    -- 请参考:
    http://www.51testing.com/?uid-280547-action-viewspace-itemid-216224
      

  5.   

    感谢楼上各位的回复回3楼,这个错误web应用没问题,因为对内存需求不大,跑批量程序会有问题,因为存在单个session的pga使用达到100M 的情况回4楼,链接中的方案3我没试过,一会测试一下,不过里面没有解释原理