記憶體架構雙核心:SGA 與 PGA
SGA (System Global Area) — 實例級共享記憶體
- 實例啟動時分配,核心組件:
- Database Buffer Cache:儲存資料檔資料塊,LRU 算法管理,塊大小由
DB_BLOCK_SIZE 決定 (2K/4K/8K/16K/32K)
- Redo Log Buffer:重做日誌條目,
LOG_BUFFER 設定大小
- Shared Pool:Library Cache、Data Dictionary Cache
- Large Pool:備份/恢復、共享伺服器、平行執行 (可選)
- Java Pool:Java 程式碼執行 (可選)
- 子緩存:
DB_KEEP_CACHE_SIZE、DB_RECYCLE_CACHE_SIZE
- 自動管理:
ALTER SYSTEM SET DB_CACHE_ADVICE=ON;
PGA (Program Global Area) — 進程級私有記憶體
- 伺服器進程啟動時分配
- 包含:排序區、雜湊區、位圖合併區、會話資訊
- 11g+ 支援
PGA_AGGREGATE_TARGET 自動管理
進程架構三大類
1. 使用者進程 (User Process)
- 客戶端應用程式 (SQL*Plus, JDBC, OCI 等)
- 發起連線請求,不可直接與資料庫互動
2. 伺服器進程 (Server Process)
- 連線建立後產生,執行用戶 SQL
- 專用伺服器 (Dedicated) vs 共享伺服器 (Shared/MTS)
3. 背景進程 (Background Processes) — 核心守護者
| 進程 | 全名 | 核心職責 | 觸發寫入/執行條件 |
| DBWn | Database Writer | 將緩衝區髒塊寫回資料檔 | Checkpoint、髒塊達閾值、緩衝區空間不足、Timeout(3秒)、Tablespace OFFLINE/READ ONLY、DROP/TRUNCATE、BEGIN BACKUP |
| LGWR | Log Writer | 將 Redo Log Buffer 寫入線上重做日誌檔 | COMMIT、1/3 滿、1MB redo、每 3 秒、DBWn 寫入前 |
| SMON | System Monitor | 執行個體恢復、空間合併、臨時段清理 | 啟動時恢復、每 3 秒合併自由區段、啟動時清理臨時段 |
| PMON | Process Monitor | 清理異常終止進程資源 | 回滾未提交交易、釋放鎖/資源、重啟失效 Dispatcher |
| CKPT | Checkpoint | 同步資料庫一致性點 | 觸發 DBWn 寫髒塊、更新資料檔/控制檔標頭 |
| ARCn | Archiver | 歸檔線上重做日誌 | 歸檔模式下自動備份填滿的日誌組 |
關鍵寫入流程:Redo 先行協議
用戶修改 → 產生 Redo 向量 → Redo Log Buffer
↓
LGWR 寫入線上重做日誌 (COMMIT 時強制)
↓
DBWn 稍後寫入髒塊至資料檔
確保 WAL (Write-Ahead Logging):任何資料塊修改持久化前,對應 Redo 已持久化。
SQL 執行參與進程矩陣
| SQL 類型 | User Proc | Server Proc | DBWn | LGWR | CKPT | SMON | PMON | ARCn |
| SELECT | ✓ | ✓ | ✗ | ✗ | ✗ | ✗ | ✗ | ✗ |
| DML (INSERT/UPDATE/DELETE) | ✓ | ✓ | 延遲 | ✓ (COMMIT) | 間接 | ✗ | ✗ | ✗ |
| COMMIT | ✓ | ✓ | ✗ | ✓ (強制) | ✓ | ✗ | ✗ | ✗ |
| DDL | ✓ | ✓ | ✓ | ✓ | ✓ | ✗ | ✗ | ✗ |
| 備份/恢復 | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✗ | ✓ |
啟動三階段機制
- NOMOUNT:讀取參數檔 → 啟動 SGA → 啟動背景進程
- MOUNT:讀取控制檔 (位置來自參數檔) → 掛載資料庫 (恢復操作在這階段)
- OPEN:讀取資料檔/重做日誌 → 核對一致性 → 通過則開啟,失敗則需恢復
總結:架構設計哲學
- 關注點分離:記憶體 (SGA/PGA)、進程 (User/Server/BG)、儲存 (資料/控制/日誌/備份)
- 非同步協作:LGWR/DBWn 解耦 Redo 產生與資料持久化
- 自動化自癒:SMON/PMON/CKPT/ARCn 無人值守維護一致性與可用性
- 彈性擴展:共享伺服器、平行執行、RAC 多實例