Oracle提供三種內存管理模式,需根據業務負載特性選擇:
全自動托管(AMM,Automatic Memory Management):通過MEMORY_TARGET
參數統一管理SGA與PGA的內存分配,Oracle自動根據工作負載調整兩者比例。適用于業務流量波動大、缺乏專業DBA的場景(如互聯網應用數據庫),配置方式為:
ALTER SYSTEM SET MEMORY_TARGET=<總內存大小> SCOPE=SPFILE;
ALTER SYSTEM SET MEMORY_MAX_TARGET=<總內存大小> SCOPE=SPFILE;
注意:AMM與HugePages沖突,需關閉HugePages。
半自動化調優(ASMM,Automatic Shared Memory Management):SGA由系統動態分配(SGA_TARGET
參數),PGA需手動設置(PGA_AGGREGATE_TARGET
參數),兼顧靈活性與可控性。適用于對SGA性能敏感但PGA負載較穩定的場景(如OLTP系統),配置方式為:
ALTER SYSTEM SET SGA_TARGET=<SGA總大小> SCOPE=SPFILE;
ALTER SYSTEM SET SGA_MAX_SIZE=<SGA總大小> SCOPE=SPFILE;
ALTER SYSTEM SET PGA_AGGREGATE_TARGET=<PGA總大小> SCOPE=SPFILE;
需將緩沖區緩存(DB_CACHE_SIZE
)、共享池(SHARED_POOL_SIZE
)等SGA組件大小設為0,讓Oracle自主分配。
全手動控制:對SGA與PGA的每個組件(如SHARED_POOL_SIZE
、DB_CACHE_SIZE
、PGA_AGGREGATE_TARGET
)進行精準賦值,適用于工作負載高度可預測的系統(如銀行核心交易數據庫),但需資深DBA持續監控。
SGA是所有會話共享的內存區域,其優化核心是平衡各組件內存分配,避免熱點或浪費:
緩沖區緩存(Database Buffer Cache):緩存高頻訪問的數據塊,減少磁盤I/O。監控命中率(公式:1 - (PHYSICAL_READS / (DB_BLOCK_GETS + CONSISTENT_GETS))
),若命中率低于90%,需增大DB_CACHE_SIZE
(如OLTP系統可設為物理內存的20%-30%)。調整命令:
ALTER SYSTEM SET DB_CACHE_SIZE=<大小> SCOPE=SPFILE;
可進一步通過DB_KEEP_CACHE_SIZE
(緩存頻繁訪問的小表)、DB_RECYCLE_CACHE_SIZE
(緩存全表掃描的大對象)優化緩沖區利用率。
共享池(Shared Pool):緩存解析后的SQL語句與數據字典信息,避免重復編譯。監控命中率(LIBRARY_CACHE
命中率應高于90%,Data Dictionary Cache
命中率應高于90%),若命中率低,需增大SHARED_POOL_SIZE
(如OLTP系統可設為物理內存的10%-20%)。優化技巧:使用綁定變量(減少SQL硬解析)、避免頻繁DDL操作(如CREATE/ALTER TABLE
)。
大型池(Large Pool):用于共享服務器環境、備份恢復或并行查詢,減輕共享池負擔。若系統使用共享服務器或頻繁執行備份,需增大LARGE_POOL_SIZE
(如設為64M-256M)。
Java池(Java Pool):為Java程序提供內存支持,若使用Java存儲過程或應用,需調整JAVA_POOL_SIZE
(如設為32M-128M)。
PGA是每個會話私有的內存區域,主要用于排序、哈希連接等操作,其優化核心是控制工作區大小:
PGA_AGGREGATE_TARGET
參數設置PGA總內存目標(如OLTP系統可設為物理內存的10%-20%,數據倉庫可設為20%-30%)。Oracle會自動分配工作區(如排序、哈希連接),目標是讓90%以上的工作區運行在“最優大小”(無需額外磁盤I/O),避免“多遍”(多次讀取數據)。V$PGASTAT
視圖查看關鍵指標(如“total PGA allocated”(總PGA分配)、“cache hit percentage”(緩存命中率)),若命中率低于90%,需增大PGA_AGGREGATE_TARGET
。HugePages是Linux系統的內存管理特性,可將SGA映射到更大的內存頁(通常為2MB或1GB),減少TLB(Translation Lookaside Buffer)缺失,提升內存訪問效率。配置步驟:
ceil(SGA_MAX_SIZE / Hugepagesize)
(如SGA_MAX_SIZE為8G,Hugepagesize為2MB,則需4096個HugePages)。/etc/sysctl.conf
文件,設置vm.nr_hugepages=<計算值>
,執行sysctl -p
生效。hugetlb
組:usermod -aG hugetlb oracle
。調整Linux內核參數,提升系統對Oracle內存的支持:
vm.swappiness
:控制內存交換的傾向(0-100),設為0表示盡量避免交換(Oracle傾向于使用物理內存),建議設置為10以下。vm.dirty_background_ratio
:臟頁(未寫入磁盤的內存頁)占系統內存的比例,設為5-10,觸發后臺寫進程(DBWn
)異步寫入磁盤。vm.dirty_ratio
:臟頁占系統內存的最大比例,設為10-20,超過則阻塞用戶進程,強制寫入磁盤。shmmax
:單個共享內存段的最大大小,需大于SGA_MAX_SIZE
(如SGA_MAX_SIZE
為8G,則shmmax
設為8G+1M)。shmall
:共享內存總頁數,計算公式:shmmax / PAGE_SIZE
(如shmmax
為8G,PAGE_SIZE
為4KB,則shmall
為2097152)。內存優化是持續過程,需通過監控工具識別瓶頸并調整:
V$SYSSTAT
(查看緩沖區命中率)、V$LIBRARYCACHE
(查看共享池命中率)、V$PGASTAT
(查看PGA使用情況)等視圖,手動監控內存指標。