学习oracle技术,每天学一点,每天进步一点

ora-04030 错误

上一篇 / 下一篇  2008-03-20 08:34:52 / 个人分类:数据库维护

昨天晚上在测试机器上运行插入数据语句时,语句如下:
目前tb_test的数量级为4千万
begin
!?g4`(F6?(v'h@1}!l.jv0 for i in 1..100 loopITPUB个人空间7Q!H!v&` @o-E
  insert into tb_test  select * from tb_test
e'I%uBF&p)](LfK0  commit;ITPUB个人空间;w5z X8v DpxzC
 end loop;
FzN r'\8c V0end;
到今天早上过来上班时看到以下错误 
ORA-00603 ORACLE server session terminated by fatal errorITPUB个人空间F'om2FA+GJ"b
然后查看ORA-00603 的错误代码解释
Cause: An Oracle Server session is in an unrecoverable state.
Action: Log in to Oracle again so a new server session will be created automatically. Examine the session trace file for more information.
 
然后在数据库udump目录下找到了一个跟踪文件记录内容如下:
*** 2008-03-19 21:10:12.360ITPUB个人空间U7r"G?'d-]V
ksedmp: internal or fatal errorITPUB个人空间c9} E0HL S
ORA-04030: out of process memory when trying to allocate 536 bytes (callheap,kcbtmal allocation)
%`9O mZ|0ORA-04030: out of process memory when trying to allocate 536 bytes (callheap,kcbtmal allocation)ITPUB个人空间ax/dUi
Current SQL statement for this session:ITPUB个人空间rz?5C7r!L2[[1B
update seq$ set increment$=:2,minvalue=:3,maxvalue=:4,cycle#=:5,order$=:6,cache=:7,highwater=:8,audit$=:9,flags=:10 where obj#=:1
k,lT*QN(qNsry0----- PL/SQL Call Stack -----ITPUB个人空间;A'QBlS-p@
  object      line  object
do*e OSHP0  handle    number  name
s(sT#X_t00x10835f318         2  GR_TEST.T_TB_CLIENT_WIN_LOST_REPORT
Pl`|/ttn00x1019cdf78         3  anonymous blockITPUB个人空间1Z? ui$K-G upXr
----- Call Stack Trace -----ITPUB个人空间)S+g3g4AY*M8Xf B
calling              call     entry                argument values in hex     ITPUB个人空间Qv:k F"y
location             type     point                (? means dubious value)    ITPUB个人空间N!PA1VjPIaL @
-------------------- -------- -------------------- ----------------------------ITPUB个人空间\(A%O X"l
ksedmp()+226         call     ksedst()             000000000 ? 000000000 ?
0hO*zen~)vF*O0                                                   10BC54F537F77FD0 ?ITPUB个人空间R"K(C;s9z|*@"w j
                                                   000000000 ? 000064602 ?ITPUB个人空间2V8q@guD
                                                   04757D9EC ?ITPUB个人空间pv7l"i"Y#c vUv
