**「資料庫 ≠ 實例」** 是 Oracle 從業者必須刻入基因的核心認知。**資料庫** 是靜態檔案集合 (資料檔、控制檔、Redo Log);**實例** 是動態記憶體結構 (SGA) + 背景進程群組,負責所有運行時服務。本文深度解析 **實例組成、SGA 內部結構、關鍵背景進程、三階段啟動流程、單/多進程架構差異、參數配置鐵律**。
| 組件 | 功能 | 關鍵參數 |
| Shared Pool (共用池) | Library Cache (SQL/PLAN)、Dictionary Cache、Server Result Cache | `SHARED_POOL_SIZE`, `SHARED_POOL_RESERVED_SIZE` |
| Database Buffer Cache (資料庫緩衝區) | 資料塊副本 (一致性讀、髒塊)、LRU 列表、Keep/Recycle/Default Pool | `DB_CACHE_SIZE`, `DB_nK_CACHE_SIZE` |
| Redo Log Buffer (重做日誌緩衝) | Redo Entries 循環緩衝,LGWR 批次寫入 Redo Log File | `LOG_BUFFER` (通常自動調整) |
| Large Pool (大池) | 備份/恢復 (RMAN)、共用伺服器 UGA、並行查詢訊息緩衝 | `LARGE_POOL_SIZE` |
| Java Pool | JVM 物件、Session 狀態 (Java Stored Procedure) | `JAVA_POOL_SIZE` |
| Streams Pool | Streams/GoldenGate/Advanced Queuing | `STREAMS_POOL_SIZE` |
| In-Memory Area (12c+) | Columnar 格式資料,分析查詢加速 | `INMEMORY_SIZE` |
| Fixed SGA | 鎖/閂結構、實例狀態資訊 (不可調整) | - |
記憶體管理模式: **ASMM (Auto Shared Memory Management, `SGA_TARGET`)** 或 **AMM (Automatic Memory Management, `MEMORY_TARGET`)**。生產建議 ASMM,保留 OS 頁面快取空間。
關鍵背景進程 —— 實例的「手」
| 進程 | 全名 | 核心職責 | 關鍵特徵 |
| PMON | Process Monitor | 清理失敗進程資源、釋放鎖、重註冊服務到 Listener | 實例守護進程,異常終結會導致實例崩潰 |
| SMON | System Monitor | 實例恢復 (前滾/回滾)、臨時段清理、空間合併 | 啟動時自動觸發恢復 |
| DBWn | Database Writer (n=0-9, 20-31) | 將髒塊從 Buffer Cache 寫入資料檔 (LRU/Checkpoint/Truncate 觸發) | 多進程提升寫入並行度 |
| LGWR | Log Writer | 將 Redo Log Buffer 寫入線上 Redo Log File (Commit/1/3MB/1s/Log Switch 觸發) | 單進程序列化寫入,關鍵路徑 |
| CKPT | Checkpoint | 更新資料檔頭/控制檔 Checkpoint SCN、觸發 DBWn 寫入 | 不直接寫資料,協調 DBWn |
| ARCn | Archiver | 將填滿的線上 Redo Log 複製為 Archived Redo Log | 多進程 (n=0-9, 10-30),歸檔模式必備 |
| RECO | Recoverer | 解決分散式交易掛起 (Two-Phase Commit) | 分散式環境必備 |
| MMON/MMNL | Manageability Monitor | AWR 快照收集、閾值告警、自動調優任務 | 10g+ 自動維護核心 |
三階段啟動流程
- NOMOUNT (啟動實例):
- 讀取參數檔 (SPFILE → PFILE) → 確定 SGA 大小、進程數量
- 分配 SGA 共享記憶體段 → 啟動背景進程
- 實例名由 `ORACLE_SID` 環境變數決定
- MOUNT (掛載資料庫):
- 讀取控制檔 (參數 `CONTROL_FILES` 指定路徑)
- 控制檔變可讀/可寫,可查詢 `V$DATABASE`, `V$DATAFILE`, `V$LOGFILE`
- **僅 DBA 可連線** (RESTRICTED SESSION)
- OPEN (開啟資料庫):
- 線上 Redo Log、資料檔以排他鎖開啟
- 資料庫進入正常服務狀態,所有用戶可連線
- 若需恢復 → SMON 自動執行實例恢復
命令對照
STARTUP NOMOUNT -- 僅到階段 1
STARTUP MOUNT -- 到階段 2
STARTUP -- 完整到階段 3 (OPEN)
ALTER DATABASE MOUNT -- 階段 1 → 2
ALTER DATABASE OPEN -- 階段 2 → 3
SHUTDOWN [IMMEDIATE|TRANSACTIONAL|ABORT] -- 任何階段 → 完全關閉
-- 注意:無法從 OPEN 直接降級到 MOUNT,必須 SHUTDOWN 再 STARTUP MOUNT
單進程 vs 多進程架構
| 特性 | 多進程 (MTS/專用伺服器, 標準版/企業版) | 單進程 (Personal Oracle / Oracle Lite) |
| 進程模型 | 每用戶一前景進程 + 共享背景進程群 | 單一進程內執行所有功能 (前景+背景) |
| 記憶體 | SGA (共享) + PGA (私有) | 單一記憶體空間 (無 SGA/PGA 區分) |
| 並發 | 高 (數千用戶) | 極低 (單用戶/極少並發) |
| 適用場景 | 生產、開發、測試、所有 Server 端部署 | 嵌入式、行動裝置、桌面單機應用 |
參數配置鐵律:init.ora / SPFILE
- 動態參數 (ALTER SYSTEM SET ... SCOPE=BOTH/MEMORY/SPFILE):大多數效能參數 (`SGA_TARGET`, `PGA_AGGREGATE_TARGET`, `OPTIMIZER_MODE`...)。
- 靜態參數 (需重啟實例): `DB_BLOCK_SIZE`, `DB_NAME`, `CONTROL_FILES`, `COMPATIBLE`, `PROCESSES`, `SESSIONS`...。
- 隱藏參數 (`_` 開頭): **嚴禁生產環境隨意修改**,除非 Oracle Support 明確指導 (SR 記錄)。
- 無文檔參數: 同隱藏參數,極高風險。
- 查詢所有參數: `SELECT ksppinm, ksppdesc FROM x$ksppi;` (內部表,謹慎使用)。
配置調優核心哲學
- **基線優先:** 預設值 → 負載測試 → 瓶頸識別 → 針對性調整 → 驗證 → 固化。
- **監控導向:** `V$SGASTAT`, `V$SGA_RESIZE_OPS`, `V$PGASTAT`, `V$SYSSTAT` (buffer gets, physical reads, redo size...)。
- **變更管控:** 所有參數變更記錄於變更管理系統,含變更前後基線對比報告。
理解實例架構,是從「會用 Oracle」進化為「懂 Oracle」的分水嶺。SGA 是大腦,背景進程是手,參數檔是基因,啟動流程是生命週期。**守住架構認知,調優才有的放矢。**
- 上一篇文章: Oracle SQL 效能調優兩大核心步驟:優化器模式選擇與表存取路徑決策
- 下一篇文章: Oracle SQL 效能優化綜合指南:優化器選擇、表存取、共享游標、連接順序四大支柱實戰
Copyright ©
程式碼之家 All Rights Reserved