Oracle之memory_target、memory_max_target、sga_target、sga_max_size学习
一、MEMORY_MAX_TARGET
1、表示oracle实例的可以达到的最大内存大小(即可以使用操作系统内存的最大值);
2、静态参数,修改后需重启生效;
3、如果没有设置memory_max_target参数,那么会自动取memory_target的参数值;
4、默认值为系统的shm的值,而shm值为系统物理内存的一半。
二、MEMORY_TARGET
1、表示oracle实例使用的实际内存大小,不能大于memory_max_target;
2、动态参数,可以随时修改;
3、如果memory_target设为非0,则表示启用AMM。如设为0,则表示不启用自动内存管理(AMM);
4、要改大memory_target需要先调整shm的值,然后修改memory_max_target,最后调整memory_target。
三、SGA_MAX_SIZE
1、表示SGA可以达到的最大内存大小;
2、静态参数,修改后需重启生效。
四、SGA_TARGET
1、表示SGA实际使用的实际内存大小,不能大于sga_max_size;
2、动态参数,可以随时修改;
3、如果sga_target设为0,则表示不启用自动共享内存管理(ASMM),所有相关的内存组件需要手动设定大小(前提,在也不开启AMM的情况下)
五、memory_target设置和不设置对SGA/PGA的影响
1、如果memory_target设置为非0值(则表示启动用自动内存管理AMM)
情况1:sga_target和pga_aggregate_target已经设置大小,则这两个参数自动调整的值将不小于设置的大小
memory_target = sga_target + pga_aggregate_target
情况2:sga_target设置大小,pga_aggregate_target没有设置大小
那么pga_aggregate_target初始化值=memory_target-sga_target
情况3:sga_target没有设置大小,pga_aggregate_target设置大小
那么sga_target初始化值=memory_target-pga_aggregate_target
情况4:sga_target和pga_aggregate_target都没有设置大小
Oracle将根据数据库运行状况进行分配大小。但在数据库启动时会有默认比例:
sga_target = memory_target60%
pga_aggregate_target = memory_target40%
2、如果memory_target没有设置或 = 0(在11g中默认为0)
情况1:sga_target设置大小(ASMM)
自动调节SGA中的shared pool、buffer cache、redo log buffer、java pool、larger pool等内存大小。
PGA则由pga_aggregate_target的大小决定。
sga和pga不能自动增长和自动缩小。
情况2:sga_target和pga_aggregate_target都没有设置
SGA中的各组件大小都要明确设定,不能自动调整各组件大小。
PGA不能自动增长和收缩。
六、AMM与ASMM区别
区别:
AMM (Automatic Memory Management)自动内存管理;(11G才有的特性)
ASMM(Automatic shared Memory Management)自动共享内存管理;(10G有的特性)
AMM不支持HugePage,而ASMM支持HugePage;
AMM让数据库完全管理SGA、PGA的大小;
ASMM只能管理SGA的大小。
启用AMM:
将MEMORY_TARGET设为非0值,则启用。会自动调整SGA、PGA。
注:如果手动也设置了SGA、PGA,则表示自动调整时不小于手动设定的值。
启用ASMM:
将MEMORY_TARGET设为0,SGA_TARGET设为非0,STATISTICS_LEVEL参数设置为TYPICAL(默认值)或者ALL才能启用ASMM功能。
七、修改/dev/shm大小
ORACLE 从11g 版本开始,引入了一个自动内存管理(Automatic Memory Management)特性,该特性需要更多的共享内存(/dev/shm),因此如果决定应用该特性的话, 必须要确保共享内存大于ORACLE 中初始化参数MEMORY_MAX_TARGET 和MEMORY_TARGET(特别提示,这两个参数即自动内存管理特性对应的初始化参数)的值。
如果memory_max_target/memory_target设置过大,可能导致instance无法启动,报ORA-00845错误。
修改/etc/fstab中tmpfs对应的行;将原来的
tmpfs /dev/shm tmpfs defaults,size=1024M 0 0
改成tmpfs /dev/shm tmpfs default,size=80g 0 0
这样tmpfs增大为1G,
重新mount /dev/shm使之生效。
mount -o remount /dev/shm
—1. 永久
vi /etc/fstab
1)查看大小
df -h /dev/shm
2)修改大小
vi /etc/fstab
tmpfs /dev/shm tmpfs defaults,size=4096M 0 0
3)重新挂载
umount /dev/shm
mount /dev/shm
4)查看修改后的大小
df -h /dev/shm
–临时
vi /etc/fstab
mount -o remount,size=85g /dev/shm
mount -t tmpfs shmfs -o size=85g /dev/shm
八、其他相关
/etc/sysctl.conf
SHMMAX参数:Linux进程可以分配的单独共享内存段的最大值。一般设置为内存总大小的一半。这个值的设置应该大于SGA_MAX_TARGET或MEMORY_MAX_TARGET的值,因此对于安装Oracle数据库的系统,shmmax的值应该比内存的二分之一大一些。
shmall参数:是全部允许使用的共享内存大小,shmmax 是单个段允许使用的大小。这两个可以设置为内存的 90%。例如 16G 内存,16 * 1024 * 1024 * 1024 * 90% = 15461882265,shmall 的大小为 15461882265/4k(getconf PAGESIZE可得到) = 3774873。
九、总结
10G时,可以将ORACLE开启ASMM,自动管理SGA;11G时,可以将ORACLE开启AMM,自动调整SGA、PGA。当然也该可以改回AMM。如果需要使用HugePage,则需开启ASMM。配合一些ORACLE自带的建议表(如v$sga_target_advice等),可以更好的分配内存。