AMM:automatic memory management(11.1才有的特性) 即让数据库完全管理SGA、PGA的大小,而对于管理员只需要设置一个总的大小(memory_target),数据库会动态的调整SGA、PGA的大小以及其中包含的各个组件大小,如Database buffer cache、Shared pool等等。
ASMM:automatic shared memory management,即让设置一个SGA的目标值以及SGA的最大值,数据库来动态调整其中的各个组件,如Database buffer cache、Shared pool等等。
AMM只需要设置一个memory_target,其中SGA、PGA数据库会根据运行的具体情况来调整这些大小,这样有一个好处即管理方便,经验不充足的人建议就设置AMM让数据库来管理各个内存空间大小的分配。 ASMM则是设置SGA_TARGET,让数据库来管理SGA中各个组件的大小。
PGA oracle强烈建议使用自动管理,在oracle 10g之前的版本,通过设置SORT_AREA_SIZE, HASH_AREA_SIZE, BITMAP_MERGE_AREA_SIZE 、 CREATE_BITMAP_AREA_SIZE这些参数达到手动控制的目的。 不过设置这些参数过于复杂,在此不做讨论。一般只需要设置PGA_AGGREGATE_TARGET参数即可达到自动管理的目的。
下图也比较详细的概括出了AMM、ASMM以及手动管理SGA的几种情况的区别,注意这几种方式PGA都是自动管理的。
这里只描述一下用命令启用的过程,em操作不进行演示
1、启用sqlplus 以sysdba身份连接数据库,查看相关SGA_TARGET、PGA_AGGREGATE_TARGET的大小
[oracle@oracle11g ~]$ sqlplus / as sysdba
SQL*Plus: Release 11.2.0.1.0 Production on Thu May 22 15:59:37 2014
Copyright (c) 1982, 2009, Oracle. All rights reserved.
Connected to:
Oracle Database 11g Enterprise Edition Release 11.2.0.1.0 – Production
With the Partitioning, Automatic Storage Management, OLAP, Data Mining and Real Application Testing options
SQL> show parameter target
NAME TYPE VALUE
------------------------------------ ----------- ------------------------------
archive_lag_target integer 0
db_flashback_retention_target integer 1440
fast_start_io_target integer 0
fast_start_mttr_target integer 0
memory_max_target big integer 1008M
memory_target big integer 0
parallel_servers_target integer 32
pga_aggregate_target big integer 320M
sga_target big integer 680M
2、获取PGA分配的最大值
SQL> select value/1024/1024 || 'M' from v$pgastat where name='maximum PGA allocated';
VALUE/1024/1024||'M'
-----------------------------------------
63.5673828125M
3、计算memory_target
计算公式:memory_target = sga_target + max(pga_aggregate_target, maximum PGA allocated),在本例中即为 320M+680M= 1000M
4、根据以上条件即可确定memory_target的大小,memory_target(目标值)的大小一定要小于MEMORY_MAX_TARGET(最大值)。 因为MEMORY_MAX_TARGET为一个静态参数,所以修改以后必须重启数据库才可以生效。
ALTER SYSTEM SET MEMORY_MAX_TARGET = nM SCOPE = SPFILE;
如果使用的是pfile文件启动的数据库,则关闭数据库,直接修改pfile的内容。 memory_max_target = nM memory_target = mM 或者直接才参数文件中修改。
5、如果使用的是spfile启动,则使用以下命令:
ALTER SYSTEM SET MEMORY_TARGET = nM; ALTER SYSTEM SET SGA_TARGET = 0; ALTER SYSTEM SET PGA_AGGREGATE_TARGET = 0;重启数据库,即可完成AMM启用工作。
6、AMM内存调优
SQL> select * from v$memory_target_advice order by memory_size; MEMORY_SIZE MEMORY_SIZE_FACTOR ESTD_DB_TIME ESTD_DB_TIME_FACTOR VERSION----------- ------------------ ------------ ------------------- ---------- 180 .5 458 1.344 0 270 .75 367 1.0761 0 360 1 341 1 0 450 1.25 335 .9817 0 540 1.5 335 .9817 0 630 1.75 335 .9817 0 720 2 335 .9817 0
当MEMORY_SIZE_FACTOR为1时MEMORY_SIZE的值,即一般认为比较合理的MEMORY_TARGET的值。
7、问题处理
由于操作失误,MEMORY_MAX_TARGET值小于MEMORY_TARGET,结果导致数据库无法启动,报错
ORA-01078: failure in processing system parameters
ORA-00837: Specified value of MEMORY_TARGET greater than MEMORY_MAX_TARGET
而我的spfile由在ASM中,采用以下方法得以回复。
1. 手动编辑一个pfile 只要一个db_name即可
2.startup nomount;
3.create pfile='OS PATH' from spfile='ASM PATH';
4.shutdown
5.编辑pfile到合适的内容
6.startup;
7.create spfile='ASM PATH' from pfile='OS PATH';
然后在把本地的pfile改成*.SPFILE='ASM PATH'
1、从手动SGA管理到ASMM
根据以下的查询获取一个SGA_TARGET的大小
SELECT ( (SELECT SUM(value) FROM V$SGA) - (SELECT CURRENT_SIZE FROM V$SGA_DYNAMIC_FREE_MEMORY) ) "SGA_TARGET"FROM DUAL;
设置大小ALTER SYSTEM SET SGA_TARGET=value [SCOPE={SPFILE|MEMORY|BOTH}]2、从AMM到ASMM
设置MEMORY_TARGET参数为0,ALTER SYSTEM SET MEMORY_TARGET = 0;
记下来设置SGA_TARGET的值,也可以设置各个组件的最小值。
ALTER SYSTEM SET SGA_TARGET = 992M;
ALTER SYSTEM SET SHARED_POOL_SIZE = 0;
ALTER SYSTEM SET LARGE_POOL_SIZE = 0;
ALTER SYSTEM SET JAVA_POOL_SIZE = 0;
ALTER SYSTEM SET DB_CACHE_SIZE = 0;
ALTER SYSTEM SET STREAMS_POOL_SIZE = 0;
SGA中的各个组件值可以自定义,自定义为该组件的最小值,然后数据库根据运转情况进行调整相应的值。