首页 > 数据库 > Oracle > 内部错误ORA-04301
上周天下午,用户突然打电话说一数据库系统有故障,无法访问,由于我没有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错误的发生。
来自 “ ITPUB博客 ” ,链接:https://blog.itpub.net/23219371/viewspace-1039722/ ,如需转载,请注明出处,否则将追究法律责任。