【Oracle】ORA-00600 完全ガイド|内部エラーの原因・アラートログ確認・トレースファイル解析・SR 申請まで解説

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 の引数の例

  • 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 を確認する

V$DIAG_INFO でアラートログとトレースファイルの場所を確認する
-- 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
アラートログからORA-00600を検索する
# 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

# 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
SR 申請時に収集すべき情報
-- 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 を使ったブロック修復も検討してください。