この内容は古いバージョンです。最新バージョンを表示するには、戻るボタンを押してください。
バージョン:3
ページ更新者:guest
更新日時:2026-06-11 07:07:02

タイトル: PMON (Process Monitor)
SEOタイトル: Oracle PMON プロセス入門 — 異常終了セッションの後始末役

この記事の要点
  • PMON (Process Monitor) = Oracle インスタンスの常駐バックグラウンドプロセスのひとつ。異常終了したユーザープロセスの後始末 を担当
  • 具体仕事: ロールバック / 保持ロックの解放 / セッションリソースの返却 / リスナーへのサービス登録 (12c までは PMON、12.1.0.2+ は LREG)
  • SMON との違い: PMON は プロセス障害、SMON は インスタンス障害復旧 / 一時セグメント掃除
  • 存在確認は SELECT * FROM v$bgprocess WHERE name = "PMON"; または OS で ps -ef | grep ora_pmon
  • PMON が止まると即座にインスタンスが落ちる — 監視は v$bgprocess + OS プロセス監視の二段構え

PMON とは

Oracle のインスタンスが起動すると同時に常駐し、異常終了したユーザープロセス (サーバプロセス) の後始末 を行うバックグラウンドプロセスです。名前は Process Monitor の頭文字。OS 上では ora_pmon_ という名前で確認できます。

$ ps -ef | grep ora_pmon
oracle    1234     1  0 09:00 ?  00:00:01 ora_pmon_ORCL

PMON の仕事

動作内容
異常終了プロセスのロールバック未コミット トランザクションを UNDO セグメントから取消し
ロック / Latch の解放セッションが保持していた行ロック・テーブルロックを開放
リソース解放PGA メモリ、テンポラリセグメント、ファイルハンドル等を回収
SCAN/リスナー登録12.1.0.1 以前: PMON がリスナーにサービスを登録 (12.1.0.2+ は LREG が担当)
共有サーバの監視共有サーバ構成でディスパッチャー / 共有サーバプロセスを監視

クライアントが「ABORT」したらどうなる?

典型例 — クライアント (アプリ) が kill -9 で落ちたり、ネットワークが切れたりすると、対応する サーバプロセス (ora_jXXX, oraclesomething) もすぐ終了します。すると…

1. クライアント (java/php/...) が異常終了
        │
        ▼
2. 対応するサーバプロセスが SIGPIPE 等を検知して終了
        │
        ▼
3. PMON が定期スキャン (数秒間隔) でその死亡を検知
        │
        ▼
4. UNDO を読んで未コミット変更をロールバック
        │
        ▼
5. 保持ロックを解放 (これにより他セッションの待機が解除)
        │
        ▼
6. v$session から消滅

「クライアントを kill したのに DB のロックがしばらく解けない」という現象は、PMON が 次のスキャン周期に到達するまでのラグ です。通常は数秒〜十数秒で解消します。

SMON との違い

プロセス担当
PMON (Process Monitor)個別ユーザープロセスの障害復旧
SMON (System Monitor)インスタンス起動時のクラッシュリカバリ、一時セグメント掃除、辞書管理表領域の空き連結
LREG (Listener Registration, 12.1.0.2+)サービスをリスナーに登録 (旧 PMON の機能)
CKPT (Checkpoint)チェックポイント発火、データファイルヘッダ更新
DBWnバッファ キャッシュからデータファイルへの書き出し
LGWRREDO ログバッファから REDO ログファイルへ書き出し

確認コマンド

v$bgprocess で確認

-- PADDR が NULL ではない = 起動中
SELECT name, description, paddr
FROM   v$bgprocess
WHERE  name = 'PMON';

-- NAME | DESCRIPTION                | PADDR
-- PMON | process cleanup            | 00000000866D8000   ← 0 でなければ起動中

OS から見る

# Linux / Unix
ps -ef | grep ora_pmon_$ORACLE_SID

