首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 數據庫知識 >  >> Oracle 資料庫 >> Oracle 資料庫基礎

Oracle 專用伺服器連線架構圖解:進程建立、一對一映射、記憶體存取路徑

     編輯:Oracle 資料庫基礎

前言

專用伺服器是 Oracle 預設連線模式。理解其進程建立機制、一對一映射關係、記憶體存取路徑,是診斷連線數暴增、PGA 記憶體不足等問題的基礎。本文結合架構圖深度解析。

一、專用伺服器核心特徵

  • 按需建立:客戶端連線時,Listener 建立新進程/執行緒
  • 專屬服務:該進程僅服務單一 Session,生命週期綁定
  • 一對一映射:N 個 Session = N 個專用伺服器進程
  • 非實例背景進程:不屬於 PMON/SMON/DBWn/LGWR 等背景進程集合
  • 直接通訊:客戶進程透過 TCP/IP Socket 直接與專用伺服器通訊

二、連線建立流程 (以 UNIX 為例)

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/結果集)

三、Windows 平台差異

  • Listener 為單一進程多執行緒
  • 接收請求後,請求資料庫主進程建立**新執行緒**
  • Client 「重導向」至新執行緒
  • 所有執行緒共享同一虛擬記憶體空間,**天然可見 SGA** (無需 shmat)

四、架構圖解:典型專用伺服器配置

┌─────────────────────────────────────────────────────────────────────────────┐
│                              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)  │
│                                        └────────────────────────┘ └──────────────┘
└─────────────────────────────────────────────────────────────────────────────┘

五、進程視圖驗證 (UNIX)


# 連線前
$ 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 + UGA 在專用伺服器中

區域位置內容生命週期
PGA進程私有堆疊排序區、雜湊區、Session 資訊、游標狀態進程結束釋放
UGAPGA 內 (專用伺服器模式)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;

九、最佳實踐建議

  1. 連線池化:應用層使用 UCP/HikariCP/Druid 復用連線,減少建立/銷毀開銷
  2. PGA 管理:啟用 `WORKAREA_SIZE_POLICY=AUTO` + `PGA_AGGREGATE_TARGET`,避免手工 `SORT_AREA_SIZE`
  3. OS 限制調整:`ulimit -u` (max user processes)、`/etc/security/limits.conf` nproc 設足夠大
  4. 監控告警:專用伺服器進程數 > 閾值 (如 80% OS 限制) 觸發告警
  5. 考慮 DRCP (11g+):Database Resident Connection Pool,資料庫層連線池,兼具專用隔離與共用效率

結語

專用伺服器以**進程隔離**換取**簡單可靠**。掌握 `Listener → fork/exec → shmat → 直接通訊` 流程、理解 PGA/UGA 記憶體模型、監控進程數與 PGA 使用量,是穩定運行高並發 Oracle 系統的基本功。現代架構下,結合**應用層連線池 + 專用伺服器**或 **DRCP**,能在隔離性與資源效率間取得最佳平衡。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved