32位 oracle由于位数限制,是的oracle进程只能访问4GB(2的32次方)以下的虚拟额内存地址,这样一来,很多情况下内存空着而不能使用。默认情况下SGA不能超过1.7GB,这时,我们就要考虑怎样扩展oracle的SGA。
1、识别32为的oracle
通过执行:SQL> select * from v$version;
如果是64位的oracle,在查询结果中一定会显示64bit字样。若没有出现,则一定是32bit oracle。 当然也可以在操作系统上,进入$ORACLE_HOME/bin 目录,执行 $ file oracle
命令,会直接显示。
在确认了32位的数据库之后,通常情况下os系统进程只能访问4GB以下的空间,在 redhat linux as2.1 或者 as 3.0 版本中,他们可以提供VLM(Very Large Memory )功能支持,使得通过转换可以使用36bit 来标志内存地址,那么就是2的36次方,理论上最大可支持64GB的内存访问。这在oracle中,则是通过将内存单做文件来访问的,虚拟一个/dev/shm 的文件系统,这个文件系统是完全由内存组成的,这样将突破4GB的限制。
2、为何SGA存在1.7GB的限制
既然进程可以访问4GB以下的内存,为何通常SGA又是1.7GB呢?
在操作系统中,规定了一个进程在应用程序中,能访问的虚拟内存空间为0--3GB,而3--4GB这段虚拟地址空间是保留给kernel使用的。要注意这里强调的是虚拟地址空间,并没有说是物理地址空间。也就是说,假设8GB的内存,这0--3GB的虚拟内存地址空间可能出现在8GB内存的3GB--8GB部分内存段,并不是说物理内存的0--3GB的虚拟地址中,而这0--3GB的虚拟地址中,oracle是的使用时固定好了地址的(是虚拟地址的固定,不是物理地址的固定哦)
0GB —— oracle program 装载起点。
1GB ——oracle共享库装载起点。
1.25GB —— SGA起点。
2GB ——program stack
3GB ——kernel
在这段虚拟地址分配中,1.25GB是SGA的起点,而进程的私有空间的分配(stack部分)却是从靠近3GB处开始的。也就是实际上SGA和进程私有空间都是共用了1.25GB--3GB这部分的,由于进程私有空间特别小,通常习惯性的认为SGA可以达到1.7GB。进程私有空间有0.05GB足够了。
从oracle启动开始,或者从任何一用户进程登陆开始,所有的虚拟内存都已经分配固定好了,只有私有用户空间还可以扩展。