ORA-00600错误一例,一个SQL运行时报ORA-00600的错误。
英文错误信息: ORA-00600: internal error code, arguments: [qkeAddDependentExpr1],[],[],[],[],[],[],[],[],[],[],[]
中文错误信息: ORA-00600 内部错误代码,参数:[qkeAddDependentExpr1],[],[],[],[],[],[],[],[],[],[],[]
SQL
SELECT c1, c2, c3
FROM T1
WHERE EXISTS
(SELECT c4 FROM T2 WHERE ....
FROM T1
WHERE EXISTS
(SELECT c4 FROM T2 WHERE ....
UNION
SELECT c4 FROM T2 WHERE .. .);
SELECT c4 FROM T2 WHERE .. .);
数据库版本:11.2.0.2.0
分析
ORA-600错误是Oracle数据库内部错误,单从600这个错误号是没有办法定位问题的,ORA-00600可能由多种原因造成,包括软件漏洞、Bug、程序运行异常、内存讹误和数据讹误造成,具体需要结合错误信息中所提供的参数及日志来定位问题。
Error: ORA 600
Text: internal error code, arguments: [%s], [%s], [%s], [%s], [%s], [%s], [%s]
-------------------------------------------------------------------------------
Cause: This is the generic internal error number for Oracle program exceptions. This indicates that a process has encountered an exceptional condition.
Action: Report as a bug - the first argument is the internal error number
*** Important: The notes below are for experienced users - See Note:22080.1
Explanation:
Any ORA-600 error indicates Oracle has detected an internal inconsistency or a problem which it doesnt know how best to address. These are *NOT* necessarily bugs and can occur for reasons such as Operating System IO problems, running out of some resource etc..
我们这个ORA-600问题奇怪之处在于那个Union,如果把Union换成Union All,就不会再报错了。
解决方法
其实我们没有找到根本的解决方案,我们的解决方法就是调整SQL来避过问题的,可能这个也只有Oracle内部才方便定位把。
BTW:有一个非常类似Note:ORA-07445 [kokmrwo()] When Executing Compound Queries (Doc ID 1422733.1),问题和我们的很接近,最终的解决方法也是调整SQL来避过问题的。
遇到ORA-600的错误,可以查阅下以下几个Note,看看能不能找到类似的情况。
关于ORA-600的参数,实际600 Internal Error的参数分成2种(copy from link):
a.第一位是数字类型的Argument ,例如之前说的2662 和 4000 , 不同的数字代表不同的错误含义。数字类型的argument所代表的内部错误相对更为普遍、常见。实际这些数字Argument也是来源于不同的Oracle Kernel Function内核函数,如kddummy_blkchk、kclchkinteg_2等; b.函数名形式的Argument。这类Argument 代表的Internal Error 相对于前一种要出现的频率低一些, Oracle开发部门尚来没有在相关版本中将这些Internal Error 编码。这样我们就可以看到出现问题的完整Kernel Function Name,可以使用ORA-600 + 第一位 Argument 在Metalink 上搜索来找到一些相关的Note,但是函数名形式的Argument往往不能精确定位到问题,因为不同的错误原因 可能在同一个内核函数中引发不同的异常,而这个时候我们只能看到 函数名的Argument 信息。