ksupop()+857         call     ksedmp()             000000003 ? 000000000 ?
X5b| c*IFtD&r^(y8t0                                                   10BC54F537F77FD0 ?
vN!IR~Iw6c K]0                                                   000000000 ? 000064602 ?ITPUB个人空间$t`1wbcO
                                                   04757D9EC ?
~ imv+}.c-c0opiodr()+2227        call     ksupop()             000000002 ? 000000000 ?
 
主要原因在sql上,目前猜测是:因为没有写where条件,导致大量数据往内存中放,导致内存空间不足,而触发这个错误
 
下面是转载ora-04031 错误的所有原因和解决方法
 
19/11/2004 17:42 FPITPUB个人空间J2Ntkh.q9H0X4K
04031直接原因是shared_pool的碎片所致,临时应急的话可以发出以下命令:
;L1C-OgC0alter system flush shared_pool;
1Q%YWe-}'k[Gr0解决办法:ITPUB个人空间F*C5Nl+~W4zx
1.有类似的bug补丁,找到它,打上它;ITPUB个人空间g { lU-w4L
2.调整部分参数,如cursor_sharing为force(8i下)或similar(9i下),可以加大shared_pool_size参数值 ,但不要过大,同时考虑加大shared_pool_reserved_size参数值,还有可参考如下:
ITPUB个人空间:R%rEM4y_:N%j

04031直接原因是shared_pool的碎片所致,临时应急的话可以发出以下命令:ITPUB个人空间0PX&P4@iS-l3G
alter system flush shared_pool;ITPUB个人空间 ~;b"f Yv S(x9?
解决办法:ITPUB个人空间o}:IC$ZE:Q?
1.有类似的bug补丁,找到它,打上它;ITPUB个人空间j3F2h2H}6v\
2.调整部分参数,如cursor_sharing为force(8i下)或similar(9i下),可以加大shared_pool_size参数值 ,但不要过大,同时考虑加大shared_pool_reserved_size参数值,还有可参考如下:ITPUB个人空间a ?$~W?.J
Cause: More shared memory is needed than was allocated in the shared pool.ITPUB个人空间vKQv}Md1Sd
Action: If the shared pool is out of memory, either use the DBMS_SHARED_ POOL package to pin large packages, reduce your use of shared memory, or increase the amount of available shared memory by increasing the value of the initialization parameters SHARED_POOL_RESERVED_SIZE and SHARED_ POOL_SIZE. If the large pool is out of memory, increase the initialization parameter LARGE_POOL_SIZE.
mp+q E\N0最有可能的原因:你们使用的是mts方式,但是large pool才4M,导致4031
iz S+v&z5G1]Ph0很有可能的原因:应用程序没有使用bind variable绑定变量(),导致share poo到了一定时间就用光了,于是开始刷新,又由于share pool实在太大,导致down机ITPUB个人空间.u'?d0O)MF&J B$d
比较有可能的原因,oracle内存泄漏,打patch试试看?
(b%LX h"Kw4tz}C0最后,8得8指出,2G的shared pool,是我有史以来见到的最疯狂的配置,200M已经算多得了。ITPUB个人空间!wE#Cy8BCH l!] }*l
1.楼主是否使用MTS?如果不使用,large pool 设置为几十M就可以了 2.shared_pool 你设置的太大了, shared_pool 设置大的话,会出现 latch 争用的现象,尤其的是在8i 中,建议在 1.5G 一下(我的经验),9i没有这个问题,因为9i的 latch 是自动管理的,8i需要自己调整。 2.看看v$sql 中是不是有很多相似的sql,如果有的话,建议进行sql参数话,减少shared pool 的碎片。 3.你的 shared_pool_reserved_size 已经够大了,应该不用修改 4.你可以添加一个 job ,每隔几天,在业务不忙的时候,执行 alter system flush shared_pool,清理一下 shared pool 中的碎片。ITPUB个人空间y.G Ar4O6m_
ref:biti_rainy= 4030 不是 4031 ! 4031 是 DB 内部的分配 4030 是 os 上内存的分配
v:Obi2D+z C0ORA-04030 out of process memory when trying to allocate string bytes (string,string)
6Ml(a-@0HK+hZ0Cause: Operating system process private memory has been exhausted.
~T's)h,U\l,x"s0Action: See the database administrator or operating system administrator to increase process memory quota. There may be a bug in the application that causes excessive allocations of process memory space.
bY CeoLC6bI3L0ORA-04031 unable to allocate string bytes of shared memory ("string","string","string","string")ITPUB个人空间vW-nasm4b
Cause: More shared memory is needed than was allocated in the shared pool.ITPUB个人空间yH/E*h3z)kQp
Action: If the shared pool is out of memory, either use the DBMS_SHARED_ POOL package to pin large packages, reduce your use of shared memory, or increase the amount of available shared memory by increasing the value of the initialization parameters SHARED_POOL_RESERVED_SIZE and SHARED_ POOL_SIZE. If the large pool is out of memory, increase the initialization parameter LARGE_POOL_SIZE.

Ref:http://www.dbanotes.net/Oracle/Ora-04031.htm

诊断并解决ORA-04031 错误

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

当这个错误出现的时候你得到的错误解释信息类似如下:

04031, 00000, "unable to allocate %s bytes of shared memory ("%s","%s","%s","%s")" 
// *Cause: More shared memory is needed than was allocated in the shared 
// pool. 
// *Action: If the shared pool is out of memory, either use the 
// dbms_shared_pool package to pin large packages, 
// reduce your use of shared memory, or increase the amount of 
// available shared memory by increasing the value of the 
// INIT.ORA parameters "shared_pool_reserved_size" and 
// "shared_pool_size". 
// If the large pool is out of memory, increase the INIT.ORA 
// parameter "large_pool_size".

1.共享池相关的实例参数

在继续之前,有必要理解下面的实例参数:

  • SHARED_POOL_SIZEITPUB个人空间7H [*Wwg XL"`\
    这个参数指定了共享池的大小,单位是字节。可以接受数字值或者数字后面跟上后缀"K" 或 "M" 。"K"代表千字节, "M"代表兆字节。
  • SHARED_POOL_RESERVED_SIZEITPUB个人空间nKaF:H
    指定了为共享池内存保留的用于大的连续请求的共享池空间。当共享池碎片强制使 Oracle 查找并释放大块未使用的池来满足当前的请求的时候,这个参数和SHARED_POOL_RESERVED_MIN_ALLOC 参数一起可以用来避免性能下降。
  • 这个参数理想的值应该大到足以满足任何对保留列表中内存的请求扫描而无需从共享池中刷新对象。既然操作系统内存可以限制共享池的大小,一般来说,你应该设定这个参数为 SHARED_POOL_SIZE 参数的 10% 大小。
  • SHARED_POOL_RESERVED_MIN_ALLOC 这个参数的值控制保留内存的分配。如果一个足够尺寸的大块内存在共享池空闲列表中没能找到,内存就从保留列表中分配一块比这个值大的空间。默认的值对于大多数系统来说都足够了。如果你加大这个值,那么Oracle 服务器将允许从这个保留列表中更少的分配并且将从共享池列表中请求更多的内存。这个参数在Oracle 8i 和更高的版本中是隐藏的。提交如下的语句查找这个参数值:
    SELECT   nam.ksppinm NAME, val.ksppstvl VALUE
        FROM x$ksppi nam, x$ksppsv val
       WHERE nam.indx = val.indx AND nam.ksppinm LIKE '%shared%'
    ORDER BY 1;
    10g 注释:Oracle 10g 的一个新特性叫做 "自动内存管理" 允许DBA保留一个共享内存池来分shared pool,buffer cache, java pool 和large pool。一般来说,当数据库需要分配一个大的对象到共享池中并且不能找到连续的可用空间,将自动使用其他SGA结构的空闲空间来增加共享池的大小 。既然空间分配是Oracle自动管理的,ora-4031出错的可能性将大大降低。自动内存管理在初始化参数SGA_TARGET大于0的时候被激活。当前设定可以通过查询v$sga_dynamic_components 视图获得。请参考10g管理手册以得到更多内容 。

