ORA-07445和ORA-00600是系统内部错误 查错方法

<p><span style="font-size: x-small;">ORA-07445和ORA-00600是系统内部错误,一般是由于BUG引起的,要解决或者避免这些错误一般需要到metalink上查。metalink甚至专门推出了一个工具用于这两个错误的查找。</span>
</p>
<p><span style="font-size: x-small;">与普通错误不同的是,ORA-07445和ORA-00600是一系列错误的总称,引起错误的原因可能成千上万个,如何快速、准确地找出到错误的原因是解决这类问题的难点。<br>
出现ORA-07445或ORA-00600错误时,一般都会产生一个trace文件,这个文件的路径和名称可以在alert文件中找到。<br>
这篇文章主要是谈谈如何在trace文件找找出关键信息。</span>
</p>

<p><span style="font-size: x-small;">1、ORA-07445</span>
</p>
<p><span style="font-size: x-small;">找出ORA-007445最关键是找出出错的函数名(这里的函数是指开发ORALCE的函数),然后根据函数名搜索错误原因及解决方法。<br>
ORA-07445后一般跟着若干个由[]括起来的字符串,通常第一个被[]括起来的字符串就是我们需要的函数名。<br>
ORA-07445的报错一般有两种:<br>
1)ORA-07445: exception encountered: core dump [lnxmin()+252] [SIGSEGV] [Address not mapped to object] [0x000000002] [] []<br>
这种情况很简单,第一个被[]括起来的字符串是lnxmin,这就是引发错误的函数名,我们根据这个信息去查就可以了。</span>
</p>
<p><span style="font-size: x-small;">2)ORA-07445: exception encountered: core dump [0000000100E84B7C] [SIGSEGV] [Address not mapped to object] [0x0000004F0] [] []<br>
这种情况比较麻烦,因为oracle并没有告诉我们出错的函数名,0000000100E84B7C可能只是一个地址,无法根据这个来作为关键字进行查询。<br>
这时我们就要从trace文件着手了。在trace文件内容的前部分中的Call Stack Trace部分可以发现有用信息。<br>
对比一下多个trace文件,可以发现在这种情况下Call Stack Trace一般都包含类似下面的内容:<br>
----- Call Stack Trace -----<br>
calling call entry argument values in hex<br>
location type point (? means dubious value)<br>
-------------------- -------- -------------------- ----------------------------<br>
ksedmp()+328 CALL ksedst()+0 FFFFFFFF7FFF3BD0 ?<br>
000000000 ? 000000000 ?<br>
00000003E ?<br>
FFFFFFFF7FFF4468 ?<br>
1031D56C8 ?<br>
ssexhd()+604 CALL ksedmp()+0 000000000 ? 000103400 ?<br>
0001035D9 ? 000102C00 ?<br>
1035D9000 ? 1035D9C28 ?<br>
sigacthandler()+44 PTR_CALL 0000000000000000 1035E1000 ?<br>
FFFFFFFF7FFF5400 ?<br>
000000000 ? 000000001 ?<br>
1035DEDD8 ? 00000000B ?<br>
qsmkzii_init_qsmksi PTR_CALL 0000000000000000 00000000B ?<br>
nline()+624 FFFFFFFF7FFF5400 ?<br>
FFFFFFFF7FFF5120 ?<br>
00000000B ? 00038001C ?<br>
1035DC458 ?<br>
qsmkzss_setup_summa CALL qsmkzii_init_qsmksi FFFFFFFF7CD12908 ?<br>
ry()+480 nline()+0 000103000 ?<br>
FFFFFFFF7CD93650 ?<br>
000000000 ?<br>
FFFFFFFF7CD93650 ?<br>
103258100 ?<br>
......<br><br>
其中里面的ksedmp、ssexhd、sigacthandler这三个函数在每一个ORA-07445 [0000000100E84B7C]类似的trace文件都存在,这是进行oracle异常处理的,一般不用管。 <br>
stack的第一列的第四行的信息就是我们需要的信息:qsmkzii_init_qsmksinline,这个就是出错的函数名。<br>
在metalink根据这个函数名去查找,一般就可以知道错误的原因和是否有合适的方面来解决、避免这个错误。<br>
如果根据第四行的函数名得不到有用的信息,可以尝试一下第五行的信息作为函数名,如果还是不能查到有用的信息,则可以认为metalink上没有这个错误的信息。 </span>
</p>
<p><span style="font-size: x-small;">2、ORA-00600<br>
查找ORA-00600的关键信息比ORA-07445稍微简单,它相当于ORA-07445的第一种情况。<br>
ORA-00600后一般跟着若干个由[]括起来的字符串,通常第一个被[]括起来的字符串就是我们需要的参数。<br>
ORA-00600的报错信息在从alert文件和trace文件都存在,不过为了得到更多的信息,建议看trace文件。<br>
一个ORA-00600的trace文件类似下面:<br>
*** SESSION ID:(22.3813) 2004-10-26 09:57:13.167<br>
*** 2004-10-26 09:57:13.167<br>
ksedmp: internal or fatal error<br>
ORA-00600: internal error code, arguments: [ttcgcshnd-1], [0], [], [], [], [], [], []<br>
Current SQL statement for this session:<br>
SELECT VALUE FROM NLS_INSTANCE_PARAMETERS WHERE PARAMETER ='NLS_DATE_FORMAT'<br>
----- Call Stack Trace -----<br>
calling call entry argument values in hex<br>
location type point (? means dubious value)<br>
-------------------- -------- -------------------- ----------------------------<br>
ksedmp()+328 CALL ksedst()+0 FFFFFFFF7FFF9660 ?<br>
000000000 ? 000000000 ?<br>
00000003E ?<br>
FFFFFFFF7FFF9EF8 ?<br>
1031C9458 ?<br>
kgerinv()+184 PTR_CALL 0000000000000000 000000000 ? 000103400 ?<br>
0001035CD ? 000102C00 ?<br>
1035CD000 ? 1035CD328 ?<br>
kgeasnmierr()+28 CALL kgerinv()+0 1035CD588 ? 1036EDE38 ?<br>
0000013C8 ? 000000001 ?<br>
1035CF694 ? 1035CE958 ?<br>
ttcgcshnd()+248 CALL kgeasnmierr()+0 1035CD588 ? 1036EDE38 ?<br>
1033A2758 ? 000000001 ?<br>
000000000 ? 000000000 ?<br>
ttcc2u()+784 CALL ttcgcshnd()+0 1035CD588 ? 102DA4880 ?</span>
</p>
<p><span style="font-size: x-small;">上面的信息中,ttcgcshnd-1就是我们要找的第一个参数,也是查询的关键字。</span>
</p>
<p><br><span style="font-size: x-small;">3、trace中其他有用的信息<br>
在ORA-00600和ORA-07445的trace文件都包含了一些其他的有用信息。<br>
在trace文件的PROCESS STATE部分,可以查看出错时SESSION的信息,包含主机名、那个用户执行的、用什么工具执行的等。<br>
这些信息可能不太好找,查找方法是:从trace文件中找到PROCESS STATE,然后从PROCESS STATE往下找第一个"session"(关键字)出现的地方,这部分信息就包含我们需要的这些重要信息。</span>
</p>
<p><span style="font-size: x-small;">按照关键字"HOST"查可以得到客户端的IP</span>
</p>
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值