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=orclexport ORACLE_BASE=/u01/app/oracleexport 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 servicesとLOCAL_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/12514 | lsnrctl 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;
初心者向け補足: 実際のアラート本文はファイルとして保持されます。アプリや運用手順で grep/tail を使うのが最短です。
付録:学習用ユーザー(検証環境)と 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になることがあります。- 切り分け手順:
- まず IDENTITY を外した CREATE TABLE が通るか確認。
- 通るなら
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 が出る場合の確認ポイント
記事内容は変えず、不具合再現時の最小修正として追記します。
- IDENTITY 列の有無(→
CREATE SEQUENCE権限が必要) - 作成先スキーマ(
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 ( ... );
- PDB の Open モード(READ ONLY だと DDL は不可:
v$pdbsで確認) - 表領域の状態(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専門のエージェントで非公開求人をチェックしてみませんか?




コメント