2.诊断ORA-04031 错误

注:大多数的常见的 ORA-4031 的产生都和 SHARED POOL SIZE 有关,这篇文章中的诊断步骤大多都是关于共享池的。 对于其它方面如Large_pool或是Java_pool,内存分配算法都是相似的,一般来说都是因为结构不够大造成。

ORA-04031 可能是因为 SHARED POOL 不够大,或是因为碎片问题导致数据库不能找到足够大的内存块。

ORA-04031 错误通常是因为库高速缓冲中或共享池保留空间中的碎片。 在加大共享池大小的时 候考虑调整应用,使用共享的SQL 并且调整如下的参数:

SHARED_POOL_SIZE,
SHARED_POOL_RESERVED_SIZE,
SHARED_POOL_RESERVED_MIN_ALLOC.

首先判定是否ORA-04031 错误是由共享池保留空间中的库高速缓冲的碎片产生的。提交下的查询:

SELECT free_space, avg_free_size,used_space, avg_used_size, request_failures,
       last_failure_size
  FROM v$shared_pool_reserved;

如果:

REQUEST_FAILURES > 0 并且 LAST_FAILURE_SIZE > SHARED_POOL_RESERVED_MIN_ALLOC

那么ORA-04031 错误就是因为共享池保留空间缺少连续空间所致。要解决这个问题,可以考虑加大SHARED_POOL_RESERVED_MIN_ALLOC 来降低缓冲进共 享池保留空间的对象数目,并增大 SHARED_POOL_RESERVED_SIZE 和 SHARED_POOL_SIZE 来加大共享池保留空间的可用内存。

