SGA_TARGET在RAC中必须跨节点统一,因故障切换时低配节点无法承载原负载,易引发ORA-4031;AMM(MEMORY_TARGET)已被禁用,强制使用ASMM;SGA_MAX_SIZE不一致会导致ORA-00823/00821及集群启动失败。

SGA_TARGET 在 RAC 中必须跨节点统一
Oracle RAC 不是“多个独立实例”,而是共享同一数据库的协同实例组。当发生故障切换(failover)或服务迁移(service relocation)时,客户端连接会被重定向到存活节点,该节点必须能立即承载原节点的全部负载——包括 SQL 解析、缓存数据、游标、PL/SQL 包状态等。如果节点 1 的 SGA_TARGET 是 6G,而节点 2 只有 3G,那么切换后,大量硬解析、library cache latch 争用、buffer busy waits 就会立刻爆发,甚至触发 ORA-4031。
RAC 启动时会校验 SGA_MAX_SIZE 是否对齐
节点启动阶段,Oracle 会检查集群内所有实例的 SGA_MAX_SIZE 是否一致(尤其在使用 spfile 且参数未显式指定实例 SID 时)。若不一致,ORA-00823 或 ORA-00821 可能只在部分节点报错,导致集群无法完全上线。更隐蔽的问题是:某节点因内存参数偏低而被 CRS 自动拉起又终止,表现为“反复重启”或“srvctl status 显示不稳定”。
自动内存管理(AMM)在 RAC 中已被禁用,别误配 MEMORY_TARGET
RAC 环境下设置 MEMORY_TARGET > 0 会导致实例无法启动,并报 ORA-00843。官方明确弃用 AMM,强制使用 ASMM(即 SGA_TARGET + PGA_AGGREGATE_TARGET)。常见错误是 DBA 在单机环境调优后直接复制参数到 RAC,没删掉 MEMORY_TARGET,结果一个节点启得起来、另一个卡在 mount 阶段。
节点间 SGA 组件下限值不一致会放大抖动
即使 SGA_TARGET 相同,若节点 1 设了 shared_pool_size = 1.5G,节点 2 却没设(即交由 ASMM 自动调度),那么在高并发硬解析场景下,节点 1 的 shared pool 不会收缩,而节点 2 可能被挤占到 800MB 以下,引发 library cache lock 等等待事件。这种差异不会在日常监控中暴露,只在切换瞬间集中爆发。
最易被忽略的是:RAC 中修改 SGA_MAX_SIZE 必须重启实例,且必须逐节点操作;而 SGA_TARGET 虽可在线改,但跨节点不一致时,ADDM 和 AWR 报告不会主动告警——它默认假设你已手动保证一致性。


















