下面是Oracle 文档上的解释,
SHMMAX Available physical memory Defines the maximum allowable size of one shared memory segment.
The SHMMAX setting should be large enough to hold the entire SGA in one shared memory segment. A low setting can cause creation of multiple shared memory segments which may lead to performance degradation.
shmmax 的含义是单个共享内存段的最大尺寸, 设置shmmax=1G,sga分配了1.2G,当启动实例的时候就分配 2 块共享内存给Oracle .
如果物理内存是 2 G, 假设这台DB Server上还有Apache 在运行,那么shmmax 中设置的内存也会被Apache 来使用,那么分配的 2 块共享内存段给Oracle 是否就是 2 * 1G , 还是仅仅满足 SGA需求的 1.2 G就停止分配 , 其他的内存的一部分分配给Oracle PGA 和软件 Apache 来使用 ?
答:
看Oracle Document 说法 , 当需要分配多个 ( creation of multiple shared memory segments ) 共享内存段的时候会导致性能下降 。
如果偶尔分配需要 2 个共享内存段 ,性能应该不会受到太大影响吧 。
shmmax内核参数定义单个共享内存段的最大值,如果该参数设置小于Oracle SGA设置,那么SGA就会被分配多个共享内存段。这在繁忙的系统中可能成为性能负担,带来系统问题。
设置:
一些资料说内存大过2g的,就按shmmax=shmall*1*1024 (shmall=实际内存*1024) ,有的说大过2g的就按2g的算,shmall=2097152=2048*1024,shmmax=shmall*1*1024=2147483648
现在的情况是我按第一种说法安装9i,我的服务器内存是8G的设,到最后报ORA-27012ut of memory 错误,数据库无法启动,而按第二种就没事,请高手指点,这个值到底怎么设置合理?
答:
对于32bit的linux来说,不管实际的内存有多大,shmmax的最大值不应该超过 4294967295。
对于rh3,正常情况下oracle的sga只能开到1.7G左右(即使你有8G的memory),即使经过某些调整,如Hugetlb,最多也只能将SGA<3G.
oracle在设置sga的时候,会参考系统的内核参数,如shmmax等。
配置 Linux 的内核参数
[root@myhost ~]# vi /etc/sysctl.conf
# For Oracle
kernel.shmmax = 1073741824(改成服务器内存的一半,我的服务器是1G,所以都算进去了,1024*1024*1024)
kernel.shmmni=4096
kernel.shmall=1073741824
kernel.sem=250 32000 100 128
fs.file-max=65536
net.ipv4.ip_local_port_range=1024 65000
修改/etc/sysctl.conf文件。其中的几个参数的含义是:
kernel.shmmax表示最大共享内存,如果小的话可以按实际情况而定,一般为物理内存的一半,不过我的虚拟机只有256M,所以就全部算进去了。
shmmni表示最小共享内存固定4096KB
shmall表示所有内存大小
sem 4个参数依次是SEMMSL:每个用户拥有信号量最大数,SEMMNS:系统信号量最大数,SEMOPM:每次semopm系统调用操作数,SEMMNI:系统辛苦量集数最大数。这4个参数为固定内容大小。
file-max固定大小65536
ip_local_port_range表示端口的范围,为指定的内容。
ORACLE的LINUX配置及环境变量配置:
创建Oracle用户和组
以root身份执行下列命令:
/usr/sbin/groupadd oinstall
/usr/sbin/groupadd dba
/usr/sbin/useradd -m -g oinstall -G dba oracle
id oracle
然后设置oracle账户的密码:
/usr/bin/passwd oracle
创建目录
创建针对Oracle 10g软件和数据库的目录。以root身份执行下列命令
mkdir -p /u01/app/oracle
mkdir -p /u02/oradata
chown -R oracle:oinstall /u01/app/oracle /u02/oradata
chown -R 775 /u01/app/oracle /u02/oradata
修改内核参数
以root身份编辑/etc/sysctl.conf文件。添加以下内容:(可用:cat >> /etc/sysctl.conf <
cat >> /etc/sysctl.conf <kernel.shmall = 2097152
kernel.shmmax = 2147483648
kernel.shmmni = 4096
kernel.sem = 250 32000 100 128
fs.file-max = 65536
net.ipv4.ip_local_port_range = 1024 65000
EOF
/sbin/sysctl -p
保存,退出。
然后运行/sbin/sysctl -p激活更改。
为oracle用户设置shell限制
以root身份编辑/etc/security/limits.conf文件。添加以下内容:
cat >> /etc/security/limits.conf <oracle soft nproc 2047
oracle hard nproc 16384
oracle soft nofile 1024
oracle hard nofile 65536
EOF
然后再编辑/etc/pam.d/login文件。添加以下内容:
cat >> /etc/pam.d/login <session required /lib/security/pam_limits.so
EOF
oracle用户的环境变量设置
以oracle用户身份登录系统。
编辑.bash_profile文件。添加以下内容:(具体值请根据自己的情况设置)
export ORACLE_BASE=/u01/app/oracle
export ORACLE_HOME=$ORACLE_BASE/product/10g
export ORACLE_SID=DEMO
export LD_LIBRARY_PATH=$ORACLE_HOME/lib:/usr/lib
export LC_CTYPE=en_US.UTF-8
并且把PATH=$PATH:$HOME/bin一行修改为 PATH=$PATH:$HOME/bin:$ORACLE_HOME/bin
到这里,原来准备把变量LD_LIBRARY_PATH 加上一个:$ORACLE_HOME/lib64,但经过实验,不必如此。
保存,退出。
然后运行命令source .bash_profile 使环境变量生效。
注意事项:
1、以上可以在root下并su进行,但如果要进行下面的实际安装,则必须注销,并以真实的ORACLE用户登录来进行操作。如果真的要在root下,以su - oracle的话,可能要添加: export DISPLAY=IP:0.0 变量。
2、在安装LINUX中,必须完全安装“开发”中的所有”开发工具“以及”原有的软件开发“项,以及后来的“兼容性”的全部选项。
3、如果把LC_CTYPE的值改为:zh_CN.GB2312,并多加一个参数LANG,值也是如此,则ORACLE的安装界面就变成了中文了!
4、安装完成后,在建库用命令:dbca 时,出现了 ora-12547:TNS:lost contact 错误。后来看网上说是64位的操作系统装的确是32位的 libaio ,所以请将系统盘的第三张安装:libaio-0.3.103-3.x86_64.rpm 。但我装了64位的libaio后,并在$ORACLE_HOME/bin下relink all 后,仍然不行。后来就先删除了:
rpm -e libaio_devel**
接着删除了 rpm -e libaio**,最后再安装一遍 libaio*64,再用ORACLE用户进到$ORACLE_HOME/bin下,命令:relink all 。就OK了。
5、无论是安装64位的操作系统还是32位的ORACLE提供的操作系统,在安装ORACLE10g R2时,在建库时,都遇到相同的错误,那就是:
TNS ora-12547:lost contact 错误!在32位的LINUX中,我用第三张盘重新安装了libaio-0.****.rpm,然后,在$ORACLE_HOME/bin下运行:./relink all 使得dbca得以正常建库。
安装oracle
从oracle网站上下载10201_database_linux32.zip。解压。
进入到解压后的目录。运行./runInstaller安装。按照默认值安装既可
如果是cpio形式,需要进到此目录后,执行命令:
cpio -idmv < oracle10g64.cpio
以上的试验是在环境:
以及:Oracle Enterprise Linux (32位) +ORACLE 10g R2 (32位)