由于32位下操作系统的进程访问4g(2的32次方)以下的虚拟地址,而这4g的地址又要为内核、可执行代码、共享库等保留地址空间,所以,实际上可以留给SGA的空间只有1.7G左右。
但32位的linux 为可执行代码、共享库保留的地址空间太大,我们可以降低这部分的地址空间,腾出更多的虚拟地址空间给SGA,从而达到扩展SGA的目的。
关于32位oracle扩展SGA的一些问题:
一、扩展的基本步骤
1. lowering the mapped_base in Linux
降低linux进程的mapped_base。这步需要用shell修改进程的mappend_base。
步骤如下:
1)创建一个shell脚本,假设叫/usr/bin/lower_mapped_base.sh,脚本内容如下:
#/bin/sh
echo 268435456 > /proc/$PPID/mapped_base
2)修改脚本的属性
分别执行如下命令:
chown root.root lower_mapped_base.sh
chmod 755 lower_mapped_base.sh
3)授权,使其他用户可以通过sudo执行该脚本
echo "oracle ALL=NOPASSWD: /usr/bin/lower_mapped_base.sh" >> /etc/sudoers
4)让oracle用户登录时自动执行脚本
在oracle用户下执行:
echo "sudo /usr/local/bin/ChangeMappedBase" >> ~/.bash_profile
或者直接编辑~/.bash_profile文件,假如下面这一句:
sudo /usr/local/bin/ChangeMappedBase
到这里,这一步工作就算完成了。
注意:
1)进程与oracle共享库的mapped_base必须一致,否则会出错。如用修改了进程的mapped_base的服务器的sqlplus连接没有编译过共享库的数据库,就会报错。
2)这一步骤只需要在Linux as 2.1上执行,在linux as3/4上,共享库的mapped_base已经降得很低,不需要再手工去降低它了。
2. lowering the sga_base in Oracle
降低SGA的起点,也就是sga_base。这步需要编译oracle的共享库。步骤如下:
1)关闭数据库,并进入相关目录
SQL> shutdown
cd $ORACLE_HOME/rdbms/lib
2)在修改前做备份
如果ksms.s文件不存在可跳过这一步
[[ ! -f ksms.s_orig ]] && cp ksms.s ksms.s_orig
3)修改SGA起点地址
genksms -s 0x12000000 > ksms.s
其中0x12000000表示300M,可以从下面查到(默认是0x40000000,相当于1G)
SQL> select to_number('12000000','xxxxxxxxxxxxxxx') from dual;
TO_NUMBER('12000000','XXXXXXXX
------------------------------
301989888
4)新建ksms文件
make -f ins_rdbms.mk ksms.o
5)重新编译
实际上是重新生成$ORACLE_HOME/bin/oracle这个文件:
make -f ins_rdbms.mk ioracle
到此,降低SGA起点得工作就完成了。
二、不同版本的linux必须执行的步骤
其中1表示lowering the mapped_base in Linux
2表示lowering the sga_base in Oracle
9iR2 10gR1 10gR2*
====================================
RHEL 2.1 x86 1,2 1,2 ---
RHEL 3 x86 2 2 2*
RHEL 4 x86 2 2 2*
SLES 8 x86 1,2 --- ---
SLES 9 x86 1,2 1,2 1,2**
从以上图表可以看出,要扩展SGA:
. linux 2.1需要执行两个步骤
. linux as3/4都只需要执行第二个步骤。
. 10g r1需要执行第二步
. 10g r2两个步骤都不需要执行
执行了扩展SGA的步骤后,理论上可使用的SGA大小为:
. 9i/10g r1在smp kernel 内核下为2.7 G
. 9i/10g r1在hugemem kernel下为3.42G(不扩展的话为2.7G)
. 10g r2在smp kernel 内核下为2.2 G
. 10g r2在smp kernel 内核下为3.3 G
三、其它问题
1、以上讨论都是基于不使用VLM前提的。实际上,在LINUX AS 2.1/3可以使用VLM,可以把32位的linux虚拟成36位的,这样就不需要以做以上步骤来扩展SGA了。
2、不同的linux内核下在不同的oracle版本下可使用的最大SGA是不一样的
来自 “ ITPUB博客 ” ,链接:http://blog.itpub.net/231499/viewspace-63749/,如需转载,请注明出处,否则将追究法律责任。