问题描述
客户数据库出现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视图:
专家解答
查询这个错误,确认是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视图的查询都会出现这个错误。适当的改变写法,可能就能绕过这个错误。