ORA-4031错误 解决方法

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

COMPONENT                                                        CURRENT_SIZE

---------------------------------------------------------------- ------------

shared pool                                                          75497472

large pool                                                            4194304

java pool                                                             4194304

streams pool                                                                0

DEFAULT buffer cache                                                130023424

KEEP buffer cache                                                           0

RECYCLE buffer cache                                                        0

DEFAULT 2K buffer cache                                                     0

DEFAULT 4K buffer cache                                                     0

DEFAULT 8K buffer cache                                                     0

DEFAULT 16K buffer cache                                                    0

DEFAULT 32K buffer cache                                                    0

ASM Buffer Cache                                                            0

13 rows selected.

sga_max_size:SGA允许的最大值,修改必须重启;

sga_target:必须小于sga_max_size, 表示当前SGA的最大值;

alter system set shared_pool_size=xxM scope=both;

3. 使用V$SHARED_POOL_ADVICE来设置shared
pool的大小

V$SHARED_POOL_ADVICE displays information about estimated parse time in
the shared pool for different pool sizes. The sizes range from 10% of the current shared pool size or the amount of pinned library cache memory (whichever is higher) to 200% of the current shared pool size, in equal intervals. The value of the interval depends
on the current size of the shared pool.

Column Datatype Description
SHARED_POOL_SIZE_FOR_ESTIMATE NUMBER Shared pool size for the estimate (in megabytes)
SHARED_POOL_SIZE_FACTOR NUMBER Size factor with respect to the current shared pool size
ESTD_LC_SIZE NUMBER Estimated memory in use by the library cache (in megabytes)
ESTD_LC_MEMORY_OBJECTS NUMBER Estimated number of library cache memory objects in the shared pool of the specified size
ESTD_LC_TIME_SAVED NUMBER Estimated elapsed parse time saved (in seconds), owing to library cache memory objects being found in a shared pool of the specified size. This is the time that would have been spent in reloading the required
objects in the shared pool had they been aged out due to insufficient amount of available free memory.
ESTD_LC_TIME_SAVED_FACTOR NUMBER Estimated parse time saved factor with respect to the current shared pool size
ESTD_LC_LOAD_TIME NUMBER Estimated elapsed time (in seconds) for parsing in a shared pool of the specified size
ESTD_LC_LOAD_TIME_FACTOR NUMBER Estimated load time factor with respect to the current shared pool size
ESTD_LC_MEMORY_OBJECT_HITS NUMBER Estimated number of times a library cache memory object was found in a shared pool of the specified size

可以使用下面的SQL语句来预估shared pool的大小:

select ‘Shared Pool‘ component,shared_pool_size_for_estimate estd_sp_size,estd_lc_time_saved_factor parse_time_factor,case when current_parse_time_elapsed_s + adjustment_s<0

then 0 else current_parse_time_elapsed_s + adjustment_s end response_time

from (

select shared_pool_size_for_estimate,shared_pool_size_factor,estd_lc_time_saved_factor,a.estd_lc_time_saved,e.value/100

current_parse_time_elapsed_s,c.estd_lc_time_saved - a.estd_lc_time_saved adjustment_s from v$shared_pool_advice a,

(select * from v$sysstat where name=‘parse time elapsed‘) e,

(select estd_lc_time_saved from v$shared_pool_advice where shared_pool_size_factor=1) c

);

COMPONENT   ESTD_SP_SIZE  PARSE_TIME_FACTOR  RESPONSE_TIME

--------------    -----------------  -------------------------   -------------

Shared Pool           64             .9989                          294.37

Shared Pool           72                 1                            257.37

Shared Pool           80            1.0009                         226.37

Shared Pool           88            1.0016                         201.37

Shared Pool           96            1.0022                         181.37

Shared Pool          104            1.0027                        166.37

Shared Pool          112            1.0029                        156.37

Shared Pool          120            1.0032                        149.37

Shared Pool          128            1.0033                        144.37

Shared Pool          136            1.0034                        141.37

Shared Pool          144            1.0034                        139.37

11 rows selected.

时间: 2024-10-01 19:48:08

ORA-4031错误 解决方法的相关文章

ORA-27100 shared memory realm already exists错误解决方法

环境:win 2003   + oracle 10g win 2003服务器物理内存4G oracle10g SGA             1504M 事故背景: 调整SGA大小,因为OS的内存只有4G,建议SGA的大小不要超过60%,我调整为2G SQL> alter systemset sga_max_size=2000m scope=spfile; 重启数据库报错ORA-27100 shared memory realm already exists 分析原因:对于32位机器ORACLE

