您好,欢迎访问一九零五行业门户网

ORA-4031错误 解决方法

遇到ora-4031错误时,你的心里会不会发怵?ora-4031很容易导致数据库出现异常崩溃,当oracle的核心进程无法获得共享池内存时,它
遇到ora-4031错误时,你的心里会不会发怵?ora-4031很容易导致数据库出现异常崩溃,当oracle的核心进程无法获得共享池内存时,它们会把数据库异常宕掉。当然,ora-4031就像黄灯一样,它在提醒你需要马上采取紧急策略了。不是说它一出现,数据库马上就会宕机。
话题讨论:
1.ora-4031是oracle中最令人厌恶的报错,,它的出现有哪几种原因?
2.一旦出现4031错误,也就是说共享池内存不足的情况下,我们该如何释放内存呢?你有木有遇到过相应的情形呢?请回忆下当时是如何解决的?
3.有一句俗语叫丢车保帅,执行计划是sql核心关键所在,是否意味着在释放内存时,不应该覆盖执行计划这部分?当执行计划部分占用内存比较多时,如何优化呢?
4.消耗共享池内存的主要有两种对象,一种是sql,而是存储过程、函数、包等这类可执行对象,当遇到4031错误时,您觉得需要优先释放哪种对象
问题分析:
1、ora-4031错误的原因,一般是大量的hard parse导致了shared pool中的free list中产生大量的内存小碎片,当一个需要很大内存来进行hard parse的sql语句到来时,无法从free list中找到内存,即使进行内存的释放,还是不能找到符合的内存块。从而报ora-4031错误。
2. ora-4031错误的解决方法:
1)alter system flush shared_pool;将shared pool中的所有内存清空。该方法治标不治本。
2)共享sql语句:规范sql语句的书写;使用绑定变量;找到没有使用绑定变量的sql:
  如果在结果中发现一系列仅仅字面值不同的sql,则可以修改cursor_sharing参数:
  alter system set cursor_sharing = 'force'; 来强制使用绑定变量。
3)使用shared pool中的保留区:
  select request_misses from v$shared_pool_reserved;
  如果结果大于0,则可以调大shared_pool_reserved的大小;
sql> show parameter shared_pool
name                                type        value
------------------------------------ ----------- ------------------------------
shared_pool_reserved_size            big integer 4m
shared_pool_size                    big integer 0
alter system set shared_pool_reserved=xxm scope=both;
4)使用dbms_shared_pool.keep('对象名')将使用内存很大的对象keep在内存中:
  先要执行:@?/rdbms/admin/dbmspool.sql
sql> @?/rdbms/admin/dbmspool.sql
package created.
grant succeeded.
view created.
package body created.
再查出需要keep的对象:
sql> select owner,name,namespace,type,sharable_mem from v$db_object_cache where sharable_mem>10000
  2  and (type='package' or type='package body' or type='function' or type='procedure') and kept='no';
owner      name                      namespace          type            sharable_mem
---------- ------------------------- ------------------ --------------- ------------
sys        dbms_backup_restore      table/procedure    package                33215
sysman    emd_collection            body              package body          33233
sys        dbms_shared_pool          body              package body          12644
sys        sys$rawtoany              table/procedure    function              12640
sysman    emd_maintenance          table/procedure    package                29030
sysman    emd_maintenance          body              package body          62930
sysman    mgmt_job_engine          body              package body          218914
sysman    em_ping                  body              package body          29086
sys        dbms_backup_restore      body              package body          95519
sysman    emd_loader                table/procedure    package                12641
sysman    emd_loader                body              package body          71861
sys        prvt_hdm                  body              package body          43624
sysman    mgmt_job_engine          table/procedure    package                24938
sys        standard                  body              package body          24960
sysman    em_severity_repos        body              package body          33236
sys        prvt_advisor              table/procedure    package                12640
sysman    mgmt_global              table/procedure    package                29902
sys        dbms_standard            table/procedure    package                24929
sys        dbms_advisor              body              package body          25000
sys        prvt_hdm                  table/procedure    package                16732
sys        prvt_advisor              body              package body          66780
sys        dbms_rcvman              table/procedure    package                43295
sys        standard                  table/procedure    package              438648
sys        dbms_rcvman              body              package body          375759
24 rows selected.
5)增加shared_pool_size的大小:
sql> select component,current_size from v$sga_dynamic_components;
其它类似信息

推荐信息