如果:

REQUEST_FAILURES > 0 并且 LAST_FAILURE_SIZE < SHARED_POOL_RESERVED_MIN_ALLOC

或者

REQUEST_FAILURES 等于0 并且 LAST_FAILURE_SIZE < SHARED_POOL_RESERVED_MIN_ALLOC

那么是因为在库高速缓冲缺少连续空间导致ORA-04031 错误。

第一步应该考虑降低SHARED_POOL_RESERVED_MIN_ALLOC 以放入更多的对象到共享池保留空间中并且加大SHARED_POOL_SIZE。

3.解决ORA-04031 错误

  • ORACLE BUG

    Oracle推荐对你的系统打上最新的PatchSet。大多数的ORA-04031错误都和BUG 相关,可以通过使用这些补丁来避免。

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

    BUG描述WorkaroundFixed
    <Bug:1397603>ORA-4031/SGA memory leak of PERMANENT memory occurs for buffer handles_db_handles_cached = 0901/ 8172
    <Bug:1640583>ORA-4031 due to leak / cache buffer chain contention from AND-EQUAL accessNot available8171/901
    <Bug:1318267>INSERT AS SELECT statements mayITPUB个人空间D[iq!Zv
    not be shared when they should beITPUB个人空间/Bf}s2xEv
    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
    %z)Zvz6P/S.\4a0when they should be
    Not available8162/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 patchsetNot available9205
  • 编译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)) "Total"
          FROM x$ksmsp
         WHERE ksmchsiz >= 4108 AND ksmchcls = 'free'
      GROUP BY ksmchcls, 1000 * TRUNC (ksmchsiz / 1000);

4. ORA-04031 错误与 Large Pool

大池是个可选的内存区,为以下的操作提供大内存分配:

  • MTS会话内存和 Oracle XA 接口
  • Oracle 备份恢复操作和I/O服务器进程用的内存(缓冲)
  • 并行执行消息缓冲

大池没有LRU列表。这和共享池中的保留空间不同,保留空间和共享池中其他分配的内存使用同样的LRU列表。大块内存从不会换出大池中,内存必须是显式的被每个会话分配并释放。一个请求如果没有足够的内存,就会产生类似这样的一个ORA-4031错误:

ORA-04031: unable to allocate XXXX bytes of shared memory 
("large pool","unknown object","session heap","frame")

这个错误发生时候可以检查几件事情:

  • 1- 使用如下语句检查 V$SGASTAT ,得知使用和空闲的内存:
    SELECT pool,name,bytes FROM v$sgastat where pool = 'large pool';
  • 2- 你还可以采用 heapdump level 32 来 dump 大池的堆并检查空闲的大块内存的大小

    从大池分配的内存如果是LARGE_POOL_MIN_ALLOC 子节的整块数有助于避免碎片。任何请求分配小于LARGE_POOL_MIN_ALLOC 大块尺寸都将分配LARGE_POOL_MIN_ALLOC的大小。一般来说,你会看到使用大池的时候相对共享池来说要用到更多的内存。通常要解决大池中的ORA-4031错误必须增加 LARGE_POOL_SIZE 的大小。

5. ORA-04031 和共享池刷新


4\ pGm3u.C0有一些技巧会提高游标的共享能力,从而共享池碎片和ORA-4031都会减少。最佳途径是调整应用使用绑定变量。另外在应用不能调整的时候考虑使用CURSOR_SHARING参数和FORCE不同的值来做到 (要注意那会导致执行计划改变,所以建议先对应用进行测试)。当上述技巧都不可以用的时候,并且碎片问题在系统中比较严重,刷新共享持可能有助于减轻碎片问题。但是,必须加以如下考虑:

  • 刷新将导致所有没被使用的游标从共享池删除。这样,在共享池刷新之后,大多数SQL和PL/SQL游标必须被硬解析。这将提高CPU的使用,也会加大Latch的活动。
  • 当应用程序没有使用绑定变量并被许多用户进行类似的操作的时候(如在OLTP系统中) ,刷新之后很快还会出现碎片问题。所以共享池对设计糟糕的应用程序来说不是解决办法。
  • 对一个大的共享池刷新可能会导致系统挂起,尤其是实例繁忙的时候,推荐在非高峰的时候刷新

