oracle发展到11g,12c后,存在几种内存管理方式:手工内存管理,自动共享内存管理,自动内存管理。
从前往后,是由最原始的手工管理向越来越傻瓜的模式发展,但相应的效率可能就不如前面的。当然,前提是参数要调校好。
其中几个参数sga_max_size,sga_target和memory_max_target,memory_target的关系,有时让人闹不明白,在此总结一下。
1,自动内存管理
从Oracle11g开始,引入了一个新的概念自动化内存管理(Automatic Memory Management,AMM) . 如果 DBA 真的想偷懒的话,只需要设定两个参数就可以把烦心的事情都交给 Oracle 折腾了这两个参数分别是:
MEMORY_TARGET--操作系统的角度上 Oracle 所能使用的最大内存值。动态参数 MEMORY_MAX_TARGET--MEMORY_TARGET所能设定的最大值。非动态可调。
(只要 DBA 足够心宽)。PGA 与 SGA 一起搞定。
Tip:
如果使用的是 pfile,
设定了 MEMORY_TARGET,而没有指定 MEMORY_MAX_TARGET 的值,则实例启动后 MEMORY_MAX_TARGET=MEMORY_TARGET 相等。
如果 pfile 中指定了 MEMORY_MAX_TARGET 而没有指定 MEMORY_TARGET ,实例启动后 MEMORY_TARGET=0 。
...
此时的设置如下:
--有效的设置
memory_max_target = xxx
memory_target = xxx
--未使用的设置
sga_max_size = xxx
sga_target =0
pga_aggregate_target =0
...
2,自动共享内存管理
这是 10g 引入的管理方式,要使用这种方式,需要设置初始化参数 MEMORY_TARGET=0 ,然后显式的指定 SGA_TARGET 的值。
...
此时的设置如下:
--有效的设置
sga_max_size = xxx
sga_target =xxx
pga_aggregate_target =xxx
--未使用的设置
memory_max_target = 0
memory_target = 0
...
alter system set memory_target=0 scope=both;
alter system set sga_target=1024m scope=both;
如果动态修改(scope=both)这两个参数的修改是有严格顺序的,如果不遵守倒也没问题--Oracle 会报告错误。
...
3,手工共享内存管理
这个又更加原始了一些。
因为原始,所以新的初始化参数 SGA_TARGET 与 MEMORY_TARGET 都要设置为 0。
然后手工设定 share_pool_size 、db_cache_size 等 sga 参数。
要注意 RESULT_CACHE_SIZE 参数是 11g 新引入的,用来缓存 SQL 结果。
...
此时的设置如下:
--有效的设置
pga_aggregate_target =?
share_pool_size = xxx
db_cache_size = xxx
...
--未使用的设置
sga_max_size = ?
sga_target =0
memory_max_target = ?
memory_target = 0
...
针对以上三种模式,这种说法可以参考:
如果 sga_target=0 且memory_target=0,表示数据库不使用自动内存管理,也不使用自动共享内存管理 那么
db_buffer_cache_size,java_pool shared_pool,large_pool,stream_pool 都需要手动设置一个值
如果 sga_target大于0 表示数据库使用自动共享内存管理,
那么只需要设置SGA_target和pga_aggregate_target,
而参数db_buffer_cache_size,java_pool shared_pool,large_pool,stream_pool 不需要设置值,数据库会自动分配,内存使用率高
如果 memory_target大于0 表示数据库使用自动内存管理,那么SGA,PGA,db_buffer_cache_size,java_pool shared_pool,large_pool,stream_pool 都不需要设置值,数据库会自动分配。
4,自动 PGA 内存管理
如果使用 AMM , 则对 PGA 不用操心。
如果要做到精细控制而切换到自动 PGA内存管理模式,需要设定
WORKAREA_SIZE_POLICY = AUTO(默认即为 AUTO),
然后需要指定 PGA_AGGREGATE_TARGET 的值。
如需要精确控制PGA,则 WORKAREA_SIZE_POLICY = MANUAL
...
5.手动 PGA 管理
前提是 WORKAREA_SIZE_POLICY = manual ,
然后分别指定 SORT_AREA_SIZE 等 PGA 相关的参数。
估计现在没有人干这个吃力不讨好的事情了。
这个模式大可以忽略。
...
AMM 的限制
如果初始化参数 LOCK_SGA = true ,则 AMM 是不可用的。
相关动态视图
V$MEMORY_DYNAMIC_COMPONENTS
V$MEMORY_RESIZE_OPS
...
11g 在简化 DBA 基本工作上还是下了很大功夫。
可是这样也掩盖了一些技术细节,Oracle 正在逐步把内存的管理变成一个黑盒子,当然这也也是相关算法更加稳定作为基础的。
总体来说,利大于弊。
总结:
1. 手工内存管理(Manual Shared Memory Management):
需要DBA手工指定各个内存组件的大小,如各SGA组件的大小(buffer cache,shared pool等)、PGA大小等。这种方式给DBA最大的控制权,但也最麻烦,需要不断调优。
2. 自动共享内存管理(Automatic Shared Memory Management):
这种方式会自动调整SGA的大小,但PGA大小仍需手工指定。只需指定sga_target参数,Oracle会自动调整各SGA组件(buffer cache,shared pool等)的大小以达到sga_target值。这种方式简单一些,但只能自动调整SGA,PGA部分仍需人工管理。
3. 自动内存管理(Automatic Memory Management):
这是最简单的方式。只需要指定memory_target参数,Oracle会同时自动管理SGA和PGA的大小,动态调整以达到memory_target设置的值。这种方式最简单,但也失去了一定程度的控制权。
以上三种内存管理方式的主要区别在于:
手工内存管理:需要手工指定各内存参数,管理最麻烦但控制权最大。
自动共享内存管理:只需指定sga_target,可自动管理SGA,简单一些但PGA仍需人工设置。
自动内存管理:只需指定一个memory_target参数,可自动管理SGA和PGA,最简单但失去部分控制权。
所以选择何种方式,需要根据实际情况判断权衡。一般来说,自动内存管理方式比较适合中小型系统;大型复杂系统可以选择手工内存管理或自动共享内存管理,获得更高灵活性,同时也需要更高的管理和调优成本。
参考:
https://blog.csdn.net/weixin_35094438/article/details/116509913
https://blog.csdn.net/Brighter_Xiao/article/details/51537356