[Oracle] ORA-00600エラー事例 | Archive Redo Blog

Archive Redo Blog

DBエンジニアのあれこれ備忘録

あるプロシージャのテストをしていたところ、突然

ORA-00600: 内部エラー・コード、引数: [6122],[0],[1],[0],[],[],[],[]

が発生したことがあります。

発生時に実行されていたSQLは、以下のようなDELETE文なのですが、何度実行しても確実に再現し、挙句の果てにはOracleが暴走する(CPU使用率100%の状態のまま処理が終了しない)というひどいエラーです。

DELETE FROM OBJECT_USER
  WHERE OBJECT_ID BETWEEN :b2 AND :b1
    AND USER_ID IN (SELECT USER_ID FROM tmp_user)

このSQLを実行しているプロシージャは、直接呼び出したプロシージャからサブプロシージャの呼び出しを繰り返し6階層目あたるし、一時テーブル(tmp_user)のデータを元にDELETEをしているということで、やや特殊といえば特殊なんですが、果たしてそれがこのエラーの原因になっているんでしょうか?

はっきりとした原因を追求しようと思えばおそらくサポート行きなのですが、何とな~く、サポートに依頼しもてこずりそうな予感がしたので、何をすれば内部エラーが発生しなくなるかを自力でいろいろ試してみました。

すると、さほどいろいろなことを試さないうちにあっさり解決してしまいました。

実行されていたSQLが使用していたテーブルとそのインデックスを再構築するとエラーが発生しなくなったのです。

テーブルとそのインデックスの再構築のために実行したSQLは以下のとおり。

ALTER TABLE OBJECT_USER MOVE TABLESPACE USERS
/
ALTER INDEX PK_OBJECT_USER REBUILD
/
ALTER INDEX IX_OBJECT_USER REBUILD
/
なんだかよくわかりませんが、このエラーは、テーブルまたはインデックスのデータ構造に何らかの問題があったために発生したのではないでしょうか?

結局、直ってしまったのでこれ以上の原因追求はしなかったのですが、それ以降は発生していないことからするとそういうことなんでしょう。

え、でも待てよ?

テーブルとインデックスの再構築で直ったということは...

再現する可能性は0ではないってことですか...

なんだかなぁ...