ORA-00600: internal error code, arguments: [a], [b], [c], [d], [e], [f], [g], [h]は、Oracle が内部で予期しない状態を検出したときに発生するエラーです。アプリケーションのバグや SQL の誤りではなく、Oracle 自身のバグ・データ破損・メモリ問題・ハードウェア障害などが原因です。
ORA-00600 は発生したこと自体が問題であり、再現性を確認してから Oracle Support への対応が必要になるケースがあります。慌てず、まずはアラートログとトレースファイルから情報を収集することが最優先です。
- ORA-00600 の最初の引数([a])の意味と調査の起点
- アラートログでエラーを確認する方法
- V$DIAG_INFO でトレースファイルの場所を確認する方法
- トレースファイルから call stack・SQL 情報を読む方法
- ADR(自動診断リポジトリ)と adrci コマンドでインシデントを管理する方法
- Oracle Support(MOS)に問い合わせる際に必要な情報と手順
ORA-00600 の引数の意味
ORA-00600 のメッセージには複数の引数([a], [b], [c], ...)が含まれます。最初の引数 [a] が最も重要で、Oracle 内部のどのコードパスで問題が発生したかを示します。この値が Oracle Support や MOS での調査のキーになります。
ORA-00600: internal error code, arguments: [kcbz_check_obj_objd_mismatch], [...]→ バッファキャッシュのオブジェクト不整合ORA-00600: internal error code, arguments: [2662], [...]→ SCN(System Change Number)の不整合ORA-00600: internal error code, arguments: [kddummy_blkchk], [...]→ データブロックの破損検出ORA-00600: internal error code, arguments: [13013], [...]→ 索引スキャン中の不整合
アラートログで ORA-00600 を確認する
-- ADR(Automatic Diagnostic Repository)のパスを確認する SELECT name, value FROM V$DIAG_INFO; -- 重要な出力: -- Diag Enabled : TRUE -- ADR Base : /u01/app/oracle (ADR のルートディレクトリ) -- ADR Home : /u01/app/oracle/diag/rdbms/orcl/orcl (インスタンスの診断ホーム) -- Diag Trace : /u01/app/oracle/diag/rdbms/orcl/orcl/trace (トレースファイルの場所) -- Diag Alert : /u01/app/oracle/diag/rdbms/orcl/orcl/alert (アラートログの場所) -- アラートログの最新部分を SQL から確認する(11g 以降) SELECT originating_timestamp, message_text FROM V$DIAG_ALERT_EXT WHERE message_text LIKE '%ORA-00600%' ORDER BY originating_timestamp DESC FETCH FIRST 20 ROWS ONLY; -- 現在のセッションのトレースファイルを確認する SELECT value FROM V$DIAG_INFO WHERE name = 'Default Trace File'; -- 出力例: /u01/app/oracle/diag/rdbms/orcl/orcl/trace/orcl_ora_12345.trc
# ADR Home: /u01/app/oracle/diag/rdbms/orcl/orcl # アラートログのパス: $ADR_HOME/alert/log.xml または $ADR_HOME/trace/alert_orcl.log # アラートログ(テキスト形式)で ORA-00600 を検索する grep -n "ORA-00600" $ORACLE_BASE/diag/rdbms/orcl/orcl/trace/alert_orcl.log # 前後のコンテキストを含めて確認する grep -B 5 -A 10 "ORA-00600" alert_orcl.log # アラートログの最新部分を確認する tail -500 $ORACLE_BASE/diag/rdbms/orcl/orcl/trace/alert_orcl.log # ORA-00600 発生時に自動生成されたトレースファイルを確認する # アラートログに "incident=XXXXXXX" の記載がある場合、インシデントトレースファイルも確認する # $ADR_HOME/incident/incdir_XXXXXXX/ ディレクトリ内に詳細トレースがある
adrci コマンドでインシデントを管理する
ADR(Automatic Diagnostic Repository)は Oracle 11g 以降の診断フレームワークで、ORA-00600 などの重大エラーをインシデントとして自動記録します。adrci(ADR Command Interface)でインシデントを管理できます。
# adrci を起動する adrci # adrci> プロンプトで操作する # ADR ホームを設定する(複数インスタンスがある場合) adrci> set homepath diag/rdbms/orcl/orcl # インシデント一覧を表示する adrci> show incident # 特定インシデントの詳細を表示する adrci> show incident -p "incident_id=12345" # インシデントのトレースを表示する adrci> show tracefile # ORA-00600 のインシデントをフィルタリングする adrci> show incident -p "problem_key like '%ORA 600%'" # IPS(Incident Package Service)でサポート向けのパッケージを作成する # これを Oracle Support に送付する adrci> ips create package incident 12345 # → パッケージファイルが生成される(zipファイル形式) # adrci を終了する adrci> quit
トレースファイルの読み方
ORA-00600 が発生すると、詳細情報を含む .trc トレースファイルが自動生成されます。主に以下の情報を確認します。
# トレースファイルのパスを確認する(V$DIAG_INFO から取得したパスを使う) TRC_FILE=/u01/app/oracle/diag/rdbms/orcl/orcl/trace/orcl_ora_12345.trc # ORA-00600 の引数と発生時刻を確認する grep -A 5 "ORA-00600" $TRC_FILE # Call Stack(どの内部関数から呼ばれたか)を確認する # Call Stack は問題の根本原因特定に使われる grep -A 30 "Current SQL statement" $TRC_FILE # 実行中の SQL 文を確認する grep -A 5 "PARSING IN CURSOR" $TRC_FILE # Oracle バージョンとパッチ情報を確認する grep "Oracle Database" $TRC_FILE | head -5 grep "PSR" $TRC_FILE | head -5 # Patch Set Release 情報 # トレースファイルの最初の部分(ヘッダー情報)を確認する head -100 $TRC_FILE
ORA-00600 が発生したときの調査手順
| 手順 | 作業内容 | 確認場所 |
|---|---|---|
| ① 発生状況の把握 | いつ・どのユーザーが・どの操作をしたときに発生したか | アラートログ・V$DIAG_ALERT_EXT |
| ② 引数の記録 | ORA-00600の最初の引数 [a] の値を正確に記録する | アラートログ・トレースファイル |
| ③ トレースファイル確認 | 実行中の SQL・Call Stack を確認する | .trc ファイル・adrci show incident |
| ④ 再現性の確認 | 同じ操作で再現するか確認する(再現する場合は原因特定がしやすい) | アプリケーション・SQL 実行 |
| ⑤ MOS で調査 | Oracle My Oracle Support でエラーコードを検索してKnown Bug / パッチを確認する | support.oracle.com |
| ⑥ パッチ適用 | Known Bug のパッチがある場合は適用する(テスト環境で確認後に本番適用) | My Oracle Support のパッチダウンロード |
| ⑦ SR 申請 | Known Bug がない場合・データ破損の疑いがある場合は SR を申請する | support.oracle.com |
-- Oracle バージョンとパッチレベルを確認する
SELECT * FROM V$VERSION;
SELECT patch_id, action, action_time, description
FROM DBA_REGISTRY_SQLPATCH
ORDER BY action_time DESC;
-- データベースの基本情報を確認する
SELECT name, db_unique_name, created, log_mode,
open_mode, protection_mode, database_role
FROM V$DATABASE;
-- 発生時刻前後のシステム負荷を確認する(AWR が有効な場合)
SELECT begin_interval_time, end_interval_time,
ROUND(value, 2) AS cpu_usage_pct
FROM DBA_HIST_SYSMETRIC_SUMMARY
WHERE metric_name = 'CPU Usage Per Sec'
AND begin_interval_time > SYSDATE - 1
ORDER BY begin_interval_time;
-- ディスクの空き容量を確認する(ログファイル・トレースファイルの容量不足も原因になる)
SELECT tablespace_name, used_space, tablespace_size
FROM DBA_TABLESPACE_USAGE_METRICS
ORDER BY used_space / NULLIF(tablespace_size, 0) DESC;
-- SR 申請時に添付するもの:
-- ① アラートログ(エラー発生前後 1時間分)
-- ② adrci ips create package で生成したパッケージ(インシデントトレース含む)
-- ③ Oracle バージョン情報(V$VERSION・DBA_REGISTRY_SQLPATCH の出力)
-- ④ 再現手順(SQL など)がある場合は記載する
まとめ
- ORA-00600 は Oracle の内部エラー:アプリケーションのバグや SQL ミスではなく Oracle 自身のバグ・データ破損・メモリ問題が原因。最初の引数 [a] が調査のキーになる
- 最初の対応:V$DIAG_INFO でアラートログとトレースファイルの場所を確認する。アラートログで発生時刻と引数を記録し、.trc ファイルで実行中の SQL と Call Stack を確認する
- adrci:Oracle 11g 以降の ADR 管理ツール。show incident でインシデント一覧を確認し、ips create package でサポート向けパッケージを作成できる
- 再現性の確認:同じ操作で再現するなら原因特定がしやすい。再現しないまれな発生なら継続監視しつつ MOS で Known Bug を確認する
- MOS で調査:Oracle My Oracle Support(support.oracle.com)で ORA-00600 の最初の引数を検索すると Known Bug とパッチが見つかることが多い。パッチがあればテスト環境で確認後に本番適用する
ORA-00600 に続いて ORA-07445 が発生することもあります(OS レベルのシグナルによる異常終了)。どちらも同様の手順で調査します。データブロックの破損が疑われる場合は Oracle Flashback 完全ガイドやDBMS_REPAIR を使ったブロック修復も検討してください。