Ora-04031 问题诊断思路

本文介绍了如何诊断和解决Oracle数据库出现的ORA-04031错误。通过深入分析内存结构,提供利用dbms_shared_pool.keep进行问题排查的方法。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

--一、错误提示: 
> EXP-00008: ORACLE error 4031 encountered 
> ORA-04031: unable to allocate 4096 bytes of shared memory 
("shared pool","BEGIN :EXEC_STR := SYS.DBMS...","PL/SQL MPCODE","BAMIMA: Bam Buffe 
--二、错误原因: 
--    共享内存太小,存在一定碎片,没有有效的利用保留区,造成无法分配合适的共享区。 
--三、解决步骤: 
--1.查看当前环境 
SQL>   show sga   Total System Global Area 566812832 bytes 
  Fixed Size 73888 bytes     Variable Size 28811264 bytes 
  Database Buffers 536870912 bytes    Redo Buffers 1056768 bytes 
  show parameter shared_pool   
  NAME TYPE VALUE :  shared_pool_reserved_size string 1048576 
  shared_pool_size string 20971520 
SQL> select sum(free_space) from v$shared_pool_reserved; 
   SUM(FREE_SPACE) :   1048576 
--我们可以看到没有合理利用保留区 
--2.查看保留区使用情况 
SQL> SELECT FREE_SPACE,FREE_COUNT,REQUEST_FAILURES,REQUEST_MISSES,  LAST_FAILURE_SIZE 
         FROM V$SHARED_POOL_RESERVED; 
  FREE_SPACE FREE_COUNT REQUEST_FAILURES REQUEST_MISSES LAST_FAILURE_SIZE 
  ---------- ---------- ---------------- -------------- ----------------- 
   1048576 1 146 0 4132 
-- 最近一次申请共享区失败时该对象需要的共享区大小4132 
select name from v$db_object_cache where sharable_mem = 4132; 
  name :dbms_lob 


--3.分析各共享池的使用情况 
SQL> select KSPPINM,KSPPSTVL from x$ksppi,x$ksppcv 
      where x$ksppi.indx = x$ksppcv.indx and KSPPINM = '_shared_pool_reserved_min_alloc'; 
      KSPPINM         KSPPSTVL 
      ------------------------------- -------- 
      _shared_pool_reserved_min_alloc   4400 --(门值) 
--  我们看到INDX=5,DBMS_LOB造成换页(就是做exp涉及到lob对象处理造成的换页情况),换出最近未使用的内存,但是换出内存并合并碎片后在共享区仍然没有合适区来存放数据,说明共享      区小和碎片过多,然后根据_shared_pool_reserved_min_alloc的门值来申请保留区,而门值为4400,所以不符合申请保留区的条件,造成4031错误。我们前面看到保留区全部为空闲状态,所以我们可以减低门值,使更多申请共享内存比4400小的的对象能申请到保留区,而不造成4031错误。


--4.解决办法: 
--1).增大shared_pool (在不DOWN机的情况下不合适) 
--2).打patch   (在不DOWN机的情况下不合适) 
--3).减小门值 (在不DOWN机的情况下不合适) 
--   因为LAST_FAILURE_SIZE<_shared_pool_reserved_min_alloc所以表明没有有效的使用保留区 
SQL> alter system set "_shared_pool_reserved_min_alloc" = 4000; 
alter system set "_shared_pool_reserved_min_alloc"=4000 
    * 
ERROR at line 1: 
ORA-02095: specified initialization parameter cannot be modified 
-- 9i的使用方法alter system set shared_pool_reserved_min_alloc"=4000 scope=spfile; 
--4).使用alter system flush shared_pool; (不能根本性的解决问题) 

-- 5).使用dbms_shared_pool.keep 


转载请注明出处及原文链接:

http://blog.youkuaiyun.com/xiangsir/article/details/8575477




评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值