IT博客汇
  • 首页
  • 精华
  • 技术
  • 设计
  • 资讯
  • 扯淡
  • 权利声明
  • 登录 注册

    [原]ORA-00845: MEMORY_TARGET 深度处理

    mchdba发表于 2017-01-17 20:45:25
    love 0

    1,启动报错

    azure云上oracle备库降低配置,从DS12降低到DS11后,需要重启服务器,但是之后在开启oracle服务的时候,报错如下
    
        SQL> startup;
        ORA-00845: MEMORY_TARGET not supported on this system
        SQL> 

    官方MEMORY_TARGET介绍

    Starting with Oracle Database 11g, the Automatic Memory Management feature requires more shared memory (/dev/shm)and file descriptors. The size of the shared memory should be at least the greater of MEMORY_MAX_TARGET and MEMORY_TARGET for each Oracle instance on the computer. If MEMORY_MAX_TARGET or MEMORY_TARGET is set to a non zero value, and an incorrect size is assigned to the shared memory, it will result in an ORA-00845 error at startup.

    就是说MEMORY_MAX_TARGET的设置不能超过/dev/shm的大小,在oracle11g中新增的内存自动管理的参数MEMORY_TARGET,它能自动调整SGA和PGA,这个特性需要用到/dev/shm共享文件系统,而且要求/dev/shm必须大于MEMORY_TARGET,如果/dev/shm比MEMORY_TARGET小就会报错。
    

    2,解决办法:

    修改/etc/fstab配置, 查看/etc/fstab

        [oracle@oracle2~]$ more /etc/fstab
    
        #
        # /etc/fstab
        # Created by anaconda on Wed Jan 15 04:45:47 2014
        #
        # Accessible filesystems, by reference, are maintained under '/dev/disk'
        # See man pages fstab(5), findfs(8), mount(8) and/or blkid(8) for more info
        #
        UUID=6d089360-3e14-401d-91d0-378f3fd09332 /                       ext4    defaults        1 1
        /dev/sdc                /oracle                   ext4    defaults        0 0
        tmpfs                   /dev/shm                tmpfs   defaults        0 0
        devpts                  /dev/pts                devpts  gid=5,mode=620  0 0
        sysfs                   /sys                    sysfs   defaults        0 0
        proc                    /proc                   proc    defaults        0 0
        [oracle@oracle2~]$ 

    看到里面没有tmpfs的默认值,所以需要在里面修改tmpfs的值,设置一个默认值size大小

        tmpfs                   /dev/shm                tmpfs   defaults        0 0
        换成
        tmpfs                   /dev/shm                tmpfs   defaults,size=10G        0 0

    需要重新mount生效

        [root@oracle2~]#  mount -o remount,size=10G /dev/shm
        [root@oracle2~]# 
        [root@oracle2~]# 
        [root@oracle2~]# df -h
        Filesystem      Size  Used Avail Use% Mounted on
        /dev/sda1        29G  8.8G   19G  33% /
        tmpfs            10G     0   10G   0% /dev/shm
        /dev/sdc       1007G  425G  531G  45% /oracle
        /dev/sdb1        28G  172M   26G   1% /mnt/resource
        [root@oracle2~]# 

    再去启动oracle实例,startup成功,如下

    [root@oracle2~]# su - oracle
    [oracle@oracle2~]$ rlwrap sqlplus / as sysdba
    
    SQL*Plus: Release 11.2.0.1.0 Production on Mon Jan 16 10:20:33 2017
    
    Copyright (c) 1982, 2009, Oracle.  All rights reserved.
    
    Connected to an idle instance.
    
    SQL> startup;
    ORACLE instance started.
    
    Total System Global Area 8551575552 bytes
    Fixed Size                  2215064 bytes
    Variable Size            2818573160 bytes
    Database Buffers         5704253440 bytes
    Redo Buffers               26533888 bytes
    Database mounted.
    Database opened.
    SQL> 

    3,扩展问题

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

    MEMORY_TARGET:动态控制SGA和PGA时,Oracle总共可以使用的共享内存大小,这个参数是动态的,因此提供给Oracle的内存总量是可以动态增大,也可以动态减小的。它不能超过MEMORY_MAX_TARGET参数设置的大小。默认值是0。
          
    使用动态内存管理时,SGA_TARGET和PGA_AGGREGATE_TARGET代表它们各自内存区域的最小设置,要让Oracle完全控制内存管理,这两个参数应该设置为0。  
            
    但是memory_target这个参数是可以动态调节的...也就是说不需要重新启动DB,就可以让其生效。
    
    MEMORY_MAX_TARGET 是设定Oracle能占OS多大的内存空间
    
    SGA_MAX_SIZE是Oracle SGA 区最大能占多大内存空间
    
    11g MEMORY_MAX_TARGET 参数包含SGA和PGA两部分。
        在手动创建数据库时,只需要在创建数据库之前设置合适的MEMORY_TARGET和MEMORY_MAX_TARGET初始化参数。
        在一个系统上启用自动内存管理其实很简单,不需要事先做太多的事情,可以使用下面的计算公式来计算:       MEMORY_TARGET=SGA_TARGET+GREATEST(PGA_AGGREGATE_TARGET,"maximumPGAallocated");
    

    查看状态

        SQL> SELECT
          2    NAME,
          3    VALUE
          4  FROM
          5    v$parameter
          6  WHERE NAME IN (
          7      'pga_aggregate_target',
          8      'sga_target'
          9    )
         10  UNION
         11  SELECT
         12    'maximum PGA allocated' AS NAME,
         13    to_char(VALUE) AS VALUE
         14  FROM
         15    v$pgastat
         16  WHERE NAME = 'maximum PGA allocated' ;
        NAME                                                                             VALUE
        -------------------------------------------------------------------------------- --------------------------------------------------------------------------------
        maximum PGA allocated                                                            41652878336
        pga_aggregate_target                                                             11897856102
        sga_target                                                                       60666413056
    
        SQL>    

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

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

    下面来看看在11g 中Memory_target 设置和不设置对SGA/PGA 的影响:
    如果Memory_target 设置为非0 值

    1、sga_target 和 pga_aggregate_target 已经设置大小
        Memory_Target =SGA_TARGET+PGA_AGGREGATE_TARGET ,大小和 memory_max_size 一致
    
    2、sga_target 设置大小, pga_aggregate_target 没有设置大小
    
    3、sga_target 没有设置大小, pga_aggregate_target 设置大小 
        sga_target 初始化值=memory_target-pga_aggregate_target
    
    4、sga_target 和 pga_aggregate_target 都没有设置大小
        两个值没有最小值和默认值,Oracle 将根据数据库运行状况进行分配大小,但在数据库启动是会有一个固定比例来分配:
        sga_target =memory_target *60%
        pga_aggregate_target=memory_target *40%
    

    查看所有的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     128
        pga_aggregate_target                 big integer 11897856102
        sga_target                           big integer 57856M
    
    SQL> 

    MEMORY_TARGET 简介图
    这里写图片描述



沪ICP备19023445号-2号
友情链接