Memory_max_target 与 Memory_target 使用介绍(11g新特性AMM)

Oracle 11g R1下的自动内存管理(AMM)

 

 

 

Oracle在简化内存管理方面过去几年做了巨大的努力,从Oracle 9i通过PGA_AGGREGATE_TARGET参数实现PGA自动管理开始,Oracle 10g通过SGA_TARGET参数实现了SGA的自动管理,Oracle 11g更是惊人地实现了数据库所有内存块的全自动化管理,它使得动态管理SGA和PGA成为现实。

写本文时,自动内存管理(AMM)已经在主流平台上得到支持,包括Linux,Windows,Solaris,HP-UX,AIX。

AMM参数

自动内存管理是用两个初始化参数进行配置的:

MEMORY_TARGET:动态控制SGA和PGA时,Oracle总共可以使用的共享内存大小,这个参数是动态的,因此提供给Oracle的内存总量是可以动态增大,也可以动态减小的。它不能超过MEMORY_MAX_TARGET参数设置的大小。默认值是0。

MEMORY_MAX_TARGET:这个参数定义了MEMORY_TARGET最大可以达到而不用重启实例的值,如果没有设置MEMORY_MAX_TARGET值,默认等于MEMORY_TARGET的值。

使用动态内存管理时,SGA_TARGET和PGA_AGGREGATE_TARGET代表它们各自内存区域的最小设置,要让Oracle完全控制内存管理,这两个参数应该设置为0。

AMM配置

在数据库创建过程中,数据库配置助手(DBCA)允许你配置自动内存管理

在手动创建数据库时,只需要在创建数据库之前设置合适的MEMORY_TARGET和MEMORY_MAX_TARGET初始化参数。

在一个系统上启用自动内存管理其实很简单,不需要事先做太多的事情,可以使用下面的计算公式来计算:

MEMORY_TARGET=SGA_TARGET+GREATEST(PGA_AGGREGATE_TARGET,"maximumPGAallocated")

下面的查询语句向你展示有关的信息,以及如何计算出需要的值:

-- Individual values.

COLUMN name FORMAT A30

COLUMN value FORMAT A10

 

SELECT name, value

FROM   v$parameter

WHERE  name IN ('pga_aggregate_target', 'sga_target')

UNION

SELECT 'maximum PGA allocated' AS name, TO_CHAR(value) AS value

FROM   v$pgastat

WHERE  name = 'maximum PGA allocated';

 

-- Calculate MEMORY_TARGET

SELECT sga.value + GREATEST(pga.value, max_pga.value) AS memory_target

FROM (SELECT TO_NUMBER(value) AS value FROM v$parameter WHERE name = 'sga_target') sga,

     (SELECT TO_NUMBER(value) AS value FROM v$parameter WHERE name = 'pga_aggregate_target') pga,

     (SELECT value FROM v$pgastat WHERE name = 'maximum PGA allocated') max_pga;

假设我们需要的设置是5G,那么我们可以执行下面的语句:

CONN / AS SYSDBA

-- Set the static parameter. Leave some room for possible future growth without restart.

ALTER SYSTEM SET MEMORY_MAX_TARGET=6G SCOPE=SPFILE;

 

-- Set the dynamic parameters. Assuming Oracle has full control.

ALTER SYSTEM SET MEMORY_TARGET=5G SCOPE=SPFILE;

ALTER SYSTEM SET PGA_AGGREGATE_TARGET=0 SCOPE=SPFILE;

ALTER SYSTEM SET SGA_TARGET=0 SCOPE=SPFILE;

 

-- Restart instance.

SHUTDOWN IMMEDIATE;

STARTUP;

当数据库重启后,MEMORY_TARGET参数就可以在不重启实例的情况下随意改变大小了。如:

ALTER SYSTEM SET MEMORY_TARGET=4G SCOPE=SPFILE;

AMM调整

除现有的用于内存管理的V$视图外,Oracle 11g还新增加了下面4个视图用于自动内存管理:

  • V$MEMORY_CURRENT_RESIZE_OPS
  • V$MEMORY_DYNAMIC_COMPONENTS
  • V$MEMORY_RESIZE_OPS
  • V$MEMORY_TARGET_ADVICE

为每个动态组件分配的内存大小使用视图V$MEMORY_DYNAMIC_COMPONENTS显示:

COLUMN component FORMAT A30

 

SELECT  component, current_size, min_size, max_size

FROM    v$memory_dynamic_components

WHERE   current_size != 0;

 

 

COMPONENT                      CURRENT_SIZE   MIN_SIZE   MAX_SIZE

------------------------------ ------------ ---------- ----------

shared pool                       197132288  192937984  197132288

large pool                          4194304    4194304    4194304

java pool                          41943040   41943040   41943040

SGA Target                        318767104  285212672  318767104

DEFAULT buffer cache               71303168   41943040   75497472

PGA Target                        104857600  104857600  138412032

 

6 rows selected.

 

SQL>

V$MEMORY_CURRENT_RESIZE_OPS和V$MEMORY_RESIZE_OPS分别显示了组件当前改变大小操作的信息和上一次改变大小操作的信息。

