トラブル発生時のログ確認と対応ガイド

ADR(自動診断リポジトリ)

oracle 環境で障害が起きたときは、まず「どのログをどの順で見るか」を決めておくと復旧が速くなります。本稿は 19c/Oracle Linux を前提に、必須ログの所在・読み方・代表的な原因と対処を実行例と具体パス例つきで整理します。

💰 【PR】Oracleエンジニアの市場価値、調べてみませんか?

Oracleのスキルは需要が高く、特定の資格や経験を持っていると年収が大幅にアップするケースがあります。まずはIT専門のエージェントで非公開求人をチェックしてみませんか?


全体像(まずは“見る順番”を固定)

[障害の検知]
     │  (監視/問い合わせ/アプリ例外)
     ▼
【1】アラートログを即確認(近時イベントの俯瞰)
     │→ 重大/繰返し/ORA- エラーの有無
     ▼
【2】該当プロセス/セッションのトレースを深掘り
     │→ スタック、SQL、実行時情報
     ▼
【3】ADRCIで incident/problem を一覧化
     │→ 一括把握とSR材料化
     ▼
【4】接続系はリスナーログもチェック
     │→ TNS-12xxx、接続元、時刻相関
     ▼
【5】OSログで資源/デバイス異常の有無
     │→ I/O/メモリ/ネット/ファイルシステム
     ▼
【対処】設定見直し・リカバリ・SR化(根本原因へ)

すぐ使える“要点コマンド”

  • 直近のアラートログを追う(※下記に具体パス例あり) cd $ORACLE_BASE/diag/rdbms/<DB名>/<インスタンス名>/trace tail -f alert_<DB名>.log | egrep "ORA-|ERROR|WARNING"
  • ADR/診断ディレクトリの正確な場所(SQL) -- 診断関連ディレクトリ(確定値)を取得 SELECT name, value FROM v$diag_info WHERE name IN ('ADR Base','ADR Home','Diag Trace','Diag Alert') ORDER BY name; 初心者向け補足: V$DIAG_INFO は診断(ADR)の各パスを教えてくれる動的ビューです。まずここで“見るべき場所”を間違えないようにします。


[参考]


oracle 環境でまず確認するログの順番

1. アラートログ(alert_<DB名>.log)

目的: 重大イベントの時系列俯瞰。インスタンス状態、バックグラウンド異常、ORA- エラーの発火点を把握。

既定パス
$ORACLE_BASE/diag/rdbms/<DB名>/<インスタンス名>/trace/alert_<DB名>.log

(指定環境の具体パス例)
前提:
export ORACLE_SID=orcl
export ORACLE_BASE=/u01/app/oracle
export ORACLE_HOME=/u01/app/oracle/product/19.0.0/dbhome_1

  • 例A:DB名=orcl、インスタンス名=orcl
    • ディレクトリ: /u01/app/oracle/diag/rdbms/orcl/orcl/trace/
    • アラートログ: /u01/app/oracle/diag/rdbms/orcl/orcl/trace/alert_orcl.log
    • 直近追尾: tail -f /u01/app/oracle/diag/rdbms/orcl/orcl/trace/alert_orcl.log | egrep "ORA-|ERROR|WARNING"
  • 例B:DB名=PROD、インスタンス名=orcl(DB名≠SID の典型)
    • ディレクトリ: /u01/app/oracle/diag/rdbms/PROD/orcl/trace/
    • アラートログ: /u01/app/oracle/diag/rdbms/PROD/orcl/trace/alert_PROD.log

DB名が不明な場合の確認(安全な参照)

SELECT name FROM v$database;   -- ここで <DB名> を特定

典型例と初期対処

  • ORA-00600(内部エラー)
    方針: 事象の引数([]内)と同時刻のトレースを収集。再現性の有無を確認。SR化準備。
  • ORA-04031(shared pool等のメモリ不足)
    暫定回避: ALTER SYSTEM FLUSH SHARED_POOL; SELECT name, value FROM v$parameter WHERE name IN ('sga_target','memory_target','shared_pool_size') ORDER BY name; 初心者向け補足: 一時的に shared pool を空けてしのぎます。根本は SGA/プール設計の見直し(サイズ、ライブラリキャッシュ肥大の要因)です。

2. トレースファイル(プロセス/セッション詳細)

目的: アラートで発火した事象の詳細(コールスタック、実行SQL、エラーコード引数など)を確認。

既定パス
$ORACLE_BASE/diag/rdbms/<DB名>/<インスタンス名>/trace/

(指定環境の具体パス例)

  • 例A:/u01/app/oracle/diag/rdbms/orcl/orcl/trace/
  • 例B:/u01/app/oracle/diag/rdbms/PROD/orcl/trace/

よくあるパターン

  • ORA-07445(OS例外/コアダンプ)
    方針: 該当トレースの関数名とタイムスタンプを控え、同時刻の OS ログ(I/O、ファイルシステム)と相関。SR化時は当該トレースを添付。

3. ADRCI(Automatic Diagnostic Repository Command Interpreter)

