一、引言:
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 316M SQL> show sga;Total System Global Area 330600448 bytes Fixed Size 1336344 bytes Variable Size 247466984 bytes Database Buffers 75497472 bytes Redo Buffers 6299648 bytes SQL> 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> startup ORACLE instance started.Total System Global Area 209235968 bytes Fixed Size 1335528 bytes Variable Size 201330456 bytes Database Buffers 4194304 bytes Redo Buffers 2375680 bytes Database 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 value2 from x$ksppi a,x$ksppcv b3 where a.indx = b.indx4 and (a.ksppinm like '%sga_target%'5 or a.ksppinm like '%pga_aggregate_target%');NAME VALUE ----------------------- ------------------- sga_target 0 __sga_target 142606336 pga_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 00845 00845, 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> startup ORA-00845: MEMORY_TARGET not supported on this system
这个错误有点误导,实际上这并不是说该平台版本上不支持AMM特性,只是设置的memory_max_target超过了系统中设置的share memory(/dev/shm)而已。
[oracle@yft bin]$ df -h Filesystem Size Used Avail Use% Mounted on tmpfs 395M 0 395M 0% /dev/shm
在Oracle 11g for linux中似乎是用了一种新的机制来管理共享内存段,而不是传统的sys /dev/shm了。在alert.ora中可以找到更准确的错误描述:
Mon Feb 25 12:13:21 2013 Starting 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/fstab tmpfs /dev/shm tmpfs defaults,size=420m 0 0[root@yft ~]# mount -o remount /dev/shm [root@yft ~]# df -h Filesystem Size Used Avail Use% Mounted on tmpfs 420M 0 420M 0% /dev/shmSQL> startup ORACLE instance started.Total System Global Area 418484224 bytes Fixed Size 1336932 bytes Variable Size 406849948 bytes Database Buffers 4194304 bytes Redo Buffers 6103040 bytes Database mounted.