Oracle AMM,ASMM

1.ASMM的作用
Oracle 10g开始,Oracle提供了自动SGA的管理(简称ASMMAutomatic SharedMemory Management)新特性。所谓ASMM,就是指我们不再需要手工设置shared pool、buffer pool等若干内存池的大小,而是为 SGA 设置一个总的大小尺寸即可。Oracle数据库会根据系统负载变化,自动调整各组件的大小,从而使得内存始终能够流向最需要它的地方。
 

例如,假设某个系统在上午1000到下午900属于OLTP应用,因而可能会用到较多的BUFFER CACHE;而下午900到上午1000属于OLAP系统,可能会用到较大的SHARED POOLLARGE POOL。如果我们启用了ASMM,数据库就会根据负载的变化而自动对内存大小进行调整,就不需要数据库管理员手工进行调整了。
 

2.如何使用ASMM
Oracle 10g提供了一个新的初始化参数:sga_target来启动ASMM,该参数定义了整SGA的总容量。同时,初始化参数statistics_level必须设置为typicalall才能启动ASMM,否则如果设置为basic,则关闭ASMM。ASMM只能自动调整5个内存池的大小,它们是:shared poolbuffer cachelarge pool、java pool stream pool。我 们 不 再 需要 设 置 shared_pool_sizedb_cache_size large_pool_sizejava_pool_sizestreams_pool_size这五个初始化参数。而其他的内存池,比如log bufferkeep buffer cache 等仍然需要DBA手工进行调整。
 

Oracle 10g还提供了另一个初始化参数sga_max_sizesga_target的值不能超过sga_max_size的值,修改 sga_max_size时,必须重启实例才能生效,而 sga_target则可以在线修改,立即生效,无须重启实例。

3ASMM的原理
为了实现ASMMOracle新引入了一个名为 MMAN(Memory Manager)的后台进程
每隔很短的一段时间,MMAN进程就会启动,然后去询问一下 Oracle提供的各个内存组件顾问,比如有 buffer cache顾问,也有 shared pool顾问,由这些顾问根据当前的负载情况,将这 5个可以自动调整的内存池的、建议的大小尺寸,返回给 MMAN。于是,MMAN进程就会根据该返回的值,来设置各个内存池。同时,如果我们使用了 spfile,还会将这些顾问得出的建议值写入spfile 里。这样,下次启动实例时,就可以直接把顾问得出的建议值拿来作为启动内存池的依据了。

如果我们启用了ASMM,同时又手工设置了可以自动调整大小的内存池的尺寸,比如设置了参数shared_pool_size为一个非0值的时候,会怎么样?对于Oracle 10g来说,我们为自动调整大小的内存组件设置了值,则会以我们设置的值作为自动调整的最小值。也就是说,假设sga_target4GB,而我们将shared_pool_size设置为600MB,则MMAN在进行自动调整时,永远不会将shared pool设置为600MB以下。


411g中的ASMM
Oracle11g数据库中,使用自动内存管理特性不再需要设定参数SGA_TARGETPGA_AGGREGATE_TARGET,因为这两个参数都已经被修改成自动调优的,除非想指定PGA和 SGA 的最小值才需要设定这两个参数。Oracle11g数据库中,则需要设置一个叫做MEMORY_TARGET的初始化参数,这个参数是指整个Oracle实例所能使用的内存大小,包括PGASGA的整体大小,在MEMORY_TARGET的内存大小之内,PGA和 SGA所用的内存可以根据当前负载情况自动相互转换。
如果当初始设定的MEMORY_TARGET的内存不够当前数据库使用的时候,Oracle11g
还提供了另外一个初始化参数MEMORY_MAX_TARGET,当原始设定的内存不够使用的时候,可以手工来动态调节 MEMORY_TARGET 的大小,但是不允许超过MEMORY_MAX_TARGET 的值。下面这张图简单明了的描述出
了 Oracle11g数据库内存大小的设定参数。

Oracle AMM,ASMM

 

AMM(自动内存管理)通过memory_target来决定是否开启

使你可以指定分配实例的总内存,包括SGA,PGA。

使用AMM管理只需要手工设置memory_target的值,用户SGA_TARGET,PGA_AGGREGATE_TARGET设置为0就行了。

 

SQL> show parameter sga;

 

NAME      TYPE   VALUE

------------------------------------ -------------------- ------------------------------

lock_sga      boolean   FALSE

pre_page_sga      boolean   FALSE

sga_max_size      big integer   700M

sga_target     big integer  0

SQL> show parameter pga;

 

NAME      TYPE   VALUE

------------------------------------ -------------------- ------------------------------

pga_aggregate_target     big integer  0

 

如果将memory_target设置了一个值为700M,那么是启动了AMM管理,之后你再去将SGA_TARGET设置一个非零值,比如500M,那么还是使用了AMM管理,只不过在自动内存管理的时候SGA_TARGET分配的内存大小不小于500M。

 

总结:AMM管理,就是给MEMORY_TARGET设置一个总内存,SQL> alter system set memory_max_target=1000m scope=spfile;(先设置最大内总存约束,注意要重启,只在spfile里面生效),alter system set sga_target=0,alter system set pga_aggregate_target=0。

然后sga,pga就自动分配了。注意AMM是总内存自动管理,只对sga,,pga内存管理,至于要对细粒度的内存管理比如share_pool_size这种内存管理就要使用ASMM了。

要开启ASM只需要将memory_target设置为0就行了。

如果不采用AMM管理,将memory_target设置为0,然后sga_target,pga_aggregate_target单独设置值,注意这个因为不启用ASMM管理,那么这些值一旦设定就是写死了的,即手动分配了,不是最小值。

 

 

ASMM

设置share_pool_size,db_cache_size,java_pool_size,stream_pool_size为0。这样上面设置为0参数就是使用了自动共享内存管理。通过设置总的sga_target的值,下面各内存为0,让其自动分配,注意log_buffer的值不为0,这个值不需要改,是oracle自动分配的。你也可以不将sga_target下面的各个内存值设置为0,比如share_pool_size值为100m,那么同理还是自动共享内存管理,只不过share_pool_size的值最小不低于100m。(ASMM启用的时候sga_target的值不为0)

SQL> show parameter sga_target;

 

NAME      TYPE     VALUE

------------------------------------ ---------------------- ------------------------------

sga_target      big integer     0

 

SQL> show parameter shared_pool_size;

 

NAME      TYPE

------------------------------------ ----------------------

VALUE

------------------------------

shared_pool_size      big integer

0

SQL> set linesize 400;

SQL> show parameter shared_pool_size;

 

NAME      TYPE     VALUE

------------------------------------ ---------------------- ------------------------------

shared_pool_size      big integer     0

SQL> show parameter db_cache_size

 

NAME      TYPE     VALUE

------------------------------------ ---------------------- ------------------------------

db_cache_size      big integer     0

SQL> show parameter large_pool_size;

 

NAME      TYPE     VALUE

------------------------------------ ---------------------- ------------------------------

large_pool_size      big integer     0

SQL> show parameter java_pool_size;

 

NAME      TYPE     VALUE

------------------------------------ ---------------------- ------------------------------

java_pool_size      big integer     0

SQL> show parameter streams_pool_size;

 

NAME      TYPE     VALUE

------------------------------------ ---------------------- ------------------------------

streams_pool_size      big integer     0

 


要启用ASMM,需要设置两个参数。把STATISTICS_LEVEL设置成TYPICAL或者ALL。把SGA_TARGET设成非0值。
要注意,MEMORY_MAX_TARGET>MEMORY_TARGET>SGA_MAX_SIZE>SGA_TARGET。不设置正确可能实例无法启动。

 

 

最后总结用OCP考试的题目来说明一下

Oracle AMM,ASMM