首页 > 代码库 > 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