6. ORA-04031错误的高级分析

如果前述的这些技术内容都不能解决ORA-04031 错误,可能需要额外的跟踪信息来得到问题发生的共享池的快照。

调整init.ora参数添加如下的事件得到该问题的跟踪信息:

event = "4031 trace name errorstack level 3" 
event = "4031 trace name HEAPDUMP level 3"

如果问题可重现,该事件可设定在会话层,在执行问题语句之前使用如下的语句:

SQL> alter session set events '4031 trace name errorstack level 3'; 
SQL> alter session set events '4031 trace name HEAPDUMP level 3';

把这个跟踪文件发给Oracle支持人员进行排错。

重要标注: Oracle 9.2.0.5 和Oracle 10g 版本中,每次在发生ORA-4031 错误的时候会自动创建一个跟踪文件,可以在user_dump_dest 目录中找到。如果你的系统是上述的版本,你不需要再进行前面描述中的步骤。


-j"E9^:y,KR0

TAG:

paul oracle my love 引用 删除 paulyibinyi   /   2008-03-25 12:23:46
原帖由shiri512003于2008-03-25 11:20:54发表
4030==4031??
Subject: How to Resolve ORA-4030 Errors on UNIX
Doc ID: Note:199746.1 Type: BULL


谢谢指正 和提供ora-04030 解决方法
引用 删除 shiri512003   /   2008-03-25 11:20:54
4030==4031??
Subject: How to Resolve ORA-4030 Errors on UNIX
Doc ID: Note:199746.1 Type: BULLETIN
Last Revision Date: 03-OCT-2006 Status: PUBLISHED
PURPOSE
=======
Provide assistance in resolving ORA-4030 errors on UNIX systems.
SCOPE & APPLICATION
===================
This document is useful for DBA's and System Administrators tasked with
resolving an ORA-4030 error.

BACKGROUND
==========
The ORA-4030 error is caused when an Oracle process(while doing work on behalf
of a client program) requests additional memory from the operating system, but
the operating system cannot accommodate the request. This can occur because the
operating system does not have enough physical memory or swap available for the
process, the OS is configured to limit the amount of memory available for UNIX
processes or an actual Oracle BUG has been encountered.

HOW TO RESOLVE THE ORA-4030
===========================
1. Reduce the PGA (Program Global Area) for the client process encountering the
error. This is valid if the database is not configured with MTS (Multi Threaded
Server) or Shared Servers.

For Oracle 8i and below the major portion of ORA-4030 instances can be solved by
reducing the SORT_AREA_SIZE for the sessions. This will lessen the demand that the process places on physical memory. SORT_AREA_SIZE can be modified by the'alter session' command but persistent changes must be recorded in the init.ora. See the Oracle Reference guide available on your Online Generic Documentation CD-ROM for more information on the 'sort_area_size' parameter.

For Oracle 9i and up, the PGA can be sized using the PGA_AGGREGATE_TARGET
parameter set in the init.ora or spfile.ora (See Note 153367.1 and Note 146577.1).

2. Increase the amount of memory a UNIX process can request and use from the
operating system. This usually refers to stack and/or data size UNIX process
resource limits.

This process varies slightly depending on the UNIX platform and the type of
UNIX shell you are using. Generally speaking either the 'limit' or 'ulimit'
command will allow your System Administrator to increase memory and data size limits
 

评分:0

我来说两句

显示全部

:loveliness: :handshake :victory: :funk: :time: :kiss: :call: :hug: :lol :'( :Q :L ;P :$ :P :o :@ :D :( :)

日历

« 2008-09-05  
 123456
78910111213
14151617181920
21222324252627
282930    

数据统计

  • 访问量: 16117
  • 日志数: 277
  • 图片数: 2
  • 建立时间: 2007-12-11
  • 更新时间: 2008-09-03

RSS订阅

Open Toolbar