关于ORA-04031错误

我发现从9i升级到11g后,经常会出现ORA-04031错误,这个错误是关于sharepool的,首先9i和11g我的内存参数都是一样的,没有改动过,但是为什么11g后会频繁出现这个错误呢,让我很困惑。下面是两个我经常会看到的报错信息
ERROR at line 1:
ORA-04031: unable to allocate 88632 bytes of shared memory ("shared pool","DBMS_STATS","PLMCD^6daf6103","BAMIMA: Bam Buffer")
ORA-06508: PL/SQL: could not find program unit being called: "SYS.DBMS_STATS"
ORA-06512: at line 1
ORA-04031: unable to allocate 36888 bytes of shared memory ("shared pool","unknown object","sga heap(1,0)","KTI SGA freea")

      后来查询了相关文档,发现share pool本身的机制发生的变化,从9i开始就有了subpool的概念,可以通过隐含参数_kghdsidx_count 查看share pool分配了多少个subpool
sys@C3PRD> select a.ksppinm,b.ksppstvl from x$ksppi a,x$ksppsv b where a.indx=b.indx and a.ksppinm='_kghdsidx_count';

            KSPPINM                 KSPPSTVL
            _kghdsidx_count      5


而从v$latch_children可以看到可以有7个share pool ,但是目前只用了5个。

sys@C3PRD> select name,addr, child#, gets, misses  from v$latch_children where name = 'shared pool';

NAME                           ADDR                                             CHILD#                                   GETS                                 MISSES
------------------------------ ---------------- -------------------------------------- -------------------------------------- --------------------------------------
shared pool                    00000003800F9050                                      7                                     79                                      0
shared pool                    00000003800F8FB0                                      6                                     79                                      0
shared pool                    00000003800F8F10                                      5                             1514489367                               68570375
shared pool                    00000003800F8E70                                      4                              724854342                               64010366
shared pool                    00000003800F8DD0                                      3                             4119472396                               62758362
shared pool                    00000003800F8D30                                      2                             1654770097                               70663360
shared pool                    00000003800F8C90                                      1                             2507784864                               74089774

     由于原9i的正式环境已经无处可查,只能看到目前11g正式环境是5个,因为原来9i没有发现频繁报这个错,我想可能是因为升级到11g后应用的连接数大量增加,导致sharepool不够分配,而且我们用的是exact,应用基本没有做绑定变量,才导致了这个错误频繁发生。
      正如文档所说,如果服务器有4个以上的cpu且shared_pool_size大于250M,Oracle会动态将共享池分为多个子池,最多可以达到7个sub pool,每个子池有自己的free list,lru list及latch。子池的数量可以通过_kghdsidx_count参数来手动调整,这一点我从测试环境也证实了,因为测试环境只有两个cpu,所以只有一个subpool,而正式环境有32个,share pool的大小也比较大,所以分配了5个。
      那么如何解决这个报错呢,我想到的有三个办法,但是都存在一定的问题,可能不能立竿见影:
     1)每次报错的时候都刷新share pool,这个做法太冒险了,会正式环境也会有很大的影响,基本是不建议这样做的,实在是到了万不得已,系统hang住了,可以尝试用这个方法
     2)增加share pool的大小,这个可以同时增加可用空间,不至于碎片太小找不到可用的大块空间,我现在采用的就是这个方法,但是还是需要观察一段时间,找到一个平衡点,应该share pool过大也会增加系统开销。
     3)更改应用,采用绑定变量,让sql可以重复利用,share pool的空间可以有效的节省存放更多的sql,这个方法虽然是最有效的,但是实施起来却十分艰难,任何应用的更改影响的范围是很大的,更何况像我们这种是购买第三方的软件,而不是完全自主研发,而且是国外总公司指定的,不是说改就能改的,这个一直让我很苦恼,所以没办法我现在只能选择扩share pool的方法去缓解这个问题。

来自 “ ITPUB博客 ” ,链接:http://blog.itpub.net/21560888/viewspace-1731423/,如需转载,请注明出处,否则将追究法律责任。

转载于:http://blog.itpub.net/21560888/viewspace-1731423/

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值