首页 > 代码库 > Oracle内存管理理论篇二

Oracle内存管理理论篇二

目标

  • 了解oracle内存管理方式
  • 掌握ASMM管理方式
  • 掌握AMM管理方式
  • 监控内存使用

  学习一个知识点时,最好先了解其历史。ORACLE近期的版本都对内存管理做了简化,从9i通过PGA_AGGREGATE_TARGET参数实现PGA的自动管理,10g通过Automatic Shared Memory Management(ASMM)实现SGA的自动管理,到11g通过Automatic Memory Management(AMM)实现内存(SGA+PGA)的自动管理。目前的11G版本,DBA只需要设置2个或者一个参数,就可以实现ORACLE对内存的自动管理。

Oracle的内存管理方式

  Oracle 11g 引入参数mymory_max_target 和memory_target 就是oracle的新特性自动内存管理,AMM 的引入,组合出来有 5 种内存管理形式。

  • 自动内存管理(AMM): memory_target=非0,是自动内存管理,如果初始化参数 LOCK_SGA = true ,则 AMM 是不可用的。
  • 自动共享内存管理(ASMM): 在memory_target=0 and sga_target=非0 是自动内存管理
  • 手工共享内存管理: memory_target=0 and sga_target=0   指定 share_pool_size 、db_cache_size 等 sga 参数
  • 自动 PGA 管理: memory_target=非0 and workarea_size_policy=auto  and PGA_AGGREGATE_TARGET=值
  • 手动 PGA 管理: memory_target=0 and workarea_size_policy=manal  然后指定 SORT_AREA_SIZE 等 PGA 参数,一般不使用手动管理PGA

ASMM管理方式

1.1 ASMM的管理对象为SGA(shared pool;buffer pool;large pool;java pool;stream pool;redo buffer pool).
    注:不包含缓冲池(Keep buffer pool;Recycle buffer pool;nK buffer pool)
1.2 设置ASMM的管理
    i)从手动共享内存管理模式下启用ASMM
        i1) 获取SGA_TARGET的值: 
              SELECT ((SELECT SUM(value) FROM V$SGA) - (SELECT CURRENT_SIZE FROM V$SGA_DYNAMIC_FREE_MEMORY)) "SGA_TARGET" 
              FROM DUAL;         
        i2) 使用该值设置SGA_TARGET。
        i3) 将(SHARED_POOL_SIZE,LARGE_POOL_SIZE,JAVA_POOL_SIZE,DB_CACHE_SIZE,STREAMS_POOL_SIZE)值设置为0。             
                
 ii)从自动内存管理模式(AMM)切换到ASMM
    ii1)将初始化参数MEMORY_TARGET 设置为0。
              ALTER SYSTEM SET MEMORY_TARGET = 0;
              数据库将根据当前的SGA 内存分配设置SGA_TARGET。
        ii2)将自动设置大小的SGA组件(shared pool;buffer pool;large pool;java pool;stream pool;redo buffer pool)的值设置为0。
            完成后,重新启动实例 

AMM管理方式

1.1 AMM的管理对象为SGA(shared pool;buffer pool;large pool;java pool;stream pool;redo buffer pool)+PGA。注:此时sga_target为0无意义
1.2 设置AMM的管理 
  1.用sqlplus以sysdba链接数据库
  2.计算MEMORY_TARGET的最小值
  a.确定当前的 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 0
        memory_target                        big integer 0
        parallel_servers_target              integer     16
        pga_aggregate_target                 big integer 90M
        sga_target                           big integer 272M
    b.查询从数据库启动以来最大的PGA  
        select value from v$pgastat where name=‘maximum PGA allocated‘;
  c.计算MEMORY_TARGET
    memory_target = sga_target + max(pga_aggregate_target, maximum PGA allocated)
    例如:SGA_TARGET = 272M ; PGA_AGGREGATE_TARGET = 90M , 且 maximum PGA allocated 为 120M, 那么 MEMORY_TARGET >= 392M (272M + 120M). 
  3.参照2c,修改memory_target的值
    ALTER SYSTEM SET MEMORY_TARGET=392M;
    
1.3 MEMORY_TARGET,SGA_TARGET和PGA_AGGREGATE_TARGET之间的关系
        如果将SGA_TARGET和PGA_AGGREGATE_TARGET设置为非零值,则可将其分别视为SGA和PGA大小的下限值。
        MEMORY_TARGET 可以采用从SGA_TARGET+PGA_AGGREGATE_TARGET到MEMORY_MAX_SIZE的值 

监控内存使用

        V$MEMORY_DYNAMIC_COMPONENTS 包含所有内存组件的当前状态
        V$MEMORY_RESIZE_OPS         包含最近完成的800  个内存大小调整请求的循环历史记录缓冲区
        V$MEMORY_TARGET_ADVICE      提供针对MEMORY_TARGET 初始化参数的优化建议