2.

Oracle サーバープロセス 完全ガイド(専用 / 共有 / クライアント接続 / PGA / バックグラウンドプロセスとの違い)

編集
この記事の要点
  • サーバープロセスはクライアントセッションごとに SQL を受け取り実行する Oracle のプロセス
  • SQL のパース・実行・結果返却・データブロックの読み込みを担当する
  • 接続モードは 専用サーバー(Dedicated)共有サーバー(Shared / MTS)の 2 種類
  • 専用はクライアント 1 : サーバープロセス 1、共有は多 : 少でディスパッチャ経由
  • 各サーバープロセスは専用のメモリ領域 PGA(プログラム・グローバル領域)を持つ

サーバープロセスとは

Oracle Database には大きく 2 種類のプロセスがあります。バックグラウンドプロセス(DBWn / LGWR / SMON 等、DB 全体の保守を行う)と、サーバープロセス(個々のクライアント要求を処理する)です。サーバープロセスはユーザーセッションごとに SQL を受け取り、解析し、実行し、結果を返す役割を担います。

サーバープロセスの仕事

  1. クライアント(アプリケーション / sqlplus)から SQL を受信
  2. パース(構文解析・最適化)— ライブラリキャッシュ参照
  3. 必要なデータブロックをバッファキャッシュへロード(無ければデータファイルから物理読み込み)
  4. 実行— 結果セットを構築
  5. クライアントへ結果を返却
  6. INSERT/UPDATE/DELETE では REDO エントリを REDO バッファへ書き込み

サーバープロセスはデータファイルを直接書き込まないのがポイント。書き込みは DBWn(DB Writer)、REDO の永続化は LGWR(Log Writer)といったバックグラウンドプロセスが担当します。

接続モード: 専用サーバーと共有サーバー

項目専用サーバー(Dedicated)共有サーバー(Shared / MTS)
対応関係クライアント 1 : プロセス 1多 : 少(プール)
仲介無し(直結)ディスパッチャ + リクエストキュー
PGA 配置サーバープロセス内SGA の Large Pool 内(UGA)
応答速度高速・安定キュー待ちが発生しうる
リソース効率接続数に比例して増える同時接続数が多い OLTP に有利
典型用途長時間バッチ / 業務大量の短時間 OLTP

専用サーバーの流れ

クライアントが接続要求 → リスナー(Listener)が新しいサーバープロセスを起動 → 以後そのクライアント専用に SQL を処理。切断時にプロセスも終了。

共有サーバーの流れ

クライアントが接続要求 → リスナーが空いているディスパッチャへ振り分け → ディスパッチャがリクエストをキューへ → 共有サーバープロセスがキューから取り出して処理 → レスポンスをキュー経由で返却。

関連メモリ構造(PGA / UGA)

領域内容専用サーバーでの場所共有サーバーでの場所
PGAセッション固有の作業領域(ソート / ハッシュ等)サーバープロセス内サーバープロセス内
UGAセッション変数 / カーソル状態PGA 内SGA の Large Pool 内
SGAバッファキャッシュ / 共有プール / REDO バッファ等共有共有

確認コマンド

-- セッション一覧(サーバープロセス含む)
SELECT s.sid, s.serial#, s.username, s.machine,
       s.program, s.server, s.status, p.spid AS os_pid
  FROM v$session s
  JOIN v$process p ON p.addr = s.paddr
 WHERE s.username IS NOT NULL;

-- 接続モード(DEDICATED / SHARED)
SELECT username, server, count(*)
  FROM v$session
 WHERE username IS NOT NULL
 GROUP BY username, server;

-- PGA 使用状況
SELECT name, value/1024/1024 AS mb
  FROM v$pgastat
 WHERE name IN ('total PGA allocated','total PGA inuse','maximum PGA allocated');

OS から見たサーバープロセス

Linux/Unix では oracle<SID>_<SPID> または ora_* のような名前で見えます。v$process.spid が OS の PID と対応するため、性能トラブル時は top / ps と突き合わせて特定します。

# 専用サーバーのプロセス
$ ps -ef | grep oracle | grep LOCAL
oracle 12345 1 0 10:00 ? 00:00:01 oracleORCL (LOCAL=NO)

関連トラブルと対処

症状原因 / 対処
ORA-12500 / ORA-12520(プロセス起動失敗)OS の nproc 上限 / Oracle の processes 上限超過。拡張する
ORA-04030(PGA メモリ不足)大きなソートや CLOB 処理で PGA 不足。pga_aggregate_target 増、SQL チューニング
セッションが切れないアプリのコネクションリーク。プール設定見直し / SQLNET.EXPIRE_TIME
共有サーバーで遅いディスパッチャ / 共有サーバープロセス不足。dispatchers / shared_servers

専用と共有を切り替える

-- 現在の設定を確認(init.ora / spfile)
SHOW PARAMETER dispatchers;
SHOW PARAMETER shared_servers;

-- 共有サーバーを有効化(例: TCP のディスパッチャを 4 個、共有サーバーを 8 個)
ALTER SYSTEM SET dispatchers='(PROTOCOL=TCP)(DISPATCHERS=4)' SCOPE=BOTH;
ALTER SYSTEM SET shared_servers=8 SCOPE=BOTH;

-- クライアント側の接続文字列でも明示できる
-- (SERVER=DEDICATED) / (SERVER=SHARED)

専用サーバーがデフォルトで、明示的に共有サーバーを設定しない限りクライアント接続は常に専用です。短い OLTP が数千〜数万セッション飛んでくるシステムでは共有サーバーが効きますが、解析用 / 集計用のセッションは専用のままにします。

ライフサイクル

  1. クライアントがネットワーク経由でリスナーに接続要求
  2. リスナーがサーバープロセスをfork / spawn(専用)または既存ディスパッチャに振る(共有)
  3. 認証成功後、サーバープロセスがクライアントと直接通信開始
  4. クライアントから EXIT / コネクション断 → サーバープロセス終了 / プールに戻る

関連

編集
Post Share
子ページ

子ページはありません

同階層のページ
  1. ユーザープロセス
  2. サーバープロセス

最近更新/作成されたページ