如何通过SQLPlus在Windows系统中调整Oracle实例内存占用目标值?
- 内容介绍
- 文章标签
- 相关推荐
本文共计633个文字,预计阅读时间需要3分钟。
相关专题
oracle实例内存占用过高,直接改 memory_target 和 memory_max_target 就能压下来,但顺序错、值设反、没重启,全白干。
确认数据库是否用SPFILE启动
Oracle只认SPFILE里的参数,如果查出来spfile值为空或为NULL,说明当前是PFILE启动——那改SPFILE根本无效,得去改init.ora文件本身。
- 执行
show parameter spfile,有路径返回才表示走SPFILE - 若返回空,后续所有
alter system set ... scope=spfile都不会生效 - 不确定时,先备份原SPFILE:
create pfile='c:\pfile_bak.ora' from spfile;
必须按顺序设置 memory_max_target 和 memory_target
这两个值有硬性大小关系:memory_target ≤ memory_max_target。一旦反过来,下次startup就报ORA-00823: Specified value of memory_target is too large,连DBA都进不去。
- 先设上限:
alter system set memory_max_target = 1200M scope=spfile; - 再设目标:
alter system set memory_target = 1024M scope=spfile; - 不能跳过
memory_max_target只改memory_target,否则重启后参数校验失败 - 改完立刻
shutdown immediate,否则新值不加载
改完不重启,参数永远不变
show parameter memory_target 查出来的还是旧值?正常。SPFILE参数只在实例启动时读取一次,运行中改的只是内存副本(scope=both)或仅写SPFILE(scope=spfile),不重启等于没动。
- 必须执行
shutdown immediate→startup才真正生效 - Windows服务里右键“重启OracleServiceXXX”不行,得进SQL*Plus手动关启,否则可能残留旧SGA
- 重启后立刻查:
show parameter memory_target,确认输出值已更新
改太小导致启动失败,怎么救回来
手滑把memory_target设成2G,memory_max_target却只设了1G,startup直接失败,连sqlplus / as sysdba都报“idle instance”,这时候常规命令全失效。
- 用PFILE绕过SPFILE:
startup pfile='c:\pfile_bak.ora' - 打开PFILE文本,手动把
memory_target调小到≤memory_max_target - 重建SPFILE:
create spfile from pfile='c:\pfile_bak.ora'; - 再
startup,就恢复正常了
最常被忽略的一点:改内存不是越小越好。低于512M时,shared_pool_size和db_cache_size可能撑不开基础字典缓存,连简单SELECT * FROM v$session都会变慢甚至超时。
本文共计633个文字,预计阅读时间需要3分钟。
相关专题
oracle实例内存占用过高,直接改 memory_target 和 memory_max_target 就能压下来,但顺序错、值设反、没重启,全白干。
确认数据库是否用SPFILE启动
Oracle只认SPFILE里的参数,如果查出来spfile值为空或为NULL,说明当前是PFILE启动——那改SPFILE根本无效,得去改init.ora文件本身。
- 执行
show parameter spfile,有路径返回才表示走SPFILE - 若返回空,后续所有
alter system set ... scope=spfile都不会生效 - 不确定时,先备份原SPFILE:
create pfile='c:\pfile_bak.ora' from spfile;
必须按顺序设置 memory_max_target 和 memory_target
这两个值有硬性大小关系:memory_target ≤ memory_max_target。一旦反过来,下次startup就报ORA-00823: Specified value of memory_target is too large,连DBA都进不去。
- 先设上限:
alter system set memory_max_target = 1200M scope=spfile; - 再设目标:
alter system set memory_target = 1024M scope=spfile; - 不能跳过
memory_max_target只改memory_target,否则重启后参数校验失败 - 改完立刻
shutdown immediate,否则新值不加载
改完不重启,参数永远不变
show parameter memory_target 查出来的还是旧值?正常。SPFILE参数只在实例启动时读取一次,运行中改的只是内存副本(scope=both)或仅写SPFILE(scope=spfile),不重启等于没动。
- 必须执行
shutdown immediate→startup才真正生效 - Windows服务里右键“重启OracleServiceXXX”不行,得进SQL*Plus手动关启,否则可能残留旧SGA
- 重启后立刻查:
show parameter memory_target,确认输出值已更新
改太小导致启动失败,怎么救回来
手滑把memory_target设成2G,memory_max_target却只设了1G,startup直接失败,连sqlplus / as sysdba都报“idle instance”,这时候常规命令全失效。
- 用PFILE绕过SPFILE:
startup pfile='c:\pfile_bak.ora' - 打开PFILE文本,手动把
memory_target调小到≤memory_max_target - 重建SPFILE:
create spfile from pfile='c:\pfile_bak.ora'; - 再
startup,就恢复正常了
最常被忽略的一点:改内存不是越小越好。低于512M时,shared_pool_size和db_cache_size可能撑不开基础字典缓存,连简单SELECT * FROM v$session都会变慢甚至超时。

