分类: Oracle
ORA-27102: out of memory 故障处理

ORA-27102: out of memory一般发生在服务器系统配置变更以后,oracle在启动的时候报错,

SQL> startup
ORA-27102: out of memory
Linux-x86_64 Error: 28: No space left on device

系统实际可用内存还剩几十个GB,这个问题在linux到64位中比较常见,当SGA的值大于共享内存就会报这个错;
解决方法:

--MetaLink上给出了关于这个问题的描述 [ID 301830.1]
--是由于kernel.shmall值设置太小引起的

kernel.shmall
该参数用于配置系统一次能够使用的最大的共享页面数,该参数的值总是ceil(shmmax/PAGE_SIZE)
Oracle 9i,10g,11g的x86以及x86-64平台推荐以及缺省的大小通常为2097152
在大多数情况下,该参数是够用的。按照上述计算方式页面内存总大小可以达到8GB(20971524096 bytes (shmallPAGE_SIZE))

通常情况下,PAGE_SIZE 的大小为4096byte,除非使用了Big Pages 或 Huge Pages
对于超出8GB系统内存,如共享内存段(shmmax)的最大大小是16G,则所需要共享内存页数(shmall)为16GB/4KB=16777216KB/4KB=4194304(页)

共享内存在shmall这个参数中设置,shmall单位为页,换算成内存大小还需要把两个值相乘,如shmall=8388608,那么共享内存的大小就是(83886084096)/(10241024*1024)=32G
其他依次类推;
下面查看本机的设置

# getconf PAGE_SIZE
4096

# /sbin/sysctl -a | grep shm
vm.hugetlb_shm_group = 0
kernel.shmmni = 4096         --定义共享内存段的最大数量,也就是可以开辟多少个共享内存段,一般够用 
kernel.shmall = 2097152     --由于当前server有多个db运行,应该是总页数超出所致
kernel.shmmax = 4294967296  --定义单个共享内存段的最大值,由于当前server没有sga大于4gb的,可以保留原值

vi /etc/sysctl.conf  --修改kernel.shmall的值,将其改为16gb能容纳的页面数,使用root身份
kernel.shmall= 8388608  
sysctl -p                --使修改立即生效,无需重启server
cat /proc/sys/kernel/shmall   --查看确认

最后在启动oracle即可。


相关博文:

发表新评论