`
myharmony
  • 浏览: 107860 次
  • 性别: Icon_minigender_1
  • 来自: 中山市
社区版块
存档分类
最新评论

ORA-04031: unable to allocate 4096 bytes of shared memory

阅读更多
ORA-04031: unable to allocate 4096 bytes of shared memory
http://blog.163.com/wghbeyond@126/blog/static/351661812009102543621682/


  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
  
  我们可以看到没有合理利用保留区
  
  SQL> SELECT SUM(RELOADS)/SUM(PINS) FROM V$LIBRARYCACHE;
  
  SUM(RELOADS)/SUM(PINS)
  ----------------------
  .008098188
  
  不算太严重
  SQL> SELECT round((B.Value/A.Value)*100,1) hardpaseperc
  FROM V$SYSSTAT A,
  V$SYSSTAT B
  WHERE A.Statistic# = 171
  AND B.Statistic# = 172
  AND ROWNUM = 1;
  
  hardpaseperc
  ------------------
  26.5
  
  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
  
  -- dbms_lob正是exp时申请保留区的对象
  3.查看导致换页的应用
  SQL> select * from x$ksmlru where ksmlrsiz>0;
  
  ADDR   INDX  INST_ID KSMLRCOM   KSMLRSIZ KSMLRNUM KSMLRHON KSMLROHV KSMLRSES
  
  50001A88 0     1 BAMIMA: Bam Buffer 4100     64 DBMS_DDL 402745060 730DEB9C
  
  50001ACC 1     1 BAMIMA: Bam Buffer 4108    736 DBMS_SYS_SQL 1909768749 730D0838
  
  50001B10 2     1 BAMIMA: Bam Buffer 4112    1576 STANDARD 2679492315 730D7E20
  
  50001B54 3     1 BAMIMA: Bam Buffer 4124    1536 DBMS_LOB 853346312 730DA83C
  
  50001B98 4     1 BAMIMA: Bam Buffer 4128    3456 DBMS_UTILITY 4041615653 730C5FC8
  
  50001BDC 5     1 BAMIMA: Bam Buffer 4132    3760 begin :1 := dbms_lob.getLeng... 2942875191 730CFFCC
  
  50001C20 6     1 state objects    4184    1088 0 00
  
  50001C64 7     1 library cache    4192    488 EXU8VEW  2469165743 730C1C68
  
  50001CA8 8     1 state objects    4196     16 0 730C0B90
  
  50001CEC 9     1 state objects    4216    3608 0 730D0838
  
  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
  
  5.由于数据库不能DOWN机,所以只能选择3)和4)
  运行dbmspool.sql
  SQL> @/home/oracle/products/8.1.7/rdbms/admin/dbmspool.sql
  找出需要keep到共享内存的对象
  
  SQL> select a.OWNER,
  a.name,
  a.sharable_mem,
  a.kept,
  a.EXECUTIONS ,
  b.address,
  b.hash_value
  from v$db_object_cache a,
  v$sqlarea b
  where a.kept = 'NO' and
  (( a.EXECUTIONS > 1000
  and a.SHARABLE_MEM > 50000)
  or a.EXECUTIONS > 10000)
  and SUBSTR(b.sql_text,1,50) = SUBSTR(a.name,1,50);
  OWNER  NAME            SHARABLE_MEM KEP EXECUTIONS ADDRESS HASH_VALUE
  ------- ----------------------—--- ------------ --- ---------- -------- ----------
  SELECT COUNT(OBJECT_ID)   98292    NO  103207  74814BF8 1893309624
  FROM ALL_OBJECTS
  WHERE OBJECT_NAME = :b1
  AND OWNER = :b2
  
  STANDARD          286632    NO  13501
  DBMS_LOB          98292  NO  103750
  DBMS_LOB        47536    NO  2886542
  DBMS_LOB        11452    NO  2864757
  DBMS_PICKLER        10684    NO  2681194
  DBMS_PICKLER        5224     NO  2663860
  
  SQL> execute dbms_shared_pool.keep('STANDARD');
  SQL> execute dbms_shared_pool.keep('74814BF8,1893309624','C');
  SQL> execute dbms_shared_pool.keep('DBMS_LOB');
  SQL> execute dbms_shared_pool.keep('DBMS_PICKLER');
  SQL> select OWNER, name, sharable_mem,kept,EXECUTIONS from v$db_object_cache where kept = 'YES' ORDER BY sharable_mem;
  SQL> alter system flush shared_pool;
  System altered.
  
  SQL> SELECT POOL,BYTES FROM V$SGASTAT WHERE NAME ='free memory';
  
  POOL       BYTES
  ----------- ----------
  shared pool  7742756
  large pool   614400
  java pool    32768
  
  [oracle@ali-solution oracle]$ sh /home/oracle/admin/dbexp.sh
  
  [oracle@ali-solution oracle]$ grep ORA- /tmp/exp.tmp
  未发现错误,导出数据成功
  
  四、建议:
  由于以上解决的方法是在不能DOWN机的情况下,所以没能动态修改初始化参数,
  但问题的本质是共享区内存过小,需要增加shared pool,使用绑定变量,才能根本
  的解决问题,所以需要在适当的时候留出DOWN机时间,对内存进行合理的配置
分享到:
评论

相关推荐

    解决ora-04031共享内存问题

    解决ora-04031共享内存问题解决ora-04031共享内存问题解决ora-04031共享内存问题解决ora-04031共享内存问题

    ORA-32001:请求写入spfile,但没有使用spfile的解决方法

    ORA-32001:write to spfile requested but no spfile is in use请求写入spfile,但没有使用spfile的解决方法 在输入以下语句中报了这样的错误: SQL&gt;alter system set control_files=’/u01/app/oracle/oradata/prod/...

    Oracle数据库发生ORA-04031错误原因浅析及处理.pdf

    Oracle数据库发生ORA-04031错误原因浅析及处理 Oracle数据库是甲骨文公司提供的一种分布式数据库管理系统,以分布式数据库为核心的软件产品。它具有完整的数据管理功能,作为一个关系数据库,它是一个非常实用的...

    oracle报错大全(珍藏版)

    #### ORA-00021: Unable to Lock Memory in Shared Pool 当Oracle试图锁定共享池中的内存但失败时触发。这可能是因为操作系统的限制或配置问题。 #### ORA-00022: Error Getting Lock ID 获取锁ID时出错,通常是...

    ora-01033:oracle initialization or shutdown in progress 解决方法

    ### ora-01033: Oracle Initialization or Shutdown in Progress 解决方法 #### 一、问题背景及原因 **标题**: “ora-01033: Oracle initialization or shutdown in progress 解决方法” **描述**: “ora-01033: ...

    如何处理错误ORA-29275:部分多字节字符

    ### 如何处理错误ORA-29275:部分多字节字符 #### 问题背景与描述 在Oracle数据库操作过程中,用户可能会遇到一个特定的错误提示——ORA-29275:部分多字节字符。这一错误通常出现在执行查询`SELECT * FROM V$...

    ORA-04052p5731178_92080_WINNT.zip

    ORA-00604: 递归SQL层1出现错误 ORA-03106: 致命的双工通信协议错误 ORA-02063: 紧接着line(源于dblink) 以及 ORA-04052: 在查找远程对象时出错 ORA-00604: 递归SQL层1出现错误 ORA-03120: 双工转换例行程序:整数...

    ORA-12154: TNS: 无法解析指定的连接标识符的解决方法

    ORA-12154: TNS: 无法解析指定的连接标识符的解决方法

    Oracle 授权 ORA-00990: 权限缺失或无效

    在Oracle数据库管理中,"ORA-00990: 权限缺失或无效"是一个常见的错误代码,它表示用户尝试执行的操作没有足够的权限。这个错误通常发生在试图访问、修改或者管理数据库对象(如表、视图、索引等)时。在本篇文章中...

    ORA-27101: shared memory realm does not exist.

    NULL 博文链接:https://snowelf.iteye.com/blog/507976

    BLOG_【故障处理】Oracle_lhr_ORA-01565 告警日志报“ORA-01565 Unable To open Spfile”.pdf

    ### 故障处理:Oracle ORA-01565 "Unable To Open Spfile" 错误 #### 故障背景与概述 在Oracle数据库管理过程中,遇到ORA-01565错误提示是一个较为常见的问题,特别是对于采用RAC(Real Application Clusters)...

    oracle特有的错误:ORA-01036:非法的变量名/编号

    在Oracle数据库系统中,"ORA-01036:非法的变量名/编号"是一个常见的错误,通常出现在PL/SQL代码或者SQL查询语句中,当你尝试使用一个不正确或者未定义的变量时,Oracle数据库会抛出这个错误。这个错误可能是由于...

    ORA-00904: "WM_CONCAT": 标识符无效

    在Oracle数据库中,"ORA-00904"是一个常见的错误代码,它表示尝试引用一个不存在或无效的标识符。在这个场景下,错误信息提到的是"WM_CONCAT"函数,这表明在Oracle 19c数据库环境中,用户尝试使用WM_CONCAT函数,但...

    oracle12c ORA-01017: 用户名/口令无效; 登录被拒绝 解决方案

    oracle12c程序连接时异常: ORA-01017: 用户名/口令无效; 登录被拒绝 的解决方案。

    ORA-01688:unable to extend table name(执行存储过程时的错误).pdf

    标题 "ORA-01688:unable to extend table name" 指的是在执行Oracle数据库存储过程时遇到的一个特定错误。这个错误通常发生在尝试扩展一个表或分区时,由于表空间已满,无法分配更多的空间。表空间是Oracle数据库中...

    ORA-00060: 等待资源时检测到死锁--oracle 数据库表死锁异常

    在Oracle数据库系统中,"ORA-00060: 等待资源时检测到死锁" 是一个常见的错误提示,它表明两个或多个事务在执行过程中陷入了无法继续进行的状态,因为彼此都在等待对方释放资源。这种情况通常发生在并发操作中,比如...

    ORA-04031故障分析处理

    ORA-04031错误是Oracle数据库中一个常见的内存管理问题,主要涉及到数据库的共享池。当系统尝试分配共享池中的大块连续内存失败时,Oracle会尝试清理和合并内存块,但如果仍然无法满足需求,就会触发此错误。这个...

    Oracle错误码大全

    ORA-00001: 违反唯一约束条件 (.) ORA-00017: 请求会话以设置跟踪事件 ORA-00018: 超出最大会话数 ORA-00019: 超出最大会话许可数 ORA-00020: 超出最大进程数 () ORA-00021: 会话附属于其它某些进程;无法转换...

    CLOB 字段类型报错 ORA-01704: 文字字符串过长的解决

    然而,当你尝试向CLOB字段插入数据时,如果超过了Oracle规定的最大限制,就会遇到“ORA-01704: 文字字符串过长”的错误。这个错误通常意味着你试图插入的字符串超过了Oracle数据库允许的最大长度,对于VARCHAR2类型...

Global site tag (gtag.js) - Google Analytics