# Windows (PMON は別スレッドとして起動)
sqlplus / as sysdba
SQL> SELECT spid FROM v$process WHERE program LIKE '%PMON%';

PMON が動いていない場合のトラブル

PMON はインスタンスの必須プロセスです。何らかの理由で PMON が落ちると、Oracle はインスタンス全体を強制終了します (ORA-00474)。

ORA-00474: SMON process terminated with error
ORA-00474: PMON process terminated with error
→ アラートログに「Instance terminated by USER, pid = ...」
→ DB がダウンしている → 起動し直し

頻繁に起きる場合は次を疑います。

  • OS のメモリ不足で OOM Killer に殺された (Linux /var/log/messages を確認)
  • 共有メモリ (SHM) 関連カーネルパラメータの不足
  • ストレージ I/O 障害でアラートログに ORA-27300 系
  • 同一サーバ内の他インスタンスが暴走 (RAC でない単体構成では特に注意)
  • パッチ適用直後の不整合 — Oracle Support に問い合わせ前にアラートログと trace ファイルを採取

アラートログでの調査ポイント

PMON 関連の事象はアラートログ ($ORACLE_BASE/diag/rdbms///trace/alert_.log) に出ます。次のキーワードで grep すると早いです。

# PMON 関連のメッセージ
grep -i pmon alert_ORCL.log

# 通常時に出る情報
# PMON started with pid=2, OS id=12345

# 異常終了時に出る情報
# PMON (ospid: 12345): terminating the instance due to error 472
# Instance terminated by PMON, pid = 12345

自動起動

PMON は STARTUP 時に Oracle が必ず起動する マンダトリ (必須) プロセスです。spfileinit.ora でオン/オフを設定する仕組みはありません。インスタンスが上がっていれば必ず存在し、止まっていれば必ず存在しません。

関連バックグラウンドプロセスとの分担

名前正式名主な役割
PMONProcess Monitorプロセス異常終了の後始末、ロック解放
SMONSystem Monitorインスタンスクラッシュ後のリカバリ、空き連結
LREGListener Registration (12.1.0.2+)リスナーへのサービス登録 (旧 PMON 機能)
CKPTCheckpoint Processチェックポイント発火、ファイルヘッダ更新
DBWnDatabase Writerバッファキャッシュからデータファイルへの書出し
LGWRLog WriterREDO ログバッファから REDO ファイルへ書出し
ARC0〜Archiverオンライン REDO を Archive Log へコピー
MMONManageability MonitorAWR スナップショット採取、メトリクス集計

PMON の状態を継続監視する

# シェルスクリプトで cron 1 分間隔監視
#!/bin/bash
for sid in $(ps -ef | grep ora_pmon_ | grep -v grep | awk -F_ '{print $3}'); do
    pid=$(pgrep -f "ora_pmon_${sid}")
    if [ -z "$pid" ]; then
        echo "ALERT: PMON for $sid is DOWN at $(date)" | \
          mail -s "Oracle PMON DOWN" dba@example.com
    fi
done

監視ツール (Zabbix / Oracle Enterprise Manager / Datadog) を使う場合は、v$bgprocess の PADDR が 0 でないことと、対応する OS プロセスが存在することの 2 重チェック をかけるのが定石です。

FAQ

Q: クライアントを kill してもロックが解放されない
A: PMON のスキャン周期 (通常数秒〜十数秒) を待ってください。ずっと解けない場合は v$session でセッションが残っていないか確認し、必要なら ALTER SYSTEM KILL SESSION 'sid,serial#' を実行します。

Q: PMON のスキャン間隔を短くできますか?
A: 公開された設定値はありません。_pmon_interval 等の隠しパラメータはありますが、サポート未承認の変更は本番では避けてください。

Q: 12c 以降はリスナー登録は誰がやる?
A: 12.1.0.2 以降は LREG プロセスが新設され、リスナーへのサービス登録は LREG の担当に分離されました。PMON は本来の「プロセス監視」業務に専念しています。