• 一、相关概念解析


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_SIZECREATE_BITMAP_AREA_SIZE这些参数达到手动控制的目的。   不过设置这些参数过于复杂,在此不做讨论。一般只需要设置PGA_AGGREGATE_TARGET参数即可达到自动管理的目的。

下图也比较详细的概括出了AMM、ASMM以及手动管理SGA的几种情况的区别,注意这几种方式PGA都是自动管理的。

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