目的: incident/problem の横断把握と収集。

基本操作例

adrci
ADR base = /u01/app/oracle
adrci> show home
adrci> set home diag/rdbms/<DB名>/<インスタンス名>
adrci> show incident -last 10
adrci> show problem
adrci> show alert -tail 100
adrci> help ips   -- SR用パッケージ化コマンドのヘルプ

(指定環境の具体パス例)

  • 例A(DB=orcl, SID=orcl) adrci> set home diag/rdbms/orcl/orcl
  • 例B(DB=PROD, SID=orcl) adrci> set home diag/rdbms/PROD/orcl

初心者向け補足: ADR は 11g 以降の“診断の置き場”です。adrci を使うと、アラート・トレース・インシデントが横断的に見られます。

💰 【PR】Oracleエンジニアの市場価値、調べてみませんか?

Oracleのスキルは需要が高く、特定の資格や経験を持っていると年収が大幅にアップするケースがあります。まずはIT専門のエージェントで非公開求人をチェックしてみませんか?


4. リスナーログ(listener.log)

目的: 接続トラブルの可視化。どこから、いつ、何が失敗したか。

既定パス
$ORACLE_BASE/diag/tnslsnr/<ホスト名>/<リスナー名>/trace/listener.log

(指定環境の具体パス例)

  • 例:ホスト名=dbhost、リスナー名=LISTENER
    • ログ: /u01/app/oracle/diag/tnslsnr/dbhost/LISTENER/trace/listener.log
  • 操作用バイナリ(フルパス): /u01/app/oracle/product/19.0.0/dbhome_1/bin/lsnrctl status /u01/app/oracle/product/19.0.0/dbhome_1/bin/lsnrctl services /u01/app/oracle/product/19.0.0/dbhome_1/bin/lsnrctl start

代表的エラー

  • TNS-12541: TNS: リスナーがありません。
    確認: lsnrctl status
  • ORA-12514: TNS: リスナーは接続記述子で要求されたサービスを現在認識していません
    確認ポイント: SERVICE_NAME が間違い/未登録。lsnrctl servicesLOCAL_LISTENER/SERVICE_NAMES の整合を点検。

5. OSログ(資源/デバイス)

目的: DB 以外起因(ディスク異常、メモリ圧迫、ネット障害等)の切り分け。

Oracle Linux の例

# 主要ログ
sudo tail -n 200 /var/log/messages
sudo journalctl -xe --since "2025-08-01" --until "2025-08-31"

# I/O/FSの兆候(例)
dmesg -T | egrep -i "error|ext4|nvme|sda|dma"

初心者向け補足: DB が悪く見えても、根はストレージやネットにあることがよくあります。DBログとOSログの“同時刻相関”がカギです。


代表的な“原因↔対処”の要点メモ

事象まずやること根本対処の方向性
ORA-00600/ORA-07445直近のアラートと同時刻トレースを収集、再現性確認バグ/データ破損/外部要因。SRで分析、該当 RU の適用検討
ORA-04031一時回避の FLUSH、実行時のライブラリキャッシュ観察SGA/プール配分、カーソル共有、ハードパース抑制
ORA-01555(snapshot too old)実行SQLの一貫性要件と発生時刻を把握UNDO サイズ/UNDO_RETENTION の見直し、長時間クエリの設計改善
TNS-12541/12514lsnrctl status/services とサービス名の整合ネーミング/設定配布の一元管理、監視閾値/再起動手順の標準化

UNDO 関連の確認と調整(例:ORA-01555 対策の入口)

-- 現状の UNDO 保持時間
SELECT name, value FROM v$parameter WHERE name='undo_retention';

-- UNDO 表領域のサイズ概況
SELECT tablespace_name, status, contents, extent_management
FROM dba_tablespaces WHERE contents='UNDO';

-- (例)保持時間を伸ばす方向(影響評価のうえ)
ALTER SYSTEM SET undo_retention = 3600 SCOPE=BOTH;

初心者向け補足: 保持時間は“消せない”のではなく“消しにくくする”目安です。長時間クエリが多い/更新量が多い場合はサイズ増も検討します。


実務で便利な補助 SQL(安全な参照のみ)

-- 直近の ORA- をアラートログから探す(adrciが使えない場面の起点に)
-- ※実ファイルのgrepが基本。ここでは診断パスの確認までをSQLで。
SELECT name, value
FROM   v$diag_info
WHERE  name IN ('Diag Alert','Diag Trace')
ORDER  BY name;

初心者向け補足: 実際のアラート本文はファイルとして保持されます。アプリや運用手順で greptail を使うのが最短です。


付録:学習用ユーザー(検証環境)と IDENTITY 列の注意点

※本番では最小権限原則を厳守。以下は検証用の例です。
※パスワードは @ を含まない指定に変更しています。

-- SYS で実行(検証環境)
CREATE USER logviewer IDENTIFIED BY Str0ngPass1;

-- 最小限の接続 + 辞書参照
GRANT CREATE SESSION TO logviewer;
GRANT SELECT_CATALOG_ROLE TO logviewer;

