Oracle數據庫的內存管理圍繞**系統全局區(SGA)和程序全局區(PGA)**兩大核心組件展開,兩者分別承擔共享內存與私有內存的職責,是數據庫性能的關鍵基礎。
SGA的管理經歷了從手動配置到自動管理的演進,核心目標是優化內存利用率以適應不同負載需求。
手動配置需為每個SGA組件(如DB_CACHE_SIZE、SHARED_POOL_SIZE、LARGE_POOL_SIZE)單獨設置大小,通過初始化參數直接指定。這種方式要求DBA對業務負載有深入了解,能精準分配各組件內存,但調整繁瑣且易出現內存浪費或不足(如Shared Pool過小導致SQL解析頻繁,Buffer Cache過小導致磁盤I/O升高)。
通過設置SGA_TARGET參數(指定SGA總大?。﹩⒂?,Oracle會自動分配SGA組件內存。該策略的優勢在于:
SGA_TARGET=8G
后,Oracle會根據需要自動分配Shared Pool、Buffer Cache等組件的大小,無需逐一設置SHARED_POOL_SIZE
、DB_CACHE_SIZE
。SHARED_POOL_SIZE
手動設置,或在ASMM下由Oracle自動調整;DB_CACHE_SIZE
設置,ASMM下自動調整;LARGE_POOL_SIZE
設置,ASMM下自動調整。PGA的管理同樣分為手動配置與自動管理兩種模式,核心是優化Work Area(工作區)大小以提升內存密集型操作性能。
通過為每個SQL操作類型(如SORT、HASH JOIN)設置最大工作區大?。ㄈ?code>SORT_AREA_SIZE、HASH_AREA_SIZE
),控制PGA內存消耗。這種方式適用于需要嚴格限制PGA內存的場景(如內存資源緊張的系統),但需DBA根據經驗調整,易導致工作區過?。ǘ啾閽呙瑁┗蜻^大(內存浪費)。
通過設置PGA_AGGREGATE_TARGET參數(指定PGA總大?。﹩⒂?,Oracle會自動分配各進程的工作區內存。該策略的優勢在于:
PGA_AGGREGATE_TARGET=4G
后,Oracle會自動分配Sort、Hash Join等操作的工作區大小,目標是讓90%以上的操作運行在最優大小。Work Area的大小直接影響內存密集型操作的性能,Oracle將其分為三類:
Oracle的內存管理需與Linux系統配置協同,以提升整體性能。
通過啟用大頁內存(HugePages)減少TLB(Translation Lookaside Buffer)未命中,降低頁表管理開銷。配置步驟包括:
grep Huge /proc/meminfo
;/etc/sysctl.conf
,添加vm.nr_hugepages=128
(根據Oracle SGA大小計算);sysctl -p
。調整Linux內核參數以適配Oracle內存需求:
kernel.shmall
(系統共享內存總頁數)、kernel.shmmax
(單個共享內存段最大大?。?,需設置為大于SGA_MAX_SIZE;fs.file-max
(系統最大文件句柄數)、fs.aio-max-nr
(異步I/O請求數),避免因文件句柄不足導致性能下降;vm.swappiness
(系統使用交換空間的傾向),建議設置為10或更低(減少交換,提升內存訪問效率)。Linux系統默認使用**LRU(最近最少使用)**算法回收內存,Oracle也可通過DB_CACHE_ADVICE
、SHARED_POOL_ADVICE
等視圖監控內存使用情況,結合ALTER SYSTEM FLUSH SHARED_POOL
(清理Shared Pool)、ALTER SYSTEM FLUSH BUFFER_CACHE
(清理Buffer Cache)等命令手動回收內存(需謹慎使用,避免影響正在運行的業務)。