一、相关概念解析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都是自动管理的。
二、启用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
optionsSQL> show parameter
targetNAME
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= 1000M4、根据以上条件即可确定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中的各个组件值可以自定义,自定义为该组件的最小值,然后数据库根据运转情况进行调整相应的值。