ITPub博客

首页 > 数据库 > Oracle > 内部错误ORA-04301

内部错误ORA-04301

原创 Oracle 作者:abp0109 时间:2010-10-14 10:15:55 0 删除 编辑

上周天下午,用户突然打电话说一数据库系统有故障,无法访问,由于我没有VPN远程登陆帐号,后在得到VPN帐号时,谁知还连接不到那台服务器所在网段,最后局方一工程师登陆服务器直接将DB重新启动,问题解决。先把相关错误信息分享各位,若各位有好的意见,敬请发表!

先简单介绍下环境及相关重要参数值:

操作系统:sunOS

数据库版本:Oracle 8.1.7.0.0

db_cache_size=1024MB

shared_pool_size=300MB

shared_pool_reserved_size=781K

_shared_pool_reserved_min_alloc= 4400 Bytes

log_buffer=160K

java_pool_size=20MB

large_pool_size=600K

alert_ora8.log

Sun Oct 10 12:50:07 2010

Errors in file /export/home/oracle/admin/ora8/bdump/ora8_smon_27615.trc:

ORA-00604: error occurred at recursive SQL level 1

ORA-04031: unable to allocate 4128 bytes of shared memory ("shared pool","unknown object","sga heap","multiblock rea")

ora8_smon_27615.trc

/export/home/oracle/admin/ora8/bdump/ora8_smon_27615.trc

Oracle8i Enterprise Edition Release 8.1.7.0.0 - 64bit Production

With the Partitioning option

JServer Release 8.1.7.0.0 - 64bit Production

ORACLE_HOME = /export/home/oracle/product/8.1.7

System name: SunOS

Node name: SMGDB

Release: 5.8

Version: Generic_117000-03

Machine: sun4u

Instance name: ora8

Redo thread mounted by this instance: 1

Oracle process number: 6

Unix process pid: 27615, image: oracle@SMGDB (SMON)

*** SESSION ID:(5.1) 2010-10-10 12:50:07.936

*** 2010-10-10 12:50:07.936

SMON: following errors trapped and ignored:

ORA-00604: error occurred at recursive SQL level 1

ORA-04031: unable to allocate 4128 bytes of shared memory ("shared pool","unknown object","sga heap","multiblock rea")

由上可知,Oracle在连续几个小时内持续报错ORA-04031错误都是因为在共享池中分配4128字节大小的内存遭到失败。

查看shared pool相关参数值:

SQL> select nam.ksppinm NAME,

2 val.KSPPSTVL VALUE

3 from x$ksppi nam,

4 x$ksppsv val

5 where nam.indx = val.indx

6 and nam.ksppinm like '%shared%'

7 order by 1;

NAME VALUE

---------------------------------------------------------------- ------------------------------

_all_shared_dblinks

_shared_pool_reserved_min_alloc 4400

hi_shared_memory_address 0

shared_memory_address 0

shared_pool_reserved_size 800000 ≈ 781KB

shared_pool_size 314572800 = 300MB

根据我的直觉(不一定可靠),感觉是由于共享池中存在有大量的内存碎片而导致。由于我登上机器时,局方工作人员已经重启数据库了,所以也查询不到当时的视图v$shared_pool_reserved的内存信息了。(这是目前的查询结果,显然是没有问题的)

SQL>select free_space,avg_free_size,used_space,avg_used_size,request_failures,last_failure_size

2 from v$shared_pool_reserved;

FREE_SPACE AVG_FREE_SIZE USED_SPACE AVG_USED_SIZE REQUEST_FAILURES LAST_FAILURE_SIZE

---------- ------------- ---------- ------------- ---------------- -----------------

800000 800000 0 0 0 0

现在来看吧,shared_pool_reserved_size是没有被使用的。

因此,暂且给出的建议是调整shared_pool_size为600MB,shared_pool_reserved_size为shared_pool_size的10%,即60MB。并观察v$shared_pool_reserved,再确定是否有必要调整隐藏参数_shared_pool_reserved_min_alloc至4100。

理解:为什么将shared_pool_size和shared_pool_reserved_size分别调整到600MB和60MB,再有ORA-04031错误时,就考虑将_shared_pool_reserved_min_alloc调至4100呢,这不是变小了吗?错误中的提示是在获取4128 Bytes时,未得到而报错的。

呵呵,这个疑问我之前也有过,现给大家说说怎么回事?隐藏参数_shared_pool_reserved_min_alloc是一个阀值,请求值大于这个内存阀值时,就会从shared_pool_reserved_size中分配内存。所以此案例中极可能是由于存在有大量的内存碎片,进程请求的内存在shared pool中得不到满足,可是请求的内存又小于_shared_pool_reserved_min_alloc,所以也不能从shared_pool_reserved_size中分配,从而导致ORA-04301错误的发生。

[@more@]

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

请登录后发表评论 登录
全部评论

注册时间:2010-01-21

  • 博文量
    17
  • 访问量
    36615