Oracle は複数のバックグラウンドプロセスが連携してデータベースを稼働させています。これらのプロセスはユーザーセッションとは独立して動作し、データ書き込み・ログ書き込み・リカバリ・アーカイブ・メモリ管理などを担当します。
バックグラウンドプロセスの役割を理解することは、パフォーマンス問題・障害発生時の診断に直結します。
- 主要バックグラウンドプロセスの役割と動作タイミング
- 各プロセスに関連する待機イベント・パラメータ・監視ポイント
- V$BGPROCESS・V$SESSION・V$PROCESS でプロセス状態を確認する方法
- プロセスが関係するトラブルの診断方法
バックグラウンドプロセスの一覧を確認する
-- 起動中のバックグラウンドプロセス一覧(V$PROCESS と結合)
SELECT
b.name, -- プロセス名(例: DBWR, LGWR, CKPT など)
b.description, -- プロセスの説明
p.pid, -- Oracle プロセス ID
p.spid, -- OS プロセス ID
p.pga_used_mem / 1024 / 1024 AS pga_mb
FROM V$BGPROCESS b
JOIN V$PROCESS p ON b.paddr = p.addr
WHERE b.paddr != '00' -- 実際に起動しているプロセスのみ
ORDER BY b.name;
-- セッションレベルで確認する場合(バックグラウンドセッション)
SELECT
s.sid,
s.program,
s.status,
s.event,
s.seconds_in_wait
FROM V$SESSION s
WHERE s.type = 'BACKGROUND'
ORDER BY s.program;
主要バックグラウンドプロセスの役割
DBWR / DBW0〜DBWn(Database Writer)
バッファキャッシュ上のダーティバッファ(変更済みブロック)をデータファイルに書き出すプロセスです。書き込みタイミングは以下のとき:
- チェックポイント(CKPT からの指示)
- バッファキャッシュが枯渇してきたとき(free buffer waits が発生)
- タイムアウト(3秒ごと)
| 関連パラメータ・ビュー | 内容 |
|---|---|
| DB_WRITER_PROCESSES | DBWR プロセス数(デフォルト1、CPUコア数に合わせて増やす) |
| V$SYSSTAT: “physical writes” | 物理書き込み回数 |
| 待機: free buffer waits | バッファキャッシュが不足してDBWRの書き込みを待っている状態 |
LGWR(Log Writer)
オンライン REDO ログバッファの内容をオンライン REDO ログファイルに書き出すプロセスです。書き込みタイミングは以下のとき:
- COMMIT が実行されたとき(ユーザーは LGWR の書き込み完了を待つ)
- REDO ログバッファが 1/3 以上埋まったとき
- DBWR がデータファイルに書き込む前
- 3秒ごとのタイムアウト
| 関連パラメータ・ビュー | 内容 |
|---|---|
| LOG_BUFFER | REDO ログバッファのサイズ(デフォルト: 通常1〜8MB) |
| 待機: log file sync | COMMIT 時にユーザーセッションが LGWR の書き込み完了を待つ |
| 待機: log buffer space | REDO ログバッファが満杯でユーザーが書き込みを待つ |
| 待機: log file parallel write | LGWR がログファイルへの書き込みを待つ(I/O 速度が問題) |
CKPT(Checkpoint)
チェックポイントを開始し、データファイルヘッダーと制御ファイルに最新の SCN(System Change Number)を記録します。DBWR への書き込み指示もチェックポイント処理の一部です。
チェックポイントはインスタンスリカバリ時に必要な REDO ログの量を決定します。FAST_START_MTTR_TARGET パラメータでチェックポイント頻度を制御できます。
SMON(System Monitor)
SMON は以下の重要な役割を持ちます:
- インスタンスリカバリ:DB 起動時に REDO ログを適用してクラッシュ前の状態に復元する
- 一時セグメントの解放:ソート・ハッシュ結合などで使った TEMP 領域のうち不要になったものを解放する
- 空きエクステントの結合:辞書管理表領域(旧来の方式)で断片化した空きエクステントを結合する
PMON(Process Monitor)
ユーザープロセスやサーバープロセスが異常終了した後のクリーンアップを担当します:
- 失敗したプロセスのロックを解放する
- コミットされていないトランザクションをロールバックする
- 使用中だったリソース(カーソル・メモリなど)を解放する
- リスナーへのサービス登録を定期的に更新する(動的サービス登録)
大きなトランザクションが途中でクラッシュすると PMON によるロールバックに長時間かかります。
V$SESSION の PMON セッションや V$TRANSACTION の USED_UBLK(使用中の UNDO ブロック数)を確認することで進捗をある程度把握できます。
ARCn(Archiver)
ARCHIVELOG モード時に、ログスイッチで使用済みになったオンライン REDO ログをアーカイブログとしてコピーします。アーカイブ先はローカルファイル・NFSマウント・FRA(Flash Recovery Area)などを指定できます。
| 関連パラメータ・ビュー | 内容 |
|---|---|
| LOG_ARCHIVE_MAX_PROCESSES | ARCn プロセス数の上限(デフォルト4) |
| LOG_ARCHIVE_DEST_n | アーカイブ先の設定(最大 31 宛先) |
| V$ARCHIVED_LOG | 生成済みアーカイブログの一覧 |
| V$ARCHIVE_DEST | アーカイブ宛先の設定と状態 |
| 待機: log file switch (archiving needed) | アーカイブが追いつかず次のグループが使えない |
MMON・MMNL(Manageability Monitor)
MMON はパフォーマンス管理機能を担当します:
- AWR スナップショットの定期的な取得(デフォルト 60 分ごと)
- ADDM(自動診断)の実行
- メトリクス収集とアラートの発行(DBA_OUTSTANDING_ALERTS / V$ALERT_TYPES)
MMNL はメモリ上の ASH(Active Session History)データを AWR に書き出す役割を担います。
MMAN(Memory Manager)
ASMM・AMM モードで SGA コンポーネントを自動調整します。バッファキャッシュが足りなければ共有プールを縮小してバッファキャッシュに割り当てるなどの調整を行います。V$SGA_DYNAMIC_COMPONENTS の last_oper_type(GROW/SHRINK)でその動作を確認できます。
CJQ0・Jnnn(Job Queue Coordinator / Worker)
DBMS_SCHEDULER・DBMS_JOB のジョブを実行するプロセスです。CJQ0 がコーディネーターとして実行タイミングを管理し、Jnnn(J000〜)が実際のジョブ処理を行います。
まとめ — バックグラウンドプロセスと待機イベントの対応関係
| プロセス | 主な役割 | 関連する代表的な待機イベント |
|---|---|---|
| DBWR | ダーティバッファをデータファイルへ書き出し | free buffer waits(バッファ不足) |
| LGWR | REDO ログバッファをオンライン REDO ログへ書き出し | log file sync(COMMIT 待ち)、log buffer space |
| CKPT | チェックポイント実行・SCN を制御ファイルに記録 | log file switch (checkpoint incomplete) |
| SMON | インスタンスリカバリ・一時セグメント解放 | — |
| PMON | 失敗プロセスのロール バック・リソース解放 | — |
| ARCn | redo ログのアーカイブコピー | log file switch (archiving needed) |
| MMON | AWR スナップショット・ADDM・アラート | — |
| MMAN | SGA 自動メモリ管理(GROW/SHRINK) | — |
| CJQ0/Jnnn | DBMS_SCHEDULER ジョブの実行 | — |
待機イベントの詳細は 待機イベント(Wait Events)完全ガイドを参照してください。オンライン REDO ログの管理手順は オンライン REDO ログ完全ガイドを参照してください。AWR・ADDM での分析は AWR・ASH完全ガイドを参照してください。