V$MEMORY_TARGET_ADVICE提供了帮助调整MEMORY_TARGET参数的信息,它显示了一段MEMORY_TARGET设置可用的范围,根据当前的设置,估算完成当前负载所需要的DB Time值。

SELECT * FROM v$memory_target_advice ORDER BY memory_size;

 

MEMORY_SIZE MEMORY_SIZE_FACTOR ESTD_DB_TIME ESTD_DB_TIME_FACTOR    VERSION

----------- ------------------ ------------ ------------------- ----------

        303                .75         3068              1.0038          2

        404                  1         3056                   1          2

        505               1.25         3056                   1          2

        606                1.5         3056                   1          2

        707               1.75         3056                   1          2

        808                  2         3056                   1          2

 

6 rows selected.

 

SQL>

企业管理器中也包括了内存管理配置和顾问功能,位于“内存顾问”页面(顾问中心?内存顾问)

 

点击“建议(Advice)”按钮显示“内存大小建议”屏幕,它包括了一个来自视图V$MEMORY_TARGET_ADVICE的图形显示界面。

 

 

11g MEMORY_TARGET 参数对SGA 和PGA的影响

11g 中新增MEMORY_MAX_TARGET 参数,此参数一出现就如在10g 中第一次出现SGA_MAX_SIZE 参数一样给人以耳目一新的感觉。memory_max_target 是设定Oracle能占OS多大的内存空间,一个是Oracle SGA 区最大能占多大内存空间。无疑在11g Oracle 又向自动管理内存更进一步。


10g 的sga_max_size 是动态分配 Shared Pool Size,database buffer cache,large pool,java pool,redo log buffer 大小的,只是根据Oracle 运行状况来重新分配SGA 各内存块的大小。PGA在10g 中需要单独设定.

11g MEMORY_MAX_TARGET 参数包含两部分内存,一个 System global area (SGA),另一个 system global area(PGA)。很显然在11g 中可已经将PGA 和SGA 一起动态管理了。

下面来看看在11g 中Memory_target 设置和不设置对SGA/PGA 的影响:

A:如果Memory_target 设置为非0 值

     (下面有四种情况来对SGA 和PGA 的大小进行分配)
      1:sga_target 和 pga_aggregate_target 已经设置大小如果Oracle 中
     已经设置了参数sga_target 和pga_aggregate_target,则这两个参数将各自被分配为 最小值最为它们的目标值。
     Memory_Target =SGA_TARGET+PGA_AGGREGATE_TARGET ,大小和  memory_max_size 一致。

      2:sga_target 设置大小, pga_aggregate_target 没有设置大小
          那么pga_aggregate_target初始化值=memory_target-sga_target
      3:sga_target 没有设置大小, pga_aggregate_target 设置大小  
          那么sga_target 初始化值=memory_target-pga_aggregate_target
      4:sga_target 和 pga_aggregate_target 都没有设置大小 Oracle 11g
            中对这种sga_target 和pga_aggregate_target 都没有设定大小的情况下,Oracle将对这两个值没有最小值和默认值。
            Oracle 将根据数据库运行状况进行分配大小。

         但在数据库启动是会有一个固定比例来分配:
         sga_target =memory_target *60%
         pga_aggregate_target=memory_target *40%

B:如果Memory_target 没有设置或=0 (在11g 中默认为0)
    11g 中默认为0 则初始状态下取消了Memory_target 的作用,完全和10g 在内存管理上一致,完全向下兼容。
     (也有三种情况来对SGA 和PGA 的大小进行分配)   
        1:SGA_TARGET设置值,则自动调节SGA 中的shared pool,buffer cache,redo log buffer,java pool,larger pool
            等内存空间的大小。PGA 则依赖pga_aggregate_target 的大小。sga 和pga 不能自动增长和自动缩小。
        2:SGA_target 和PGA_AGGREGATE_TARGET  都没有设置
           SGA 中的各组件大小都要明确设定,不能自动调整各组建大小。PGA不能自动增长和收缩。
       3: MEMORY_MAX_TARGET 设置而MEMORY_TARGET =0  这种情况先和10g 一样,不做说明

在11g 中可以使用下面看各组件的值
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 1024M
memory_target                        big integer 1024M
pga_aggregate_target                 big integer 0
sga_target                           big integer 0


如果需要监视Memory_target 的状况则可以使用下面三个动态试图:
   V$MEMORY_DYNAMIC_COMPONENTS
   V$MEMORY_RESIZE_OPS
   v$memory_target_advice

使用下面Command 来调节大小:
SQL>ALTER SYSTEM SET MEMORY_MAX_TARGET = 1024M SCOPE = SPFILE;
SQL>ALTER SYSTEM SET MEMORY_TARGET = 1024M SCOPE = SPFILE;
SQL>ALTER SYSTEM SET SGA_TARGET =0 SCOPE = SPFILE;
SQL>ALTER SYSTEM SET PGA_AGGREGATE_TARGET = 0 SCOPE = SPFILE;

 

 忘了在哪一个网站上下载了这样的一副关系图,很直观的表达了10g和11g的自动内存管理的参数之间的关系:

你可能感兴趣的:(11g新特性,日常管理)