首页 > 代码库 > Oracle初始化参数之memory_target

Oracle初始化参数之memory_target

一、引言:

    Oracle 9i引入pga_aggregate_target,可以自动对PGA进行调整;

    Oracle 10g引入sga_target,可以自动对SGA进行调整;

    Oracle 11g则对这两部分进行综合,引入memory_target,可以自动调整所有的内存,这就是新引入的自动内存管理特性。

二、本文说明:

      操作系统:rhel 5.4 x32

      数据库:oracle 11g r2

三、memory_target的介绍:

    3.1、下面通过示例了解一下memory_target的设置与PGA和SGA关系:

SQL> show parameter memory_target;NAME                     TYPE     VALUE------------------------------------ ----------- ------------------------------memory_target                 big integer 316MSQL> show sga;Total System Global Area  330600448 bytesFixed Size            1336344 bytesVariable Size          247466984 bytesDatabase Buffers       75497472 bytesRedo Buffers            6299648 bytesSQL> alter system set memory_target=200m scope=spfile;System altered.SQL> alter system set sga_target=0 scope=spfile;System altered.SQL> alter system set pga_aggregate_target=0 scope=spfile;System altered.SQL> shutdown immediate;Database closed.Database dismounted.ORACLE instance shut down.SQL> startupORACLE instance started.Total System Global Area  209235968 bytesFixed Size            1335528 bytesVariable Size          201330456 bytesDatabase Buffers        4194304 bytesRedo Buffers            2375680 bytesDatabase mounted.Database opened.

    设置memory_target参数后,实际上Oracle会自动设置并调整一下两个参数来分配SGA和PGA的内存,这和Oracle 10g自动设置sga_target后分配db_cache_size和shared_pool_size的机制是一样的。

SQL> col ksppinm for a20;SQL> col ksppstvl for a20;SQL> select a.ksppinm name,b.ksppstvl value  2     from x$ksppi a,x$ksppcv b  3   where a.indx = b.indx  4      and (a.ksppinm like %sga_target%  5  or a.ksppinm like %pga_aggregate_target%);NAME                                VALUE-----------------------     -------------------sga_target                           0__sga_target                     142606336pga_aggregate_target                 0__pga_aggregate_target            67108864

    3.2、讨论一下11g中memory_target设置和不设置对SGA/PGA的影响:

    3.2.1、如果memory_target设置为非0值

      (下面有四种情况来对SGA和PGA的大小进行分配)

      3.2.1.1、sga_target和pga_aggregate_target已经设置大小

        如果Oracle中已经设置了参数sga_target和pga_aggregate_target,则这两个参数将各自被分配为最小值为他们的目标值。

        memory_target = sga_target + pga_aggregate_target,大小和memory_max_size一致。

      3.2.1.2、sga_target设置大小,pga_aggregate_target没有设置大小

        那么pga_aggregate_target初始化值=memory_target-sga_target

      3.2.1.3、sga_target没有设置大小,pga_aggregate_target设置大小

        那么sga_target初始化值=memory_target-pga_aggregate_target

      3.2.1.4、sga_target和pga_aggregate_target都没有设置大小

        Oracle 11g中对这种sga_target和pag_aggregate_target都没有设定大小的情况下,Oracle将对这两个值没有最小值和默认值。Oracle将根据数据库运行状况进行分配大小。但在数据库启动是会有一个固定比例来分配:

        sga_target = memory_target*60%

        pga_aggregate_target = memory_target*40%

    3.2.2、如果memory_target没有设置或 = 0(在11g中默认为0)

      11g中默认为0则初始状态下取消了memory_target的作用,完全和10g在内存管理上一致,完全向下兼容。(也有三种情况来对SGA和PGA的大小进行分配)

      3.2.2.1、sga_target设置值,则自动调节SGA中的shared pool,buffer cache,redo log buffer,java pool,larger pool等内存空间的大小。PGA则依赖pga_aggregate_target的大小。sga和pga不能自动增长和自动缩小。

      3.2.2.2、sga_target和pga_aggregate_target都没有设置

        SGA中的各组件大小都要明确设定,不能自动调整各组件大小。PGA不能自动增长和收缩。

      3.2.2.3、memory_max_target设置而memory_target = 0这种情况先和10g一样,不做说明。 

三、ORA-00845

    最后谈一下ORA-00845的由来和解决方案:

    如果memory_max_target/memory_target设置过大,可能导致instance无法启动,报ORA-00845错误。

[oracle@yft bin]$ oerr ora 0084500845, 00000, "MEMORY_TARGET not supported on this system"// *Cause: The MEMORY_TARGET parameter was not supported on this operating system or /dev/shm was not sized // *Action: Refer to documentation for a list of supported operating systems. Or, size /dev/shm to be at leacle instance running on the system.SQL> alter system set memory_max_target=400m scope=spfile;System altered.SQL> shutdown immediate;Database closed.Database dismounted.ORACLE instance shut down.SQL> startupORA-00845: MEMORY_TARGET not supported on this system

 这个错误有点误导,实际上这并不是说该平台版本上不支持AMM特性,只是设置的memory_max_target超过了系统中设置的share memory(/dev/shm)而已。

[oracle@yft bin]$ df -hFilesystem            Size  Used Avail Use% Mounted ontmpfs                 395M     0  395M   0% /dev/shm

在Oracle 11g for linux中似乎是用了一种新的机制来管理共享内存段,而不是传统的sys /dev/shm了。在alert.ora中可以找到更准确的错误描述:

Mon Feb 25 12:13:21 2013Starting ORACLE instance (normal)WARNING: You are trying to use the MEMORY_TARGET feature. This feature requires the /dev/shm file system to be mounted for at least 419430400 bytes. /dev/shm is either not mounted or is mounted with available space less than this size. Please fix this so that MEMORY_TARGET can work as expected. Current available is 413466624 and used is 0 bytes. Ensure that the mount point is /dev/shm for this directory.memory_target needs larger /dev/shm

 

 解决的办法之一是增加tmpfs文件系统的容量:

      修改/etc/fstab中tmpfs对应的行;将原来的tmpfs   /dev/shm  tmpfs defaults 0 0 改成tmpfs /dev/shm tmpfs default,size=1024M 0 0,这样tmpfs增大为1G,重新mount /dev/shm使之生效。

[root@yft ~]# vi /etc/fstabtmpfs                   /dev/shm                tmpfs   defaults,size=420m        0 0[root@yft ~]# mount -o remount /dev/shm[root@yft ~]# df -hFilesystem            Size  Used Avail Use% Mounted ontmpfs                 420M     0  420M   0% /dev/shmSQL> startupORACLE instance started.Total System Global Area  418484224 bytesFixed Size            1336932 bytesVariable Size          406849948 bytesDatabase Buffers        4194304 bytesRedo Buffers            6103040 bytesDatabase mounted.

 

Oracle初始化参数之memory_target