公司的一台oracle数据库在启动时候报错ORA-27102: out of memory ,具体如下:

1现象: alter system set sga_max_size=12884901888 scope=spfile      ---(12G)
2出现:
3 SQL >startup force
4ORA-27102: out of memory
5Linux-x86_64 Error: 28: No space left on device

网上查询ORA-27102报错代码的解决方法,发现为sysctl.conf中关于共享内存部分设置不当,造成数据库无法正常启动。sysctl.conf可通过如下查看:

 1[root@ECSDB etc]# cat sysctl.conf 或者到 /proc/sys/kernel 下查看。
 2kernel.shmall = 2097152
 3kernel.shmmax = 8405194752
 4kernel.shmmni = 4096
 5kernel.sem = 250 32000 100 128
 6fs.file-max = 65536
 7fs.file-max = 65536
 8net.ipv4.ip_local_port_range = 1024 65000
 9net.core.rmem_default = 262144
10net.core.rmem_max = 262144
11net.core.wmem_default = 262144
12net.core.wmem_max = 262144

修改 /etc/sysctl.conf 文件之后执行sysctl -p立刻生效命令。和共享内存相关的参数主要为前三个。具体解释如下:

  • kernel.shmmax 用于定义单个共享内存段的最大值,shmmax 设置应该足够大,能在一个共享内存段下容纳下整个的SGA ,设置的过低可能会导致需要创建多个共享内存段,这样可能导致系统性能的下降 。Oralce 的建议是希望一个大的共享内存段能容纳整个SGA,这样在任何时候都不会有甚至轻微的性能下降的隐患,官方的说明为: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.
  • kernel.shmall 参数是控制共享内存页数 。Linux 共享内存页大小为4KB, 共享内存段的大小都是共享内存页大小的整数倍。例如:一个共享内存段的最大大小是16G,那么需要共享内存页数是 16GB/4KB=16777216KB/4KB=4194304 (页)。
  • kernel.shmmni shmmni 内核参数是共享内存段的最大数量(注意这个参数不是 shmmin,是shmmni, shmmin 表示内存段最小大小 ) ,shmmni 缺省值 4096 。

oracle相关的几个参数

  • SGA_MAX_SZIE 为实例允许使用的sga 上限,一个静态参数,是不能动态修改的.如果不设置sga_max_size ,oracle 会自动的以实际的SGA 的总尺寸来设置sga_max_size 的值。
  • SGA_TARGET 是Oracle 10g的一个新特性。自动共享内存管理(Automatic Shared Memory Management ASMM),控制这一特性的,就仅仅是这个参数SGA_TARGE。设置这个参数后,你就不需要为每个内 存区来指定大小了。SGA_TARGET 指定了SGA 可以使用的最大内存大小,而SGA 中各个内存的大小由Oracle 自行控制,不需要人为指定。Oracle 可以随时调节各个区域的大小,使之达到系统性能最佳状态的个最合理大小,并且控制他们之和在SGA_TARGET 指定的值之内。一旦给SGA_TARGET 指定值后(默认为0,即没有启动ASMM),就自动启动了ASMM特性。

oracle其他相关的参数还有DB_CACHE_SIZE、Buffer cache、Shared pool 、Large pool 、Java pool 、streams pool 。