生产环境优先用sga_target+pga_aggregate_target而非memory_target,因amm与linux大页不兼容、rac易内存争用,且asmm更可控、便于分业务压测调优。

生产环境该用 MEMORY_TARGET 还是 SGA_TARGET + PGA_AGGREGATE_TARGET?
生产环境优先用 SGA_TARGET + PGA_AGGREGATE_TARGET,而不是 MEMORY_TARGET。AMM(自动内存管理)在 11g/12c 中虽支持,但实际生产中常因大页(HugePages)不兼容、Linux 内核限制或 RAC 节点间内存争用而引发不稳定——比如 ORA-04030(进程内存耗尽)或频繁的 over allocation count 上升。
ASMM(自动共享内存管理)更可控:SGA_TARGET 动态调度共享池、缓冲区等内部组件,PGA_AGGREGATE_TARGET 独立约束排序/哈希操作的私有内存,两者互不干扰,也方便按业务特征分别压测调优。
- 若已启用
MEMORY_TARGET,SGA_TARGET和PGA_AGGREGATE_TARGET的值会被 Oracle 忽略(即使显式写在 SPFILE 中) - RAC 环境下必须加
sid='*',否则只改当前节点,导致集群内存策略不一致 -
MEMORY_MAX_TARGET是硬上限,修改需重启;MEMORY_TARGET可在线调,但不能超前者
调整前必须验证的三个关键约束
盲目改参可能让实例启动失败,尤其当 sga_max_size 和 memory_target 冲突时,会直接卡在 startup nomount 阶段,报 ORA-00844 或 ORA-00851。
-
sga_max_size必须 ≥sga_target,且 ≤memory_max_target(如果启用了 AMM) - 若启用 AMM,
memory_target必须 ≤memory_max_target,且memory_max_target至少比memory_target多预留 20MB 给 PGA 底层开销 - 所有手动设过的子组件参数(如
db_cache_size、shared_pool_size)必须清空(设为 0 或删掉),否则会锁死 ASMM 自动伸缩能力
查是否被锁死:SELECT NAME, VALUE FROM V$PARAMETER WHERE NAME IN ('db_cache_size', 'shared_pool_size') AND ISDEFAULT = 'FALSE'; —— 若返回非零值,就得先清掉再调 SGA_TARGET。
在线调整 PGA_AGGREGATE_TARGET 的安全边界
PGA_AGGREGATE_TARGET 不是“分配量”,而是 Oracle 允许 PGA 总使用的软上限。真实占用取决于并发会话数和操作类型(如大排序、并行查询)。调太小会触发磁盘临时表空间溢出(temp space usage 暴涨),调太大则挤压 SGA 导致缓存命中率下降。
- 先看历史峰值:
SELECT ROUND(MAX(PGA_ALLOC_MEM)/1024/1024,1) MB FROM V$PROCESS; - 再结合负载特征:OLTP 系统通常设为物理内存的 10%–20%,DSS/报表类可到 30%–40%
- 上线后紧盯
V$PGASTAT中的over allocation count:持续 > 0 就说明目标值不够,需上调 - 可在线执行:
ALTER SYSTEM SET PGA_AGGREGATE_TARGET = 2G SCOPE=BOTH;(BOTH表示同时改内存和 SPFILE)
为什么改了 SGA_TARGET 缓冲区没变大?
Oracle 的 SGA 内部组件不是按比例瓜分,而是按访问热度“抢”内存。你调高 SGA_TARGET,不代表 db_cache_size 就会立刻涨——它得满足两个条件:当前有空闲 SGA 内存可挪,且该组件没被手动固定下限。
- 查实时分配:
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 VALUE != 0; - 如果
db_cache_size显式设了 512M,那哪怕SGA_TARGET=4G,缓冲区也不会超过这个值,除非你先ALTER SYSTEM SET db_cache_size=0
真正起效的前提,是只留一个总开关(SGA_TARGET 或 MEMORY_TARGET),其余子参数全部交还给 Oracle 自动决策——这点在生产环境最容易被忽略,也最难回滚。











