專用伺服器是 Oracle 預設連線模式。理解其進程建立機制、一對一映射關係、記憶體存取路徑,是診斷連線數暴增、PGA 記憶體不足等問題的基礎。本文結合架構圖深度解析。
1. Client 執行:sqlplus scott/tiger@orcl
│
▼
2. Client 讀取 tnsnames.ora 解析 orcl → Host:Port, SID/Service
│
▼
3. Client 向 Listener (Port 1521) 發起 TCP 連線請求
│
▼
4. Listener 接收請求,驗證 SID/Service 存在
│
▼
5. Listener fork() 子進程 → exec() Oracle 專用伺服器程式
│
▼
6. 子進程繼承 Listener 的 Socket 檔案描述符
│
▼
7. 子進程 shmat() 附掛 SGA 共享記憶體段
│
▼
8. Client 直接與專用伺服器進程通訊 (SQL/結果集)
┌─────────────────────────────────────────────────────────────────────────────┐
│ Client Machine │
│ ┌──────────────┐ │
│ │ sqlplus / │ TCP/IP Socket │
│ │ App Process │ ──────────────────────────────┐ │
│ └──────────────┘ │ │
└─────────────────────────────────────────────────│───────────────────────────┘
│
▼
┌─────────────────────────────────────────────────────────────────────────────┐
│ Server Machine │
│ │
│ ┌──────────────┐ fork()/exec() ┌──────────────────────────────┐ │
│ │ Listener │ ──────────────────► │ Dedicated Server Process │ │
│ │ (Port 1521) │ (繼承 Socket) │ - Private PGA/UGA │ │
│ └──────────────┘ │ - shmat() → SGA │ │
│ │ - 處理 SQL, 存取資料檔 │ │
│ └──────────────┬───────────────┘ │
│ │ │
│ Memory Access Disk I/O
│ │ │
│ ▼ ▼
│ ┌────────────────────────┐ ┌──────────────┐
│ │ SGA │ │ Datafiles │
│ │ (Shared Memory Seg) │ │ (Physical) │
│ └────────────────────────┘ └──────────────┘
└─────────────────────────────────────────────────────────────────────────────┘
# 連線前
$ ps -ef | grep ora_
oracle 1234 1 0 10:00 ? 00:00:00 ora_pmon_ORCL
oracle 1236 1 0 10:00 ? 00:00:00 ora_dbw0_ORCL
oracle 1238 1 0 10:00 ? 00:00:00 ora_lgwr_ORCL
... (背景進程)
# 連線後 (sqlplus 登入)
$ ps -ef | grep ora_
oracle 1234 1 0 10:00 ? 00:00:00 ora_pmon_ORCL
oracle 1236 1 0 10:00 ? 00:00:00 ora_dbw0_ORCL
oracle 1238 1 0 10:00 ? 00:00:00 ora_lgwr_ORCL
oracle 5678 1234 0 10:05 ? 00:00:00 oracleORCL (LOCAL=NO) ← 新增專用伺服器進程
# 登出後,5678 進程消失
| 區域 | 位置 | 內容 | 生命週期 |
|---|---|---|---|
| PGA | 進程私有堆疊 | 排序區、雜湊區、Session 資訊、游標狀態 | 進程結束釋放 |
| UGA | PGA 內 (專用伺服器模式) | Package 變數、PL/SQL 執行上下文 | Session 結束釋放 |
| SGA | 共享記憶體段 | Buffer Cache、Shared Pool、Redo Log Buffer | 實例生命週期 |
| 優點 | 缺點 |
|---|---|
| 強隔離:單 Session 故障不影響他人 | 高並發時進程數暴增 (OS 進程上限、Context Switch 開銷) |
| 簡單模型:除錯、追蹤容易 (strace/pstack 單進程) | 記憶體佔用大:每進程獨立 PGA+UGA (通常 1-10MB+) |
| 適合長連線、複雜操作、批次作業 | 不適合 Web 應用大量短連線 |
| 無共用伺服器限制 (部分 PL/SQL、DB Link 行為) | 連線建立延遲較高 (fork/exec 開銷) |
-- 專用伺服器進程數
SELECT COUNT(*) FROM v$process
WHERE background = 'NO'
AND program NOT LIKE '%(PMON|SMON|DBW|LGWR|CKPT|ARC|RECO|MMON|MMNL)%';
-- 當前 Session 連線模式
SELECT sid, serial#, username, server, machine, program
FROM v$session
WHERE type = 'USER' AND server = 'DEDICATED';
-- PGA 記憶體使用 (專用伺服器)
SELECT s.sid, s.username, p.pga_used_mem/1024/1024 AS pga_mb,
p.pga_alloc_mem/1024/1024 AS pga_alloc_mb,
p.pga_max_mem/1024/1024 AS pga_max_mb
FROM v$session s
JOIN v$process p ON s.paddr = p.addr
WHERE s.server = 'DEDICATED'
ORDER BY p.pga_used_mem DESC;
專用伺服器以**進程隔離**換取**簡單可靠**。掌握 `Listener → fork/exec → shmat → 直接通訊` 流程、理解 PGA/UGA 記憶體模型、監控進程數與 PGA 使用量,是穩定運行高並發 Oracle 系統的基本功。現代架構下,結合**應用層連線池 + 專用伺服器**或 **DRCP**,能在隔離性與資源效率間取得最佳平衡。