Oracle对内存的管理的 优化从未间断,从8i到11g不断地提出新的管理概念。每个本版都对内存管理进行了简化:
1、8i->9i:PGA的自动管理;
2、9i->10g:SGA的自动管理;
3、10g->11g:MEMORY(SGA+PGA)的自动管理。
在11g中oracle引入了自动化内存管理(Automatic Memory Management)概念,仅用两个参数就能完成oracle的内存管理工作。DBA的工作看来又要轻松不少了,看看两个参数:
MEMORY_TARGET:oracle所能使用的最大内存,该参数可以动态调整。
MEMORY_MAX_TARGET:MEMORY_TARGET参数所能动态设定的最大值,不能动态调整,需要重启数据库
注:oracle的内存管理方式可以根据本版向下兼容的,11g可以实现10g,9i,8i时的管理方式。
SQL> show parameter sga
NAME TYPE VALUE
---------------- ----------- --------------
lock_sga boolean FALSE
pre_page_sga boolean FALSE
sga_max_size big integer 12864M
sga_target big integer 0
SQL> show parameter pga
NAME TYPE VALUE
-------------------- ----------- ----------
pga_aggregate_target big integer 0
SQL> show parameter mem
NAME TYPE VALUE
------------------------- ----------- -----------
hi_shared_memory_address integer 0
memory_max_target big integer 12864M
memory_target big integer 12864M
shared_memory_address integer 0
可以总结一下MEMORY之间互相制约的顺序;
memory_max_target==>memory_target===>sga_max_size==>sga_target
此外, Memory_target还有下面的这个:
Memory_Target = SGA_Target + pga_aggregate_target
案例一:
问题1、修改了sga_target/pga_aggregate_target的值,导致他们之和大于memory_target;
问题2、修改memory_target值,导致其小于sga_target/pga_aggregate_target之和,也会报错;
SQL>startup 启动数据库 报错:
ORA-02097: parameter cannot be modified because specified value is invalid
ORA-00838: Specified value of MEMORY_TARGET is too small, needs to be at least 4016M
问题概括:Memory_Target 小于 SGA_Target与 pga_aggregate_target之和
解决方法:
上述参数的配置信息都存放在$ORACLE_HOME/dbs/spfile.ora文件中,但是该文件为二进制文件,不可以直接修改;只能通过SQL语句创建出它的副本pfile文件进行修改vi/vim,然后替换即可。(此时DB已经被shutdown了,无法startup,但是仍可由spfile来创建pfile)
第一种解决方法: 还原先前状态,不做修改。
1)SQL>create pfile from spfile;
2)[oracle@ORACLE247 dbs]$ vim $ORACLE_HOME/dbs/initorcl.ora
3)删除行 *.sga_target=*****
4)SYS> create spfile from pfile;
5)SYS> startup 即可
第二种方法,将sga_target修改为一个正确的值:
1)创建pfile初始化文档;
2)修改 *.sga_target=X (X等于MEMORY_TARGET的值减去PGA的值(大于10M,PGA最小值));
3)由修改后的PFILE创建SPFILE;
4)启动DB即可;
第三种方法,修改增大 *.memory_target的值,
1)与第二种方法类似,创建pfile初始化文档;
2)修改增大 *.memory_target=Y(Y值是不能大于/dev/shm tmpfs共享文件系统的大小,否则会报案例二的错);
[root@ORACLE247 ~]# df -h |grep /dev/shm
tmpfs 16G 8.2G 7.5G 53% /dev/shm
案例二:问题:设置的Memory_Target值过大
SQL>startup 启动数据库 报错:
ORA-00845: MEMORY_TARGET not supported on this system
问题原因:物理内存大小>=Memory_Target大小设置>=/dev/shm tmpfs共享文件系统的大小
解决方法:
方法一:参照案例一中的方法三,修改Memory_Target大小;
方法二:修改/dev/shm 的大小,修改方法又有两种:
1)[root@ORACLE247 ~]# cat /etc/fstab | grep tmpfs
这个是静态修改,需要重启系统才能生效。
2)[root@ORACLE247 ~]# mount -o remount,size=4G /dev/shm
这是通过重新挂载来修改其大小,不需要重启。