タイトル: PMON (Process Monitor)
SEOタイトル: Oracle PMON プロセス入門 — 異常終了セッションの後始末役
| この記事の要点 |
|
PMON とは
Oracle のインスタンスが起動すると同時に常駐し、異常終了したユーザープロセス (サーバプロセス) の後始末 を行うバックグラウンドプロセスです。名前は Process Monitor の頭文字。OS 上では ora_pmon_<SID> という名前で確認できます。
$ 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 | バッファ キャッシュからデータファイルへの書き出し |
| LGWR | REDO ログバッファから 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/<db>/<sid>/trace/alert_<sid>.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 が必ず起動する マンダトリ (必須) プロセスです。spfile や init.ora でオン/オフを設定する仕組みはありません。インスタンスが上がっていれば必ず存在し、止まっていれば必ず存在しません。
関連バックグラウンドプロセスとの分担
| 名前 | 正式名 | 主な役割 |
|---|---|---|
| PMON | Process Monitor | プロセス異常終了の後始末、ロック解放 |
| SMON | System Monitor | インスタンスクラッシュ後のリカバリ、空き連結 |
| LREG | Listener Registration (12.1.0.2+) | リスナーへのサービス登録 (旧 PMON 機能) |
| CKPT | Checkpoint Process | チェックポイント発火、ファイルヘッダ更新 |
| DBWn | Database Writer | バッファキャッシュからデータファイルへの書出し |
| LGWR | Log Writer | REDO ログバッファから REDO ファイルへ書出し |
| ARC0〜 | Archiver | オンライン REDO を Archive Log へコピー |
| MMON | Manageability Monitor | AWR スナップショット採取、メトリクス集計 |
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 は本来の「プロセス監視」業務に専念しています。