数据库内存

Oracle一直不停的在为Orace数据库的自动化管理努力着,11G中的自动内存管理是Oracle数据库中又一新的里程碑,通过新参数MEMORY_TARGET
来代替PGA和SGA的配置,ORACLE在运行过程中会自动调节PGA和SGA的大小,跟10G中SGA自动管理的方法基本一直。MEMORY_TARGET参数可支持动态修改,同样的MEMORY_TARGET也有一个限制最大内存分配的数:MEMORY_MAX_TARGET,这个跟SGA_TARGET和SGA_MAX_TARGET的关系一样。

这里涉及到 asmm 和 amm

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中各个组件的大小。

二、启用AMM
这里只描述一下用命令启用的过程,em操作不进行演示
1、启用sqlplus 以sysdba身份连接数据库,查看相关SGA_TARGET、PGA_AGGREGATE_TARGET的大小

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

启用内存自动管理

DBCA创建数据库的过程中可直接设置MEMORY_TARGET参数
数据库创建完成后,可通过以下方式手动配置MEMORY_TARGET

ALTER SYSTEM SET MEMORY_TARGET = 256M;
  ALTER SYSTEM SET SGA_TARGET = 0;
  ALTER SYSTEM SET PGA_AGGREGATE_TARGET = 0;

后两步是禁用SGA和PGA的自动管理. 让ORACLE对内存实行自动调节. 还可以设置MEMORY_MAX_TARGET参数限制Oracle可自动分配的最大内存.该参数不能动态调整,调整后需要重新启动数据库.正确设置MEMORY_MAX_TARGET参数的方法:

ALTER SYSTEM SET MEMROY_MAX_TARGET=256M SCOPE=SPFILE;

查看MEMORY_TARGET内存的设置情况:

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 256M
  memory_target                        big integer 256M
  pga_aggregate_target                 big integer 0
  sga_target                           big integer 0