阿里云Windows server 2008服务器搭建VPN 图文教程,购买境外服务器自建vpn,Win8/win10 连接VPN被阻止,出现812错误解决方法

阿里云Windows server 2008服务器搭建VPN 图文教程(超详细) 第一步:购买阿里云服务器,本文使用的是Windows Server 2008 R2 企业版64位中文版 IP地址:47.88.151.129,所属节点:亚太(新加坡) 服务器配置:2核,4GB,带宽10Mbps 第二步: 打开服务器管理器,点击添加角色,如下图: 本帖隐藏的内容然后弹出如下图所示,点击下一步: 点击后,如下图,勾选网络策略和网络服务,然后点击下一步: 接着继续点击下一步,直到弹出如下图所示的页面,勾

mysql Access denied for user [email&#160;protected]错误解决方法总结(转)

mysql Access denied for user [email protected]错误解决方法总结(转) mysql Access denied for user \'root\'@\'localhost\'”解决办法总结,下面我们对常见的出现的一些错误代码进行分析并给出解决办法,有需要的朋友可参考一下. 错误代码 1045 Access denied for user 'root'@'localhost' (using password:YES) 解决办法是重新设置root用户密码,

项目部署到tomcat6.0启动成功后访问页面报500错误解决方法

如题:项目部署到tomcat6.0启动成功后访问页面报500错误解决方法,很奇葩,启动的时候没有任何问题,但输入访问地址后报500,去年国庆放假前夕,为这个问题伤神了半天最后解决了,今天又碰到了,乍一看摸不着头,后面仔细回想了下,迅速解决了问题. 原因:项目里面的jar和tomcat里面lib里面的jar重复了. 解决方法: 1.要么更换tomcat7或之后的版本,之后的版本就不会出现这个问题. 2.去部署之后的tomcat的webapps\项目名\WEB-INF\lib 里面删掉jsp-api

error at ::0 can&#39;t find referenced pointcut pointCutName 错误解决方法

Caused by: org.springframework.beans.factory.BeanCreationException: Could not autowire method: public final void org.mybatis.spring.support.SqlSessionDaoSupport.setSqlSessionTemplate(org.mybatis.spring.SqlSessionTemplate); nested exception is java.la

apache指定的网络名不再可用错误解决方法

系统平台:  window server 2003  R2 service Pack 2 网站服务器环境:wamp [ apache:2.4.4 ]; 问题描述:服务器工作一点时间就出现假死状态,网站无法访问.查看apache错误日志出现如下错误: 在google上找到如下系列文章:http://jingyan.baidu.com/article/154b4631a9d5b828ca8f4198.html http://hi.baidu.com/h_appy/item/ed13fb2ad0fa2

GoldenGate 1403错误解决方法

OGG  oracle goldengate 1403错误解决方法 1. 错误描述WARNING OGG-01154 Oracle GoldenGate Delivery for Oracle, repyxb.prm: SQL error 1403 mapping SGPM.P_SMS_SEND to SGPM.P_SMS_SEND.WARNING OGG-01003 Oracle GoldenGate Delivery for Oracle, repyxb.prm:  Repositionin

ORA-01157 错误解决方法

对Oracle 11g数据库进行数据迁移时出现如下错误: ORA-01157: cannot identify/lock data file 1 - see DBWR trace file ORA-01110: data file 1: 'F:\ORACLE\SID\SAPDATA1\SYSTEM_1\SYSTEM.DATA1' 说明已经很清楚了,直接查看相关的错误解决方法: http://www.eygle.com/pdf/Ora-1157.Error.Correct.pdf 如果连接打不开可

linux上的mysql报Table &#39;xxx&#39; doesn&#39;t exist的错误解决方法

linux上的mysql报Table 'xxx' doesn't exist的错误解决方法 问题:程序报Table 'xxx' doesn't exist 的错误,但是查看数据库发现该表已经存在且字母也没有拼错. 原因:linux 上的mysql 默认是区分大小写导致的. 解决:改动mysql的配置文件,在my.cnf中的[mysqld]下面(位置不能错)加上lower_case_table_name=1这句(1表示不区分大小写,0区分大小写),保存重新启动mysql. 没有my.cnf文件,如

使用ZjDroid时出现了R.java不存在的错误解决方法

ZjDroid是什么? 请看这篇文章: Android动态逆向分析工具ZjDroid--脱壳神器 今天第一次使用这个的时候出现了下图所示的错误: 提示:import com.android.reverse.R;没有这个类 之后clean了之后再从新build还是没有出现,gen文件夹下依然没有R.java这个文件. 之后选择Android tools 选择fix project properties之后还是没有效果. 试了一天仍然没有解决,之后我跟新了一下Android SDK tools,之前