优先设MEMORY_TARGET,它实现SGA+PGA统一自动管理;SGA_TARGET仅动态分配SGA内部组件,PGA仍需单独管控。启用MEMORY_TARGET后,SGA_TARGET和PGA_AGGREGATE_TARGET将被忽略。

SGA_TARGET 和 MEMORY_TARGET 到底该设哪个?
Oracle 的内存自动管理有两个核心开关:SGA_TARGET 和 MEMORY_TARGET。选错就等于关掉了真正意义上的“自动”——MEMORY_TARGET 启用的是统一内存管理(SGA + PGA 全局自动伸缩),而 SGA_TARGET 只管 SGA 内部组件(如 SHARED_POOL_SIZE、BUFFER_CACHE 等)的动态分配,PGA 仍得靠 PGA_AGGREGATE_TARGET 单独控。
- 如果数据库版本 ≥ 11g 且操作系统支持大页(Linux 上需配置
/proc/sys/vm/hugetlbpage),优先设MEMORY_TARGET,它才是真正“一揽子”交出去让 Oracle 自己调度 -
MEMORY_TARGET必须 ≤MEMORY_MAX_TARGET,后者是硬上限,修改需重启;前者可在线调整(只要不超过后者) - 设了
MEMORY_TARGET后,SGA_TARGET和PGA_AGGREGATE_TARGET会被自动忽略(即使显式写了也无效) - 常见错误:只调大
SGA_TARGET却发现排序慢、临时表空间爆满——那是因为 PGA 没被纳入自动管理,WORKAREA_SIZE_POLICY实际还是 MANUAL
为什么调高 SGA_TARGET 后 Buffer Cache 没涨?
SGA 内部各组件不是按比例“瓜分”,而是按需“抢占”。Oracle 会根据最近访问模式动态挪用空闲内存,但前提是:有空闲内存可挪,且组件当前大小没卡在最小保底值上。
-
DB_CACHE_SIZE、SHARED_POOL_SIZE等显式设置了具体值时,它们就成了“刚性下限”,SGA_TARGET只能往上调高这些组件,不能往下压低 - 查当前各组件实际占用:
SELECT COMPONENT, CURRENT_SIZE/1024/1024 MB FROM V$MEMORY_DYNAMIC_COMPONENTS; - 检查是否被锁死:
SELECT NAME, VALUE FROM V$PARAMETER WHERE NAME IN ('db_cache_size', 'shared_pool_size') AND ISDEFAULT = 'FALSE';—— 如果 VALUE 非零,说明手动设过,自动伸缩会被抑制 - 真正起效的前提:所有 SGA 子组件参数都设为 0 或未设置(即用默认值),只留
SGA_TARGET或MEMORY_TARGET一个总开关
PGA_AGGREGATE_TARGET 调多大才不翻车?
PGA 不像 SGA 那样常驻内存,它是每个会话私有的工作区,总量由 PGA_AGGREGATE_TARGET 控制上限,但 Oracle 实际分配取决于操作类型(排序、哈希连接、位图合并等)和并发会话数。
- 不要按“总物理内存 × 20%”这种模糊经验拍脑袋——先看历史峰值:
SELECT ROUND(MAX(PGA_ALLOC_MEM)/1024/1024,1) MB FROM V$PROCESS; - 更准的方法是查 AWR 报告里 “PGA Aggr Summary” 部分的 “Maximum PGA Allocated”
- 并发压力大的 OLTP 系统,
PGA_AGGREGATE_TARGET宜保守(比如 1–2 GB),避免大量排序挤爆内存引发频繁写临时表空间;DSS 类系统可设到物理内存的 30%–50%,但必须配合WORKAREA_SIZE_POLICY=AUTO - 容易踩的坑:设了
PGA_AGGREGATE_TARGET却忘了关sort_area_size等旧式参数(10g+ 已废弃),它们若非 0,会强制走 MANUAL 模式,自动管理直接失效
启用 MEMORY_TARGET 后 OOM Killer 杀了 Oracle 进程?
这是 Linux 下最痛的实操陷阱:MEMORYTARGET 是 Oracle 用户态的“软上限”,但 OS 层看不到这个边界。当 Oracle 真的接近该值时,若系统整体内存吃紧,Linux OOM Killer 可能直接干掉 ora 进程。
- 必须给 OS 留足余量:
MEMORY_MAX_TARGET最好 ≤ 物理内存的 75%(例如 128 GB 机器,设 ≤ 96 GB),剩余交给内核、其他进程、文件缓存 - 关键配置:
vm.swappiness=1(减少交换倾向)、vm.overcommit_memory=2(严格检查内存申请)、vm.overcommit_ratio=80(配合 overcommit_memory=2 使用) - 启用大页(HugePages)可绕过部分问题:它把 SGA 锁进物理内存,不参与 OS 页面回收,但注意——
MEMORY_TARGET启用后 HugePages 会自动禁用(因为内存要动态伸缩),所以二者互斥;真要用 HugePages,就得退回SGA_TARGET+ 手动固定各组件大小的老路
Oracle 的内存自动管理不是设个参数就完事,它依赖你对 workload 的理解、对 OS 行为的预判、以及对参数之间隐含约束的敏感。最常被忽略的,其实是那个不起眼的 MEMORY_MAX_TARGET——它不在线生效,却卡死了所有后续调整的可能。










