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

  • 相关阅读:
    hdu2328 Corporate Identity
    hdu1238 Substrings
    hdu4300 Clairewd’s message
    hdu3336 Count the string
    hdu2597 Simpsons’ Hidden Talents
    poj3080 Blue Jeans
    poj2752 Seek the Name, Seek the Fame
    poj2406 Power Strings
    hust1010 The Minimum Length
    hdu1358 Period
  • 原文地址:https://www.cnblogs.com/twodog/p/12138069.html
Copyright © 2011-2022 走看看