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

Oracle 進程架構詳解:使用者進程、伺服器進程與五大背景進程職責對照

     編輯:Oracle 資料庫基礎

Oracle 進程架構分為使用者進程、伺服器進程 (專用/共用) 與背景進程三大類。本文詳細說明各進程啟動時機、互動流程、五大核心背景進程 (PMON/SMON/DBWn/LGWR/CKPT) 具體職責與異常影響,建立進程層面的故障排查心智模型。

三大進程類別

類別啟動時機主要職責數量關係
使用者進程用戶端工具啟動連線時 (SQL*Plus、JDBC、ODP.NET)發送 SQL 請求、接收結果、管理 Session 狀態1:1 對應用戶連線
伺服器進程Session 建立時 (專用) / Dispatcher 分派時 (共用)解析/執行 SQL、存取 SGA/資料檔、回傳結果專用: 1:1 對 Session
共用: 多 Session 共用少量進程
背景進程執行個體啟動 (STARTUP) 時自動啟動非同步執行核心維護工作 (寫入、復原、監控、清理)固定核心組 + 功能性可選組

五大核心背景進程詳細職責

  1. PMON (Process Monitor)
    • 偵測使用者/伺服器進程異常終止 (ORA-00600、OS Kill、網路斷線)。
    • 清理遺留資源:釋放鎖、回滾未提交交易、釋放 SGA 記憶體 (PGA)、移除 Session 資訊。
    • 定期註冊執行個體資訊至 Listener (服務動態註冊)。
  2. SMON (System Monitor)
    • 執行個體啟動時執行 Instance Recovery:讀取 Online Redo Log,Roll Forward 提交交易、Roll Back 未提交交易。
    • 合併臨時段 (Temp Segment) 釋放連續空間。
    • 清理無用暫存段 (如長交易留下的 Undo)。
  3. DBWn (Database Writer, n=0~9, 10gR2 可多進程)
    • 將 Dirty Buffer (LRU List 尾端、Checkpoint、Tablespace Offline/Read-only、Drop Table) 寫入資料檔。
    • 採用多區塊寫入 (Multiblock Write) 提高 IO 效率。
    • 觸發條件:LRU 掃描發現髒塊、Checkpoint、Log Switch、Tablespace 狀態變更。
  4. LGWR (Log Writer)
    • 將 Redo Log Buffer 循環緩衝區內容順序寫入 Online Redo Log Group (多工成員)。
    • 觸發條件:Commit、1/3 Buffer 滿、3MB 紅日誌、每 3 秒、DBW 寫入前 (Write-Ahead Logging)、Checkpoint。
    • 同步寫入 (Commit 等待 LGWR 完成) 保證持久性 (Durability)。
  5. CKPT (Checkpoint)
    • 更新控制檔與資料檔標頭的 Checkpoint SCN,標記「此 SCN 前的所有變更已持久化」。
    • 觸發 DBW 寫入對應髒塊,縮短 Instance Recovery 時間。
    • 參數控制:LOG_CHECKPOINT_INTERVAL、LOG_CHECKPOINT_TIMEOUT、FAST_START_MTTR_TARGET (10g+)。

其他重要背景進程

進程功能啟用條件
ARCH歸檔 Redo Log 至歸檔目的地ARCHIVELOG 模式
RECO解決分散式交易 In-doubt 狀態分散式交易環境
MMON / MMNLAWR 快照收集 / ASH 即時取樣STATISTICS_LEVEL=TYPICAL/ALL
CJQ0Job Queue 排程執行 (DBMS_JOB/SCHEDULER)JOB_QUEUE_PROCESSES > 0
QMNnAdvanced Queuing 佇列監控AQ 功能啟用
SMCOSpace Management Coordinator (12c+ 自動段空間整理)自動段空間管理

進程視圖查詢


-- 背景進程
SELECT name, description FROM v$bgprocess WHERE paddr != '00';

-- 伺服器進程 (專用/共用)
SELECT s.sid, s.serial#, s.username, p.spid, p.program, s.server
FROM v$session s JOIN v$process p ON s.paddr = p.addr
WHERE s.type != 'BACKGROUND';

-- 使用者進程對應 OS PID (Linux/Unix)
-- Windows 查詢 v$process.spid 即為 Thread ID

故障排查場景對應

現象疑似進程檢查方向
大量 Session 殭屍、鎖不釋放PMONPMON 是否存活、清理速度、V$SESSION_WAIT 鎖等待
啟動極慢、Instance Recovery 久SMON/CKPTRedo Log 大小、Checkpoint 頻率、FAST_START_MTTR_TARGET
Commit 延遲高、log file sync 等待LGWRRedo Log 檔案 IO 延遲、檔案多工成員磁碟爭用、LOG_BUFFER 大小
Checkpoint not complete、Log Switch 頻繁CKPT/DBWRedo Log Group 數量/大小、DBW 寫入吞吐、LOG_CHECKPOINT_INTERVAL
歸檔目的地空間滿、資料庫 HangARCH歸檔目的地空間、LOG_ARCHIVE_DEST_n 狀態、V$ARCHIVE_DEST_STATUS

理解進程分工與互動,能從「等待事件」快速定位到具體背景進程瓶頸,實施精準調優與故障排除。

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