`
java_xiaoyi
  • 浏览: 48637 次
  • 性别: Icon_minigender_1
  • 来自: 木木乃州
社区版块
存档分类
最新评论

如何解决ORA-04031 错误

阅读更多
今天在做项目的时候,因为改了远程访问的IP,所以一直在报如下的错误:
ORA-04031: 无法分配 4096 字节的共享内存 ("shared pool","select user#,type# from
user...","Typecheck heap","kgghteInit")

百度了下。搜到如下解决方案:
1.ORACLE BUG
Oracle推荐对你的系统打上最新的PatchSet。大多数的ORA-04031错误都和BUG 相关,可以通过使用这些补丁来避免。

下面表中总结和和这个错误相关的最常见的BUG、可能的环境和修补这个问题的补丁。

BUG 描述  Workaround Fixed
<Bug:1397603> ORA-4031/SGA memory leak of PERMANENT memory occurs for buffer handles  _db_handles_cached = 0  901/ 8172 
<Bug:1640583> ORA-4031 due to leak / cache buffer chain contention from AND-EQUAL access Not available 8171/901
<Bug:1318267> INSERT AS SELECT statements may
not be shared when they should be
if TIMED_STATISTICS. It can lead to ORA-4031 _SQLEXEC_PROGRESSION_COST=0
8171/8200
<Bug:1193003> Cursors may not be shared in 8.1
when they should be Not available 8162/8170/ 901
<Bug:2104071>  ORA-4031/excessive "miscellaneous" shared pool usage possible. (many PINS) None-> This is known to affect the XML parser.  8174, 9013, 9201
<Note:263791.1>  Several number of BUGs related to ORA-4031 erros were fixed in the 9.2.0.5 patchset Not available 9205


编译Java代码时出现的ORA-4031
在你编译Java代码的时候如果内存溢出,你会看到错误:

A SQL exception occurred while compiling: :
ORA-04031: unable to allocate bytes of shared memory
("shared pool","unknown object","joxlod: init h", "JOX: ioc_allocate_pal")
解决办法是关闭数据库然后把参数 JAVA_POOL_SIZE 设定为一个较大的值。这里错误信息中提到的 "shared pool" 其实共享全局区(SGA)溢出的误导,并不表示你需要增加SHARED_POOL_SIZE,相反,你必须加大 JAVA_POOL_SIZE 参数的值,然后重启动系统,再试一下。参考: <Bug:2736601> 。


小的共享池尺寸
很多情况下,共享池过小能够导致ORA-04031错误。下面信息有助于你调整共享池大小:

库高速缓冲命中率
命中率有助于你衡量共享池的使用,有多少语句需要被解析而不是重用。下面的SQL语句有助于你计算库高速缓冲的命中率:

SELECT SUM(PINS) "EXECUTIONS",
            SUM(RELOADS) "CACHE MISSES WHILE EXECUTING"
            FROM V$LIBRARYCACHE;
如果丢失超过1%,那么尝试通过加大共享池的大小来减少库高速缓冲丢失。

共享池大小计算
要计算最适合你工作负载的共享池大小,请参考:

<Note:1012046.6>: HOW TO CALCULATE YOUR SHARED POOL SIZE.
共享池碎片
每一次,需要被执行的SQL 或者PL/SQL 语句的解析形式载入共享池中都需要一块特定的连续的空间。数据库要扫描的第一个资源就是共享池中的空闲可用内存。一旦空闲内存耗尽,数据库要查找一块已经分配但还没使用的内存准备重用。如果这样的确切尺寸的大块内存不可用,就继续按照如下标准寻找:

大块(chunk)大小比请求的大小大
空间是连续的
大块内存是可用的(而不是正在使用的)
这样大块的内存被分开,剩余的添加到相应的空闲空间列表中。当数据库以这种方式操作一段时间之后,共享池结构就会出现碎片。

当共享池存在碎片的问题,分配一片空闲的空间就会花费更多的时间,数据库性能也会下降(整个操作的过程中,"chunk allocation"被一个叫做"shared pool latch" 的闩所控制) 或者是出现 ORA-04031 错误errors (在数据库不能找到一个连续的空闲内存块的时候)。

参考 <Note:61623.1>: 可以得到关于共享池碎片的详细讨论。
如果SHARED_POOL_SIZE 足够大,大多数的 ORA-04031 错误都是由共享池中的动态SQL 碎片导致的。可能的原因如下:
非共享的SQL
生成不必要的解析调用 (软解析)
没有使用绑定变量
要减少碎片的产生你需要确定是前面描叙的几种可能的因素。可以采取如下的一些方法,当然不只局限于这几种: 应用调整、数据库调整或者实例参数调整。

请参考 <Note:62143.1>,描述了所有的这些细节内容。这个注释还包括了共享池如何工作的细节。
下面的视图有助于你标明共享池中非共享的SQL/PLSQL:

V$SQLAREA 视图
这个视图保存了在数据库中执行的SQL 语句和PL/SQL 块的信息。下面的SQL 语句可以显示给你带有literal 的语句或者是带有绑定变量的语句:

SELECT   SUBSTR (sql_text, 1, 40) "SQL", COUNT (*),
         SUM (executions) "TotExecs"
    FROM v$sqlarea
   WHERE executions < 5
GROUP BY SUBSTR (sql_text, 1, 40)
  HAVING COUNT (*) > 30
ORDER BY 2;
注: Having 后的数值 "30" 可以根据需要调整以得到更为详细的信息。

X$KSMLRU 视图
这个固定表x$ksmlru 跟踪共享池中导致其它对象换出(age out)的应用。这个固定表可以用来标记是什么导致了大的应用。

如果很多对象在共享池中都被阶段性的刷新可能导致响应时间问题并且有可能在对象重载入共享池中的时候导致库高速缓冲闩竞争问题。

关于这个x$ksmlru 表的一个不寻常的地方就是如果有人从表中选取内容这个表的内容就会被擦除。这样这个固定表只存储曾经发生的最大的分配。这个值在选择后被重新设定这样接下来的大的分配可以被标记,即使它们不如先前的分配过的大。因为这样的重置,在查询提交后的结果不可以再次得到,从表中的输出的结果应该小心的保存。监视这个固定表运行如下操作:

SELECT * FROM X$KSMLRU WHERE ksmlrsiz > 0;
这个表只可以用SYS用户登录进行查询。

X$KSMSP 视图 (类似堆Heapdump信息)
使用这个视图能找出当前分配的空闲空间,有助于理解共享池碎片的程度。如我们在前面的描述,查找为游标分配的足够的大块内存的第一个地方是空闲列表( free list)。 下面的语句显示了空闲列表中的大块内存:

SELECT   '0 (<140)' bucket, ksmchcls, 10 * TRUNC (ksmchsiz / 10) "From",
         COUNT (*) "Count", MAX (ksmchsiz) "Biggest",
         TRUNC (AVG (ksmchsiz)) "AvgSize", TRUNC (SUM (ksmchsiz)) "Total"
    FROM x$ksmsp
   WHERE ksmchsiz < 140 AND ksmchcls = 'free'
GROUP BY ksmchcls, 10 * TRUNC (ksmchsiz / 10)
UNION ALL
SELECT   '1 (140-267)' bucket, ksmchcls, 20 * TRUNC (ksmchsiz / 20),
         COUNT (*), MAX (ksmchsiz), TRUNC (AVG (ksmchsiz)) "AvgSize",
         TRUNC (SUM (ksmchsiz)) "Total"
    FROM x$ksmsp
   WHERE ksmchsiz BETWEEN 140 AND 267 AND ksmchcls = 'free'
GROUP BY ksmchcls, 20 * TRUNC (ksmchsiz / 20)
UNION ALL
SELECT   '2 (268-523)' bucket, ksmchcls, 50 * TRUNC (ksmchsiz / 50),
         COUNT (*), MAX (ksmchsiz), TRUNC (AVG (ksmchsiz)) "AvgSize",
         TRUNC (SUM (ksmchsiz)) "Total"
    FROM x$ksmsp
   WHERE ksmchsiz BETWEEN 268 AND 523 AND ksmchcls = 'free'
GROUP BY ksmchcls, 50 * TRUNC (ksmchsiz / 50)
UNION ALL
SELECT   '3-5 (524-4107)' bucket, ksmchcls, 500 * TRUNC (ksmchsiz / 500),
         COUNT (*), MAX (ksmchsiz), TRUNC (AVG (ksmchsiz)) "AvgSize",
         TRUNC (SUM (ksmchsiz)) "Total"
    FROM x$ksmsp
   WHERE ksmchsiz BETWEEN 524 AND 4107 AND ksmchcls = 'free'
GROUP BY ksmchcls, 500 * TRUNC (ksmchsiz / 500)
UNION ALL
SELECT   '6+ (4108+)' bucket, ksmchcls, 1000 * TRUNC (ksmchsiz / 1000),
         COUNT (*), MAX (ksmchsiz), TRUNC (AVG (ksmchsiz)) "AvgSize",
         TRUNC (SUM (ksmchsiz


现把原文链接放上:http://www.dbanotes.net/Oracle/Ora-04031.htm
有兴趣的朋友可以去看看。
分享到:
评论

相关推荐

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

    1. 通过调整SHARED_POOL_SIZE、SHARED_POOL_RESERVED_SIZE和SHARED_POOL_RESERVED_MIN_ALLOC三个参数来解决ORA-04031错误。 2. 通过查询V$SHARED_POOL_RESERVED视图来确定ORA-04031错误是否由共享池保留空间中的碎片...

    如何解决Oracle 常见错误 ORA-04031(PDF)

    在深入探讨如何解决ORA-04031错误之前,我们需要先了解几个与共享池(`shared pool`)密切相关的Oracle实例参数: 1. **`SHARED_POOL_SIZE`**:此参数定义了共享池的总大小。可以设置为具体数值(例如1024),也可以...

    ORA-04031故障分析处理

    解决ORA-04031错误通常涉及调整参数,优化内存分配策略,以及监控和分析数据库的运行状况。在ASM实例中,由于其特殊性,可能需要更大的共享池大小来满足存储管理和查询的需求。在调整参数时,应谨慎操作并进行充分的...

    ora-00604错误解决方法

    ora-00604 错误 解决 方法 ora-00604 错误 解决 方法 ora-00604 错误 解决 方法 ora-00604 错误 解决 方法 ora-00604 错误 解决 方法ora-00604 错误 解决 方法

    如何解决Oracle数据库中的04031错误

    总之,解决ORA-04031错误需要深入理解Oracle内存管理机制,仔细诊断问题所在,并采取适当的调整措施。这可能涉及参数调整、SQL优化以及对数据库整体架构的审查。通过以上步骤,可以有效地避免和解决这种常见的Oracle...

    使用工具IMPDP导入数据时ORA-39002、ORA-39070错误排查

    通过以上步骤,可以有效地排查并解决使用IMPDP工具导入数据时遇到的ORA-39002和ORA-39070错误。这些错误主要与目录设置、权限管理以及路径配置有关。确保所有相关的目录和文件都具有正确的权限,并且路径设置正确...

    创建物化视图ORA-12014错误解决方法

    针对上述原因,我们可以采取以下措施来解决ORA-12014错误: 1. **检查基表结构**: - 确认基表是否定义了主键或唯一索引。 - 如果没有合适的唯一标识符,考虑添加一个合适的唯一索引或主键。 2. **调整列类型**...

    Oracle 10g启动后报ORA-16038错误的解决方法

    为了解决ORA-16038和ORA-19809错误,可以采取以下步骤: ##### 步骤一:调整恢复文件目的地大小 由于ORA-19809错误提示达到恢复文件目的地大小的限制,首先需要调整`DB_RECOVERY_FILE_DEST_SIZE`参数来扩大存储...

    ora-01460 错误原因分析

    ### ORA-01460 错误原因分析 ...通过以上步骤的检查和调整,通常可以解决大部分由ORA-01460错误引起的数据库操作问题。需要注意的是,在进行任何更改之前,最好先备份相关配置和数据,以免出现意外情况。

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

    通过以上方法,我们可以有效地解决ORA-29275错误,并提高Oracle数据库的整体稳定性和数据完整性。需要注意的是,在实际操作过程中,应当根据具体情况选择最适合的解决方案。例如,在某些情况下,调整字段长度可能是...

    Oracle 11gr2连Oracle 19c 报ORA-28040 ORA-01017解决方法.pdf

    通过修改服务端和客户端的配置文件,以及重启服务端计算机,可以有效解决ORA-28040和ORA-01017这两个特定的错误。此外,文中还介绍了Oracle数据库在不同版本间进行配置和通信时所涉及的一些关键配置文件和参数设置。

    ORACLE ORA-00132 ORA-00214

    ### Oracle 错误 ORA-00132 和 ORA-00214 解析及处理 #### 一、错误概述 在Oracle数据库管理过程中,遇到ORA-00132和ORA-00214这类错误时,往往意味着数据库配置或启动过程中出现了问题。下面将对这两个错误进行...

    数据库ORA-01460错误的解决方法

    虽然这不是直接解决ORA-01460错误的方法,但通过合理配置工具和环境,可以更高效地进行数据库管理和数据转换工作,间接降低错误发生的概率。 总之,面对ORA-01460错误,关键在于理解错误背后的逻辑,采取合适的数据...

    离线误删空间文件导致的ORA-01033及ORA-01145问题的解决办法

    解决ORA-01033错误通常需要定位具体的原因并采取相应的措施,常见的解决步骤包括: 1. **检查数据文件状态**:确保所有数据文件都完好无损且可用。 2. **重建控制文件**:如果控制文件损坏,可以通过备份控制文件...

    关于WIN10系统配置了环境变量后oracle instant client后依然提示ORA-01019错误的解决方案

    关于WIN10系统使用oracle instant client 时候提示ORA-01019错误的解决方案,本方案是配置好环境变量后依然提示ORA-01019错误的解决方案,内附本人制作测试的全过程说明

    Oracle SQL Developer连接报错(ORA-12505)的解决方案(两种)

    用oracle数据库新建连接时遇到ora-12505,此问题解决后又出现ora-12519错误,郁闷的半天,经过一番折腾问题解决,下面小编把我的两种解决方案分享给大家,仅供参考。  解决方案一: 今天工作时在新建连接的时候遇到...

    ora-28056解决方法

    清除事件日志可以释放事件日志的空间,允许Oracle数据库写入新的审核记录,解决ora-28056错误。 ora-28056错误的影响: ora-28056错误会导致数据库不可用,无法连接到数据库。这将对业务运作产生严重的影响,例如...

    ORACLE8I数据库应用EXP工具时ORA-06553报错的解决方法.pdf

    要解决ORA-06553报错,需要正确地配置EXP工具的参数,并确保同义词的定义正确。具体来说,需要检查EXP工具的参数是否正确,确保同义词的定义正确,并且确保Oracle数据库的JAVA工具被正确安装。 知识点4:EXP工具的...

    ora-227101错误解决办法

    下面将详细解析“ORA-27101: shared memory realm does not exist”这一错误及其解决办法,同时提及可能伴随的“ORA-01034: ORACLE not available”和“ORA-01033: ORACLE initialization or shutdown in progress”...

Global site tag (gtag.js) - Google Analytics