zoukankan      html  css  js  c++  java
  • oracle基础——内存管理、优化

    内存图解:

    自动管理:11g:AMM   10g:ASMM

    SGA(system global area):由所有服务进程和后台进程共享

    PGA(program global area): 由每个服务进程和后台进程专有;每个进程都有一个PGA

    SQL> show parameter sga;
    
    NAME                                 TYPE        VALUE
    ------------------------------------ ----------- ------------------------------
    lock_sga                             boolean     FALSE
    pre_page_sga                         boolean     FALSE
    sga_max_size                         big integer 4816M
    sga_target                           big integer 4816M

     这里我们查看到两个重要参数:sga_max_size、sga_target

      解释:sga_max_size:是9i以来就存在的,不可动态修改,sga_target 是当前分配的最大sga,可动态修改(不能超过sga_max_size),如果在实例启动时sga_max_size<sga_target或sga_max_size没设定,则启动后sga_max_size的值会等于sga_target的值;

      PGA_AGGREGATE_TARGET-此参数用来指定所有session总计可以使用最大PGA内存。这个参数可以被动态的更改,取值范围从10M -- (4096G-1 )bytes。

    修改SGA内存大小

    SQL> alter system set sga_max_size=xxxM; 或:alter system set sga_max_size=xxxM  scope=spfile; 
    SQL> alter system set sga_target=xxxM; 或:alter system set sga_target=xxxM  scope=spfile; 

    修改PGA大小

    SQL> alter system set pga_aggregate_target = 1M;
     
    System altered.
     
    SQL> show parameter pga
     
    NAME                                 TYPE        VALUE
    ------------------------------------ ----------- ------------------------------
    pga_aggregate_target                 big integer 1M

    另外有重要的内存参数:

    memory_target,是11g的新特性,在设置了这个参数后,自动内存调整启用:

    PGA_AGGREGATE_TARGET-此参数用来指定所有session总计可以使用最大PGA内存。

    如何来设置SGA和PGA的大小???

    在Oracle11g数据库中,使用自动内存管理特性不再需要设定参数PGA_AGGREGATE_TARGET和SGA_TARGET,因为这两个参数都已经被修改成自动调优的,除非想指定PGA和SGA的最小值才需要设定这两个参数。在Oracle11g数据库中,则需要设置一个叫做MEMORY_TARGET的初始化参数,这个参数是指整个Oracle实例所能使用的内存大小,包括PGA和SGA的整体大小,在MEMORY_TARGET的内存大小之内,PGA和SGA所用的内存可以根据当前负载情况自动相互转换。如果当初始设定的MEMORY_TARGET的内存不够当前数据库使用的时候,Oracle11g还提供了另外一个初始化参数MEMORY_MAX_TARGET,当原始设定的内存不够使用的时候,可以手工来动态 调节MEMORY_TARGET的大小,但是不允许超过MEMORY_MAX_TARGET的值。

    查看当前数据库内存设定情况

    SQL> show parameter memory

    NAME TYPE VALUE
    ------------------------------------ ----------- ------------------------------
    hi_shared_memory_address integer 0
    memory_max_target big integer 0
    memory_target big integer 0
    shared_memory_address integer 0

     

     固,得到以下结论:

    1.memory_max_target及memory_target参数的配置,则会启用全自动内存管理功能

    2.memory_target = sga_target + max(pga_aggregate_target+maximum pga allocated)

    3.memory_target分配范围必须要在参数memory_max_target之内

    4.memory_max_target参数分配原则,一要考虑数据库负载的持续变化发展以及物理内存的空间是否充足

    5.sga_target及pga_aggregate_target若配置为0,则全自动内存管理,SGA及PGA组件分配完全由ORACLE根据业务负载分配,没有最小值的限制,若2参数为非0,则SGA及PGA分配不能少于指定的值

    6.建议在生产环境采用第5步后者的分配方式,以防内存分配抖动大量出现,引发严重的性能问题

    7.数据库启动可以采用SPFILE或者PFILE,二者调整参数稍有不同,一定要注意二者的区别

    8.对于RAC数据库,若采用ALTER SYSTEM方式调整开启全自动内存管理方式,且是一个实例一个实例调整,一定要添加选项sid='sid值',否则会报错"调整完当前节点,再调整其它节点 "

    配置案例:

      需求oracle11g,想由原来的 SGA、PGA手动管理改为SGA、PGA全自动内存管理,我们来设置memory_max_size和memory_target

      规划:理论上来讲,memory_target=sga_taget + max(pga_aggregate_target + maximum PGA allocated)如果你物理内存充足,可用空间充足,可以把memory_target在上述计算的基础再增大一点

      查询现网参数:

    SQL> show parameter sga_target
    
    NAME                                 TYPE        VALUE
    ------------------------------------ ----------- ------------------------------
    sga_target                           big integer 4816M
    SQL> show parameter pga
    
    NAME                                 TYPE        VALUE
    ------------------------------------ ----------- ------------------------------
    pga_aggregate_target                 big integer 1604M
    SQL> select value from v$pgastat where name='maximum PGA allocated';
    
         VALUE
    ----------
     421260288
    
    SQL> select 421260288/1024/1024 mb from dual;
    
            MB
    ----------
    401.745117

      memory_target=4816+(1604+401)=4816+1604=6420M

     接下来计算:memory_max_size:

       此参数配置有几个原则:
            1.此参数控制memory_target可以分配的最大值
            2.分配此参数值一定要考虑业务发展的需要,可以把此参数值在memory_target计算的基础上加大一些,   所以,配置memory_max_target=7000G

      现在全自动内存管理的2个参数的值已经计算完毕,开始在数据库层面进行具体的调整,这里根据是否采用SPFILE或者PFILE,动作稍稍有所区别

      具体配置:

      如果数据库启动用spfile:

    修改:
    SQL>alter system set memory_max_target=7000m scope=spfile sid='*'; 如果是rac环境,必须指定sid
    然后重生效:
    SQL>shutdown immediate
    SQL>startup

      动态调整memory_target及sga_target及pga_aggregate_target几个参数的值

     ---6420m为第4步计算的值
    
     --- 对于当前操作的RAC数据库实例,一定要添加 sid='',否则会报ORA-32018: parameter cannot be modified in memory on another instance
    
    startup nomount
    alter system
    set memory_target=6420m ; alter system set sga_target=0; alter system set pga_aggregate_target=0;
    alter database mount;
    注意:如果你配置sga_target及pga_aggregate_target为0,则完全由ORACLE动态根据数据库负载无限制调整sga及pga的大小(这种方式到时内存分配抖动过大,会引发严重的性能问题);
    但是,如果你配置sga_target及pga_aggregate_target为非0值,则为内存动态调整时,其为最小值,即不能少于这个值(建议在生产环境采用这种方式)

    问题解决:

    在有些场合,如果你使用自动内存管理给实例分配内存,可能会遇到下列错误,比如linux上:

    SQL> startup
    ORA-00845: MEMORY_TARGET not supported on this system
    这是因为/dev/shm没有设置正确的值,确保这个值至少等于sga_max_size参数值。
    [oracle@node1 dbs]$ df -h
    Filesystem            Size  Used Avail Use% Mounted on
    /dev/mapper/VolGroup00-LogVol00
                           14G  9.4G  3.2G  75% /
    /dev/sda1              99M   14M   81M  15% /boot
    none                  2.0G  702M  1.4G  35% /dev/shm
    可以看到该值为2G
    可以通过/etc/fstab来更改该值:
    默认情况下该文件相关内容如下:
    [oracle@node1 dbs]$ cat /etc/fstab |grep shm
    none                    /dev/shm                tmpfs   defaults       0 0
    可以将该值修改为如下:
    none                    /dev/shm                tmpfs   defaults,size=2G        0 0
    然后重启系统即可解决问题。

    转载于:https://www.cnblogs.com/-abm/p/7940974.html

  • 相关阅读:
    麻省理工算法导论学习笔记(1)算法介绍
    麻省理工算法导论学习笔记(2)渐近符号、递归及解法
    Mybatis if 标签 判断不生效
    Linux permission denied解决方法?
    MySQL查找是否存在
    List集合数据去重
    Java获取list集合的前几个元素
    git如何新建(修改)分支
    asp.net下url参数含有中文读取后为乱码
    时间复杂度为O(n)的排序算法
  • 原文地址:https://www.cnblogs.com/twodog/p/12138069.html
Copyright © 2011-2022 走看看