Oracle
Allen 2023-04-17 0 25730 0 0 0 0
Oracle基础,Oracle内存管理,sga_max_size,sga_target,memory_max_target,memory_target,oracle发展到11g,12c后,存在几种内存管理方式:手工内存管理,自动共享内存管理,自动内存管理。其中几个参数sga_max_size,sga_target和memory_max_target,memory_target的关系,有时让人闹不明白,在此总结一下

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


Tag: Oracle基础 Oracle内存管理 sga_max_size sga_target memory_max_target memory_target
我也要发一个   ·   返回首页   ·   返回[Oracle]   ·   前一个   ·   下一个
欢迎评论
未登录,
请先 [ 注册 ] or [ 登录 ]
(一分钟即可完成注册!)
返回首页     ·   返回[Oracle]   ·   返回顶部