開發/測試環境資源有限,需縮減 Oracle SGA 佔用以騰出記憶體給作業系統或其他服務。本文提供標準流程:`CREATE PFILE FROM SPFILE` → 編輯參數 → `SHUTDOWN` → `CREATE SPFILE FROM PFILE` → `STARTUP`,並給出 2GB 實體記憶體環境下的具體參數參考值與驗證腳本。
-- 1. 以 SYSDBA 登入
SQLPLUS "/ AS SYSDBA"
-- 2. 從 SPFILE 建立可編輯的 PFILE (文字檔)
CREATE PFILE = 'D:/cj.ora' FROM SPFILE;
-- 3. 使用文字編輯器修改 D:/cj.ora 參數 (見下表)
-- 4. 關閉資料庫
SHUTDOWN IMMEDIATE;
-- 5. 從修改後的 PFILE 重建 SPFILE
CREATE SPFILE FROM PFILE = 'D:/cj2.ora';
-- 6. 啟動資料庫
STARTUP;
-- 7. 驗證
SHOW SGA;
SHOW PARAMETER SGA;
| 參數 | 調整前 (預設/較大) | 調整後 (建議) | 說明 |
|---|---|---|---|
| SGA_MAX_SIZE | 712M | 512M | SGA 硬上限,預留 1.5GB 給 OS/PGA |
| SGA_TARGET (ASMM) | (未設/同 MAX) | 480M | SGA 動態目標,啟用 ASMM 自動平衡 |
| DB_CACHE_SIZE | 350M | 256M | Buffer Cache 最小保障 (ASMM 下為下限) |
| SHARED_POOL_SIZE | 250M | 128M | Shared Pool 最小保障 |
| LARGE_POOL_SIZE | 8M | 8M | 共享伺服器/RMAN 需求小可維持 |
| JAVA_POOL_SIZE | (預設) | 16M | 若無 Java Stored Procedure 可設 0 |
| STREAMS_POOL_SIZE | (預設) | 0 | 無 Streams/GG 可設 0 |
| LOG_BUFFER | (自動) | (自動) | 通常無需手動設定 |
| PGA_AGGREGATE_TARGET | (預設) | 200M | PGA 總量控制,防止排序/雜湊溢寫磁碟 |
-- 1. 確認 SGA 總量
SHOW SGA;
-- 2. 確認各組件實際大小
SELECT component, current_size/1024/1024 AS mb
FROM V$SGA_DYNAMIC_COMPONENTS
WHERE current_size > 0
ORDER BY current_size DESC;
-- 3. 確認參數生效
SHOW PARAMETER SGA;
SHOW PARAMETER PGA;
-- 4. 監控實際記憶體使用 (OS 層面)
-- Linux: pidstat -r -p 1
-- 或: cat /proc//status | grep VmRSS
| 問題 | 原因 | 解決 |
|---|---|---|
| ORA-00845: MEMORY_TARGET not supported | /dev/shm 空間不足或 AMM 不支援 | 改用 ASMM (SGA_TARGET),取消 MEMORY_TARGET |
| STARTUP 掛住 / ORA-27102 | 共享記憶體段衝突、巨大頁面設定錯誤 | 檢查 /etc/sysctl.conf shmmax/shmall、HugePages 設定 |
| 調整後效能下降 | Buffer Cache/Shared Pool 過小導致物理讀/硬解析激增 | 逐步微調 (每次 10-20%),觀察 V$SYSSTAT 命中率、V$LIBRARYCACHE RELOADS |
| PFILE 路徑錯誤 | Windows 路徑分隔符、權限不足 | 使用正斜線 `D:/cj.ora` 或雙反斜線 `D:\\cj.ora`,確保 Oracle 服務帳號可讀寫 |
#!/bin/bash
# reduce_sga.sh - 開發環境一鍵縮減 SGA
ORACLE_SID=ORCL
PFILE_DIR=/tmp
TARGET_SGA_MB=512
sqlplus -s "/ as sysdba" <
掌握 PFILE/SPFILE 雙轉換流程、ASMM 核心參數關係、OS 層面記憶體驗證,即能在資源受限環境安全、可控地縮減 Oracle 記憶體佔用。