这篇文章是参考甲骨论老相老师的教学视频:
http://v.youku.com/v_show/id_XMzkyMTkzNjg4.html
所做的学习笔记.

什么是4031错误和4031错误产生的原因:
详细请看这里:
http://v.youku.com/v_show/id_XMzkyMTkzNjg4.html

简单一个句话概括:
     由于服务器一直在执行大量的硬解析,导致Oracle 的shared pool Free空间碎片过多,大的chunk不足, 当又一条复杂的sql语句要硬解析时, 缺少1个足够大的Free chunk, 通常就会报4031错误.


解决方法:

方法1.清空Shared pool缓存.
执行Alter system flush shared_pool;

这样的话释放出大量的free 空间, 不过由于缓存都没了,接下来肯定会发生大量的硬解析,这是1个指标不治本的方法..

方法2.共享SQL
详细请看这里:
http://nvd11.blog.163.com/blog/static/200018312201301945631729/

方法3. 将复杂sql语句及执行计划强制保留在缓存  dbms.shared_pool.keep('object_name')

       此话怎么理解?  其实导致4031错误的原因是shared_pool空间没有足够大的chunk提供给新的复杂sql语句进行硬解析, 其实也不是单纯地因为free 空间碎片太多,  其实当free空空间没有足够大的chunk时, oracle 会释放 Library cache中長时间不使用的chunk.

举个例子, 1个数据库实例中, free空间中chunk数量很少了,而且没有足够大的chunk, 这时有1个中等规模的sql要硬解析,就会从library cache中找那些不长用的chunk释放出来,  如果释放里面若干个小规模的chunk, 是无问题的.

但是如果其中library cache 有个很大的chunk存放着1个很复杂的sql语句, 但是长时间没有被使用了, 有可能这个chunk被释放出来被使用, 而且被拆解了...  其中一部分别使用, 另1部分被放入free空间中.

而之后偏偏那个很复杂的sql语句又执行了,需要硬解析, 而那个足够大的chunk已被分解.. 则有可能报4031错误.

所以方法3就是指定一些sql语句的缓存长期保留, 不让他们被释放, 避免这种情况的发生.

步骤1
      首先是找出Library cache中那些占用大的对象啦.

语法如下:
      select name from v$db_object_cache where sharable_mem > 10000
                  and type in ('PACKAGE','PACKAGE BODY','FUNCTION','PROCEDURE')
                  and kept = 'NO';

注意红色数字单位是kb, 生产中要根据实际情况修改..
     如图:

我找到1个包 PAK_EMP, 占用超过10k以上的(其实10k是很小的值了).

接下来就执行 dbms.shared_pool.keep了?

但是实际上dbms.shared_pool这个默认不会安装在数据库的如下图:
不过提供了安装脚本:
路径是
$ORACLE_HOME/rdbms/admin/dbmspool.sql

所以在sqlplus执行:
@?/rdbms/admin/dbmspool.sql   就可以安装这个系统包了, 如图:

接下来就可以执行
exec dbms_shared_pool.keep('SCOTT.PAK_EMP')  

如上图, 这个对象一直会保留在shared_pool缓存了. 注意对象名字要带模式名啦.
这时在查看对象缓存:

见到kept 字段变成yes了!

如果想撤销点算: 执行
exec dbms_shared_pool.unkeep('SCOTT.PAK_EMP')  
就得了

方法4 增加shared pool空间.

一般当服务器增加内存的时候,  就可以给shared pool增加空间:

一般来讲Oracle 10g以后 SGA里面各大池空间都是动态分配的, 一般增加SGA大小即可.

alter system set sga_target = 2000M;                  --注意不能超过sga_max_size
alter system set sga_max_size = 2000M;              --该这个必须重启数据库, 目的
                                                                            是限制sga_target, 以免sga_target
                                                                            不小心设置过大,倒置服务器内存耗尽挂掉
也可以单独设置shared pool的大小:              
alter system set shared_pool_size  = 200M;

注意默认情况下 用show parameter 来查查看 sga_target 和 shared_pool的话, value 都是0的, 并不是说它们的当前值就真的是0了,只是0是代表交由Oracle自己管理的意思.

可以用这个语句可以查看当前的各大池占用大小:
select component, current_size from v$sga_dynamic_components;

可以看出其实当前shared pool大小接近250m了

我们现在做个实验,  我们手动将shared pool设置为60m 看看神马情况

再查看一次大小:

居然没有任何变化,

实际情况是这样的:  当dba 设置了1个sga_target后, sga就根据sga_target的设置大小自动为shared pool设置1个最小的值, 假如这个值是150m, 而当我将shared pool手动设置为60m时, 小于这个值, oracle就会无视这个命令的..

方法5: 保留区
oracle 为了避免4031错误,  其实还可以在shared pool划出1个保留的free 空间, 平时不会使用, 专门应对突然出现的复杂sql语句硬解析,相当与应急用的空间啦. 这个方法相当有效, 可以避免大部分的4031错误, 不过缺点就是平时减少了shared pool的可用空间, 减低了数据库缓存性能啦~

我们可以用下面这条语句来查看 在保留区请求失败的次数:
select request_misses from v$shared_pool_reserved;

注意这个次数一旦 大于1, 就证明发生过4031错误! 因为既然去保留区申请空间了, 证明是1个复杂的sql语句, 还申请失败的话,就会报4031错误啦~ 所以这个次数最好就是0啦.

