Oracleのエラーで一番厄介なのはなんといっても「ORA-00600: 内部エラー」でしょう。
内部エラーというのは、文字通りOracleの内部で発生したエラーで、メッセージが定義されていないものがすべてこのコードで返されるというわけです。
つまりはOracleにとっては想定外のエラー、ユーザーから見れば「そりゃOracleのバグだろ」というようなエラーです。
マニュアルを見ても「サポートに問い合わせろ。」としか書いていません。
ということで、内部エラーが出たときには、サポートに素直に連絡するのが賢明です。
ただ、サポートに連絡してもすぐに解決できる場合とそうでない場合があります。
そうでない場合には、エラー発生時の詳細な情報の提供などを求められるため、相手をしているだけでも大変です。
また、そもそもサポートに入っていない場合には、問合せすらできないので自力で解決するしかありません。
どちらにしても、内部エラー発生時に最初にやるべきことは、どこでどういう内部エラーが発生したのかを調べることです。
アラートログファイルの確認
内部エラーが出たらまずアラートログファイルをチェックしましょう。
以下のように、エラーが発生した日時、エラー発生時に出力されたトレースファイル名、エラーコードとメッセージが書き込まれているはずです。
Wed Aug 25 13:24:55 2004 Errors in file c:\oracle\admin\ORCL\udump\ORCL_ora_2644.trc: ORA-00600: 内部エラー・コード、引数: [qernsRowP],[1],[],[],[],[],[],[]
このエラーメッセージの引数というところにどのような内部エラーなのかというヒントが隠されているようで、サポートに問い合わせると、この引数から即座に解決策が導きされることもあるようです。
トレースファイルの確認
アラートログファイルで示されたトレースファイルを見てみるとさらに詳細な情報がわかります。Dump file c:\oracle\admin\ORCL\udump\ORCL_ora_2644.trc
Thu Aug 19 21:16:47 2004
ORACLE V9.2.0.4.0 - Production vsnsta=0
vsnsql=12 vsnxtr=3
Windows 2000 Version 5.0 Service Pack 4, CPU type 586
Oracle9i Enterprise Edition Release 9.2.0.4.0 - Production
With the Partitioning, OLAP and Oracle Data Mining options
JServer Release 9.2.0.4.0 - Production
Windows 2000 Version 5.0 Service Pack 4, CPU type 586
Instance name: ORCL
Redo thread mounted by this instance: 1
Oracle process number: 12
Windows thread id: 2644, image: ORACLE.EXE
*** SESSION ID:(9.50551) 2004-08-25 13:24:55.718
*** 2004-08-25 13:24:55.718
ksedmp: internal or fatal error
ORA-00600: 内部エラー・コード、引数: [qernsRowP],[1],[],[],[],[],[],[]
Current SQL statement for this session:
SELECT UNIQUE X.TABLESPACE_NAME FROM DBA_TABLESPACES X, DBA_DATA_FILES Y
WHERE X.TABLESPACE_NAME = Y.TABLESPACE_NAME
----- Call Stack Trace -----
calling call entry argument values in hex
location type point (? means dubious value)
-------------------- -------- -------------------- ----------------------------
_ksedmp+327 CALLrel _ksedst+0
_ksfdmp.108+14 CALLrel _ksedmp+0 3
027174D3 CALLreg 00000000 8E301D0 3
0271793D CALLrel 02717450 8E301D0 74ED5F0 1C4C6B8 1
743D794
_ksesin+61 CALLrel _kgesinv+0 8E301D0 74ED5F0 1C4C6B8 1
743D794 1C4C6B8 1 743D794
.
.
.
(以下呪文が延々と続くため省略^^;)
詳細な情報がわかるといっても、ほとんどダンプファイルみたいなものなので、一般ユーザーに解読できるところはほとんどありません。
この例でいうと、最初に動作環境が書き込まれていて、その次にセッションについての情報が書き込まれているのですが、参考になるのは、セッションIDとか実行されていたSQLくらいでしょうか。
サポートに問い合わせるか自力で解決するか
ここまで調べたらあとはサポートに問い合わせるか、自力で解決策を探るかなのですが、とりあえずサポートを使えるのなら、上記のトレースファイルを送りつけて問い合わせましょう。
で、サポートに問い合わせてもすぐに解決できる保証はないので、切羽詰っている状況であるか、あるいは調査する時間が確保できる状況であるならば、並行して自力での解決も模索してましょう。
とりあえず、自力で解決仕様と試みる場合、その内部エラーの発生に再現性、法則性があるかどうかを確認しましょう。
もし、再現性、法則性があるならば、次に内部エラーが発生する処理を避けることができるかどうかを確認しましょう。
根本的な解決にはなりませんが、避けられるのであれば避けるのが最も手っ取り早い解決策となります。
再現性、法則性がはっきりしない、あるいはアプリケーションが内部的に発行しているSQLのような避けようのない処理で内部エラーが発生している場合は、残念ですが手探りで解決策を試していくしかありません...
【関連エントリ】
[Oracle] ORA-00600エラーへの対処方法 2004/09/02
[Oracle] ORA-00600エラー事例 2004/09/06