oracle11G以后引入自动内存管理
因为我们只需要设置memory_target即可,
甚至我们不需要在设置如下参数,11g如下参数一般默认都为0
sga_target
pga_aggregate_target
例如:
操作系统内存大小64G,
注:更改前spfile参数文件之前,做好备份,已防万一,
SQL> create pfile from spfile;
文件已创建。
SQL> alter system set memory_max_target=50G scope=spfile;
使oracle内存使用限度控制在50G以下,因为memory_max_target是非动态参数,设置在下一次重启后生效
注:对于memory_target参数在实例运行时可以根据负载实时调整,所调整值为当前分配给数据库的内存大小,立即生效,但必须小于等于memory_max_target。一个合适的memory_target大小可以通查看v$memory_target_advice.相关的内存组件都有相关的v$XXXXXX_advice视图(rac下为gv$)
SQL> show parameter memory
NAME
TYPE
VALUE
------------------------------------ ----------- ------------------------------
hi_shared_memory_address
integer
0
memory_max_target
big integer 51200M
memory_target
big integer 48G
shared_memory_address
integer
0
SQL> alter system set memory_target = 40G;
系统已更改。
以上即可实现自动内存管理。但现实生产环境中,我们可能需要设置 sga和pga最小值以保证例如sga不小于某个值
SQL> alter system set sga_max_size=32G scope=spfile;
系统已更改。
SQL> alter system set sga_target = 30G;
系统已更改。
如上设置sga不能超过sga_max_size,不仅保证了sga的最小值为30G,同时pga的值为40-30=10G。
内存的变化可以通过以下视图查看
select a.component,a.oper_type,a.target_size,a.final_size from v$memory_resize_ops a order by a.start_time desc