-- CREATE TABLE を行うための権限とクォータ
GRANT CREATE TABLE TO logviewer;
ALTER USER logviewer DEFAULT TABLESPACE USERS TEMPORARY TABLESPACE TEMP;
ALTER USER logviewer QUOTA 50M ON USERS;

-- <重要> IDENTITY 列を使う場合の追加権限
-- Oracle は IDENTITY 列の裏側で内部 SEQUENCE(ISEQ$$_…)を作成します。
-- そのため、作成ユーザーに CREATE SEQUENCE 権限が必要です。
GRANT CREATE SEQUENCE TO logviewer;

初心者向け補足:

  • GENERATED BY DEFAULT AS IDENTITY を含むテーブル作成は内部シーケンスを自動作成します。CREATE SEQUENCE 権限が無いと ORA-01031 になることがあります。
  • 切り分け手順
    1. まず IDENTITY を外した CREATE TABLE が通るか確認。
    2. 通るなら GRANT CREATE SEQUENCE を付け、IDENTITY ありで再実行。

付録:練習用テーブル(ログ調査メモを残す)

-- logviewer で実行
CONNECT logviewer/Str0ngPass1

-- (A)IDENTITY ありのバージョン(要:CREATE SEQUENCE)
CREATE TABLE log_notes (
  note_id     NUMBER GENERATED BY DEFAULT AS IDENTITY PRIMARY KEY,
  occurred_at TIMESTAMP DEFAULT SYSTIMESTAMP,
  component   VARCHAR2(30),
  message     VARCHAR2(4000)
);

-- (B)もし(A)で権限付与前に試すなら、IDENTITY を外した版で検証
-- CREATE TABLE log_notes (
--   note_id     NUMBER PRIMARY KEY,
--   occurred_at TIMESTAMP DEFAULT SYSTIMESTAMP,
--   component   VARCHAR2(30),
--   message     VARCHAR2(4000)
-- );

INSERT INTO log_notes(component, message)
VALUES ('ALERT', 'ORA-04031 を検知、一時回避で FLUSH 実施');

COMMIT;

SELECT * FROM log_notes ORDER BY occurred_at DESC;

(補足)CREATE TABLE で ORA-01031 が出る場合の確認ポイント

記事内容は変えず、不具合再現時の最小修正として追記します。

  1. IDENTITY 列の有無(→ CREATE SEQUENCE 権限が必要)
  2. 作成先スキーマCURRENT_SCHEMA が自分以外だと CREATE ANY TABLE が必要)
SELECT
  SYS_CONTEXT('USERENV','SESSION_USER')   AS session_user,
  SYS_CONTEXT('USERENV','CURRENT_SCHEMA') AS current_schema,
  SYS_CONTEXT('USERENV','CON_NAME')       AS con_name
FROM dual;
  • 必要なら ALTER SESSION SET CURRENT_SCHEMA = LOGVIEWER; -- または明示スキーマ指定 -- CREATE TABLE LOGVIEWER.log_notes ( ... );
  1. PDB の Open モード(READ ONLY だと DDL は不可:v$pdbs で確認)
  2. 表領域の状態(READ ONLY/OFFLINE の場合は READ WRITE に戻す)

参考:よく使うディレクトリ(19c の既定と具体例)

# 既定パターン
$ORACLE_BASE/diag/rdbms/<DB名>/<インスタンス名>/trace/      ... アラート/トレース
$ORACLE_BASE/diag/tnslsnr/<HOST>/<LISTENER>/trace/           ... リスナーのログ/トレース

# 指定環境の例(ORACLE_SID=orcl, ORACLE_BASE=/u01/app/oracle)
/u01/app/oracle/diag/rdbms/orcl/orcl/trace/                  ... アラート/トレース(DB=orcl, SID=orcl)
/u01/app/oracle/diag/rdbms/PROD/orcl/trace/                  ... アラート/トレース(DB=PROD,  SID=orcl)
/u01/app/oracle/diag/tnslsnr/dbhost/LISTENER/trace/          ... listener.log(ホスト=dbhost, リスナー=LISTENER)
/u01/app/oracle/product/19.0.0/dbhome_1/bin/lsnrctl           ... リスナー操作バイナリ
/u01/app/oracle/product/19.0.0/dbhome_1/bin/sqlplus           ... SQL*Plus

まとめ

  • 見る順序を固定(アラート → トレース → ADRCI → リスナー → OS)。
  • 時刻相関で原因を絞り込み、暫定回避根治策を分けて実施。
  • 検証環境で再現と手順化まで行うと、次回の障害対応が段違いに速くなります。

本記事は Oracle Database 19c を対象に解説します(他バージョンは画面や既定値が異なる場合があります)。



[参考]
データベース・エラー・メッセージ

💰 【PR】Oracleエンジニアの市場価値、調べてみませんか?

Oracleのスキルは需要が高く、特定の資格や経験を持っていると年収が大幅にアップするケースがあります。まずはIT専門のエージェントで非公開求人をチェックしてみませんか?

コメント

タイトルとURLをコピーしました