ORA-600(ksmals)错误

客户数据库出现ORA-600(ksmals)错误。
错误信息为:
Tue Nov 22 11:39:02 2011
Errors in file /oracle9/app/admin/db/udump/db1_ora_2319324.trc:
ORA-00600: internal error code, arguments: [ksmals], [sql txt in kkslod], [], [], [], [], [], []
查询这个错误,确认是Oracle的bug,详细描述可以参考:ORA-600 [ksmals], [sql txt in kkslod], [] Selecting Against x$kgllk [ID 550066.1]。这个问题影响9.2到11.1之间的所有版本。当查询x$kgllk内部表,或基于这个内部表的视图时,就可能引发这个问题。
从对应的trace文件中可以看到,导致错误的SQL在查询V$OPEN_CURSOR和V$SQL视图:

*** SESSION ID:(2144.35639) 2011-11-22 11:39:02.143
*** 2011-11-22 11:39:02.143
ksedmp: internal OR fatal error
ORA-00600: internal error code, arguments: [ksmals], [SQL txt IN kkslod], [], [], [], [], [], []
CURRENT SQL statement FOR this SESSION:
SELECT q.sql_text 
FROM v$open_cursor o, v$sql q
WHERE q.hash_value=o.hash_value AND o.sid = 3379

而查询V$SQL和V$OPEN_CURSOR的视图定义:

SQL> SELECT view_definition FROM v$fixed_view_definition WHERE view_name = 'GV$OPEN_CURSOR';
VIEW_DEFINITION
---------------------------------------------------------------------------
SELECT inst_id,kgllkuse, kgllksnm, user_name, kglhdpar, kglnahsh,
kgllksqlid, kglnaobj, kgllkest,
decode(kgllkexc, 0, to_number(NULL), kgllkexc), kgllkctp
FROM x$kgllk WHERE kglhdnsp = 0 AND kglhdpar != kgllkhdl

显然是由于查询了V$OPEN_CURSOR视图,从而访问了X$KGLLK,进而引发了这个bug。
解决这个问题的办法有很多,比如将数据库版本升级到10.2.0.5,或者安装单独的补丁Patch 5745084。在安装Patch 5745084后,还需要设置EVENT 10778的level 1,才能将这个bug FIXED掉。
除了这些方法外,尝试修改SQL语句也是一个不错的方法,因为并非虽有访问V$OPEN_CURSOR视图的查询都会出现这个错误。适当的改变写法,可能就能绕过这个错误。

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 *