oracle AMM、ASMM区别以及相关用法

  • 一、相关概念解析

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都是自动管理的。
oracle AMM、ASMM区别以及相关用法_第1张图片
  • 二、启用AMM
这里只描述一下用命令启用的过程,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'

  • 三、启动ASMM
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中的各个组件值可以自定义,自定义为该组件的最小值,然后数据库根据运转情况进行调整相应的值。

你可能感兴趣的:(Oracle体系结构,Oracle,优化)