数据库环境:
SunOS 5.6+Oracle8i Enterprise Edition Release 8.1.7.0.0
sqlplus连库提示如下:错误:
ORA-04031: unable to allocate 4096 bytes of shared memory ("shared pool","begin
dbms_output.disable; e...","PL/SQL MPCODE","BAMIMA: Bam Buffer")连接到:
Oracle8i Enterprise Edition Release 8.1.7.0.0 - Production
With the Partitioning option
JServer Release 8.1.7.0.0 - ProductionSQL>如上所示,报ora-04031错误,但还是能连上,应用程序和数据库目前也没有什么异常,alert_ora8.log日志也没有错误,上网查大概是说我的共享内存不够了,可有时候连就没有报错,而且即使报错也能连上,这是什么原因呢?我需要增加共享内存么(不管他行么?),如何增加?本人新手,请各位老师赐教,谢谢!

解决方案 »

  1.   

    SELECT * FROM v$sysstat
    WHERE name LIKE 'opened cursors current'如果值很大(Ws/Ks),那么出4031是正常的,需要从应用端减少同时开启的cursou来解决。
    如果值不大,那可能是碎片,需要在应用端使用bind变量来解决
    ====================================================
    GOOGLE来的
      

  2.   

    ORA-04031,这个问题是一个比较老的问题了,记得在原来的oracle8.1.7.0.0 上面经常的出现这个问题,后来升级打补丁到8.1.7.4问题就解决了,估计是bug ,但是这个问题出现的原因也是比较的多的,排除BUG 的原因,那就是应用的问题了,主要 就是SQL语句没有使用bind variable 的问题造成的今天看了一篇文章发现不使用bind  var 的话对库高速缓冲,parse 的影响还是很大的
    所以发现这个问题首先要升级打补丁,排除BUG 的可能
    其次做一个statspack 看看SQL语句是否使用了bind var最后要看是不是打开过多的cursor ,如果打开过多的cursor 的话,也会导致这个问题的发生的SELECT * FROM v$sysstat
    WHERE name LIKE 'opened cursors current'如果值很大(Ws/Ks),那么出4031是正常的,需要从应用端减少同时开启的cursou来解决。
    如果值不大,那可能是碎片,需要在应用端使用bind变量来解决
    当然,不排除BUG的可能……
    ===========================
    ZT
      

  3.   

    SELECT * FROM v$sysstat 
    WHERE name LIKE 'opened cursors current' ;STATISTIC#     NAME                            CLASS     VALUE
      --------     ---------------------------     --------- ---------                                   
             3     opened cursors current            1       219请问这个值算大么?  
    "果值不大,那可能是碎片,需要在应用端使用bind变量来解决 "能具体解释一下么?
    会是什么原因造成这种问题的呢?