ORA-7445(xsStkPurge)错误

客户数据库出现ORA-7445(xsStkPurge)错误。
数据库告警日志出现如下的错误信息:

Fri Aug 3 17:10:03 2012
Errors IN file /ora/app/oracle/admin/ORCL/udump/orcl_ora_23101.trc:
ORA-07445: exception encountered: core dump [xsStkPurge()+73] [SIGSEGV] [Address NOT mapped TO object] [0x0] [] []
ORA-04030: OUT OF process memory WHEN trying TO allocate 8184 bytes (OLAP stack hea,OLAP Stack Seg)
Fri Aug 3 17:10:19 2012
Errors IN file /ora/app/oracle/admin/ORCL/udump/orcl_ora_23101.trc:
ORA-04030: OUT OF process memory WHEN trying TO allocate 8156 bytes (callheap,kdbmal allocation)
ORA-07445: exception encountered: core dump [xsStkPurge()+73] [SIGSEGV] [Address NOT mapped TO object] [0x0] [] []
ORA-04030: OUT OF process memory WHEN trying TO allocate 8184 bytes (OLAP stack hea,OLAP Stack Seg)

对应的TRACE文件详细信息为:

*** 2012-08-03 17:10:03.098
ksedmp: internal OR fatal error
ORA-07445: exception encountered: core dump [xsStkPurge()+73] [SIGSEGV] [Address NOT mapped TO object] [0x0] [] []
ORA-04030: OUT OF process memory WHEN trying TO allocate 8184 bytes (OLAP stack hea,OLAP Stack Seg)
CURRENT SQL statement FOR this SESSION:
BEGIN :1 := dbms_aw.interp(:2); END;
----- PL/SQL Call Stack -----
  object      line  object
  handle    NUMBER  name
0x9b6ad21c        93  package body SYS.DBMS_AW
0x9b6ad21c       180  package body SYS.DBMS_AW
0x9b58b904         1  anonymous block
----- Call Stack Trace -----
calling              CALL     entry                argument VALUES IN hex      
location             TYPE     point                (? means dubious VALUE)     
-------------------- -------- -------------------- ----------------------------
ksedst()+27          CALL     ksedst1()            1 ? 1 ?
ksedmp()+557         CALL     ksedst()             1 ? 8168FB8 ? B748BF3C ?
                                                   A9A650 ? 10 ? B7491D38 ?
ssexhd()+882         CALL     ksedmp()             3 ? B3F831F ? 74537378 ?
                                                   7275506B ? 29286567 ?
                                                   33372B ?
xsStkPurge()+73      signal   00000000             B ? B748DC90 ? B748DD10 ?
xsStkPop()+48        CALL     xsStkPurge()         BDAFBA7C ? B63CC640 ?
                                                   B63CC644 ? 1 ?
xsPMTSETUP()+2213    CALL     xsStkPop()           BDAFBA7C ? 12EB2 ? 0 ?
                                                   B61D1528 ? B471A440 ? 0 ?
xsPMTRST()+223       CALL     xsPMTSETUP()         B63B70DC ? B60FE628 ?
                                                   A933EDF0 ? 0 ?
xsINTERP()+1135      CALL     00000000             B63B70DC ? B63CA66C ?
                                                   BFFF9018 ?
xsILPXEQ()+4347      CALL     xsINTERP()           B63B70DC ? BFFF9018 ?
                                                   BFFF8A84 ? 1C6 ? 0 ?
                                                   B621ED28 ?
xsILPCALL()+2621     CALL     xsILPXEQ()           CCF04F0 ? B2CFAD5 ?
                                                   B63B70DC ? B60ED380 ?
                                                   B63DA8C4 ?
.
.
.
opiodr()+985         CALL     00000000             3C ? 4 ? BFFFF800 ?
opidrv()+466         CALL     opiodr()             3C ? 4 ? BFFFF800 ? 0 ?
sou2o()+91           CALL     opidrv()             3C ? 4 ? BFFFF800 ?
opimai_real()+117    CALL     sou2o()              BFFFF7E4 ? 3C ? 4 ?
                                                   BFFFF800 ?
main()+111           CALL     opimai_real()        2 ? BFFFF830 ?
__libc_start_main()  CALL     00000000             2 ? BFFFF8F4 ? BFFFF900 ?
+211                                               A8F1D6 ? BC7FF4 ? 0 ?
--------------------- Binary Stack Dump ---------------------

根据MOS的查询,只有文章Bug 6755052 : ORA-7445 [XSSTKPURGE()+73] [SIGSEGV] IN EPB WHEN DISTRIBUTING DOCUMENTS与之最为接近。应该的版本同为10.2.0.3,可以确认的是导致ORA-7445错误的主要原因还是ORA-4030错误。而且文档和当前问题的一个重要相同点在于,二者都是32位系统。
由于32位数据库的限制,SGA的大小只有1.7G,而SHARED_POOL只有300M左右,STREAMS_POOL更是只有16M,这就导致了Oracle在处理一些复杂的组件时,很容易出现内存不足的情况。
从问题时刻的AWR分析,TOP 5中出现了明显的Streams AQ: enqueue blocked on low memory等待,这个等待只出现了1次但是经历了293秒,说明STREAMS_POOL空间不足,且数据库在尝试给STREAMS_POOL分配更多空间时报错。
客户主机拥有16G内存,那么这个问题的最有限的方法就是重建64位数据库环境,彻底避免该问题的产生。

This entry was posted in BUG and tagged , , , , , , , , . Bookmark the permalink.

Leave a Reply

Your email address will not be published. Required fields are marked *