遇到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;