可以用下面语句去查看当前 shared pool保留区的大小

可以看到保留去有10m多啦~
还见到 shared_pool_size 只有60m, 头先设置的啦,无视他吧~ 将其设置会0就会自动由 oracle 管理了.

设置保留区大小都一样啦:
alter system set shared_pool_reserved_size = 100m;

注意不要设置过大啦, 你懂的.

Oracle 解决4031错误相关推荐

  1. 连接Oracle远程数据库错误:ORA-12541,ORA-12514,ORA-01017的解决方法!

    连接Oracle远程数据库错误:ORA-12541,ORA-12514,ORA-01017的解决方法! 参考文章: (1)连接Oracle远程数据库错误:ORA-12541,ORA-12514,ORA ...

  2. 安装oracle 10g闪退,Windows 7安装Oracle 10g常见错误及解决方法

    Windows 7安装Oracle 10g常见错误及解决方法 在安装之前,我们要先下载相应的版本. 点击:Oracle 10g支持Win7版 错误A: 正在检查操作系统要求... 要求的结果: 5.0 ...

  3. Oracle常见ORA错误及解决办法

    Oracle常见ORA错误及解决办法 问题1 1.1 错误现象: EXP-00008: ORACLE error 1013 encountered ORA-01013: user requested ...

  4. oracle ora-3136,ORA-3136 错误解决 .

    参考metalink的文档:Doc ID: Note:3136.1 and 465043.1 WARNING: inbound connection timed out (ORA-3136) 1.参数 ...

  5. oracle中12560,如何解决Oracle数据库ORA-12560错误问题

    如何解决Oracle数据库ORA-12560错误问题 发布时间:2020-07-28 10:16:24 来源:亿速云 阅读:77 作者:小猪 栏目:数据库 这篇文章主要为大家展示了如何解决Oracle ...

  6. oracle数据库适配器错误,Oracle数据库协议适配器错误解决方法

    Oracle协议适配器错误解决办法 作者:IT实验室出处:博客2012-01-29 15:44 在Oracle中新建了一个数据库,今天把它删了之后再登录SQL*PLUS就登不上去了,出现ORA-125 ...

  7. oracle 配置数据库错误,Oracle数据库配置错误信息解决方法

    Oracle数据库配置错误信息 Oralce数据库的错误信息经常会出现,我们看见的都是错误的代码,至于错误原因究竟是什么还一时半会难以解答,所以就把一些常见的错误整理了一下,来看看也许对你有帮助的. ...

  8. 【Oracle】ORA-04031错误解决

    ORA-04031 错误产生原因: 1.  大量的硬解析出现. 2.  突然出现一个大的 SQL 解决 04031 错误解决办法: (1) 直接执行 SQL> alter system flus ...

  9. 如何解决ORA-04031错误

    诊断并解决ORA-04031错误 当我们在共享池中试图分配大片的连续内存失败的时候,Oracle首先清除池中当前没使用的所有对象,使空闲内存块合并.如果仍然没有足够大单个的大块内存满足请求,就会产生O ...

最新文章

  1. Mybatis学习记录-使用问题总结之一DISTINCT
  2. 客户端(C#)调用CXF搭建的webservice的出现一些问题记录
  3. 开发者福利,BCH通用数据库Bitdb 2.0来了
  4. 用MS SQL 语句修改表中字段类型
  5. 【探索HTML5第二弹05】响应式布局(中),一步一步响应式布局
  6. 软件质量管理体系 type:pdf_萧县iso14001环境管理体系各种荣誉资质
  7. 计算机教室标语6个字,教室常用标语
  8. qt多级菜单_Qt高仿电脑管家界面(二):点击按钮弹出菜单
  9. salve mysql_mysql 同步实现, master-salve
  10. 关于vtt 与 srt 字幕 的相互转换
  11. 2022全国职业技能大赛-网络系统管理-Debian模块:CA证书服务
  12. MTK虚拟sensor梳理
  13. 流氓软件强夺用户数据,马斯克截胡扎克伯格!
  14. 清风数学建模笔记——Excel画图保姆级教学
  15. 数字华容道c语言源代码,vue数字华容道游戏代码
  16. 常用眼底图像数据集简介及下载--糖尿病视网膜病变(Eyepacs,APTOS2019,Messdior,Messdior-2,STARE数据集)
  17. RN系列文章---RN简介
  18. 路由器交换机:机试练习
  19. 元宇宙激活VR的内容生态
  20. 四川大学计算机学院学科评估,四川大学第四轮学科评估结果:58个学科上榜,其中A类学科16个...

热门文章

  1. TF-A代码阅读: SP_EL3栈内存-cpu_data内存的介绍(cpu_context介绍)
  2. 手撕FSG2.0壳(有坑点)
  3. 如何做好应急响应工作?常见应急响应流程
  4. MySQL客户端和服务器端工具集
  5. 1.11实例:保存图书信息
  6. Java多线程的实现方式-Thread 类,Runnable 接口
  7. Python利用pymysql连接Mysql数据库
  8. 方框(HPU暑期第四次积分赛)
  9. 2021 ICPC 江西省大学生程序设计竞赛(热身赛)【完结】
  10. html实战例子: 课程表