SGA_TARGET和SGA_MAX_SIZE必须SCOPE=SPFILE并重启才生效,因属静态参数;DB_CACHE_SIZE等子池参数仅在SGA_TARGET=0时有效且仍需重启;验证需查V$SPPARAMETER中ISSPECIFIED为TRUE。
ALTER SYSTEM 修改 SGA 相关参数后,为什么没立即生效?
因为 sga_target、sga_max_size 这类参数属于「静态内存参数」,alter system 默认只对当前实例生效(即 scope=memory),但 sga 区域在实例启动时已由内核分配固定虚拟地址空间;后续调整必须重启才能重新映射。你执行了 alter system set sga_target=4g; 却发现 v$sga 或 show parameter sga_target 显示没变,大概率是忘了加 scope=spfile,或者根本没重启。
哪些 SGA 参数能热修改,哪些必须重启?
Oracle 对内存参数分三类:动态(可热改)、静态(需重启)、部分动态(仅限特定模式)。SGA 相关的关键判断点如下:
-
SGA_TARGET和SGA_MAX_SIZE:必须SCOPE=SPFILE+ 重启,否则报错ORA-02095: specified initialization parameter cannot be modified -
DB_CACHE_SIZE、SHARED_POOL_SIZE等子池参数:如果SGA_TARGET > 0,它们会被自动管理,手动设值会被忽略;只有当SGA_TARGET = 0(即关闭自动内存管理)时,这些参数才生效,且仍需重启 -
MEMORY_TARGET/MEMORY_MAX_TARGET是 AMM 模式参数,与 SGA 并存互斥——一旦启用,SGA_TARGET就失效,且同样必须重启
修改后如何验证是否写入 SPFILE?
别只信 SHOW PARAMETER,它显示的是当前运行值。真正决定下次启动行为的,是 SPFILE 中的持久化设置:
- 查当前 SPFILE 是否被修改:
SELECT VALUE FROM V$PARAMETER WHERE NAME = 'spfile';—— 若返回空,说明用的是 PFILE,ALTER SYSTEM ... SCOPE=SPFILE会失败 - 确认参数已落盘:
SHOW PARAMETER sga_target后,再查V$SPPARAMETER:SELECT VALUE, ISSPECIFIED FROM V$SPPARAMETER WHERE NAME = 'sga_target';,ISSPECIFIED = TRUE才算写进去了 - 误操作补救:如果改错了又没备份 SPFILE,可用
CREATE PFILE FROM SPFILE;导出文本,手动编辑后再重建 SPFILE
重启前最容易漏掉的兼容性检查
SGA 调大不是数字改完就完事,操作系统和 Oracle 自身都有硬约束:
- Linux 下检查
/proc/sys/kernel/shmmax:若SGA_MAX_SIZE超过该值,实例启动直接报ORA-27123: unable to attach to shared memory segment - 检查
ulimit -l(locked memory):Oracle 启动时会尝试锁定 SGA 到物理内存,若该限制太小(如默认 64KB),会导致ORA-27123或警告WARNING: You have set the SGA_MAX_SIZE too high - Windows 上注意 AWE 设置:32 位 Oracle + PAE 需开启
AWE_WINDOW_MEMORY,否则无法使用超过 4GB 的 SGA
调 SGA 最麻烦的从来不是 SQL 怎么写,而是改完参数后,数据库起不来——那往往是因为 OS 层的共享内存或锁页配置没同步跟上。










