昨天,一同事向我请教异机恢复的oracle数据库,还是单实例的数据库为什么启动不了,她说主机内存明明是30G,自己规划的oracle pga 3g、sga 10g,但是oracle执行startup的时候提示OOM,很是奇怪。

一、问题现象

如图所示,oracle实例在按照规划的pfile启动时提示ORA-27102 out of memory,额外的提示是Additional information 1409286144。

ORACLE 无法启动OOM之linu内核参数shmmax#yyds干货盘点#_linux

二、问题分析

根据个人经验,导致oracle启动时OOM无非有三个地方:

1、sga+pga分配确实太大超过了linux主机的内存容量

2、共享内存设置过小不足以容纳oracle的sga+pga

3、linux主机内存参数sshmax设置过小

按照以上三个疑点进行检查,首先查看linux主机内存为31G,pga+sga规划13G,主机内存和oracle数据库实例规划没问题:

ORACLE 无法启动OOM之linu内核参数shmmax#yyds干货盘点#_oracle数据库_02

再看linux主机共享设备大小为16G,主机内存共享设备也满足要求;

ORACLE 无法启动OOM之linu内核参数shmmax#yyds干货盘点#_oracle_03

最后,查看linux内核参数配置,shmmax设置看着貌似没问题是一个十分大的数字,但是经过测试确实是shmmax设置过大导致的。

三、问题处理

重新合理设置shmmax参数为25g,root执行sysctl -p使参数调整生效;

ORACLE 无法启动OOM之linu内核参数shmmax#yyds干货盘点#_oracle数据库_04

然后保持oracle的sga和pga不变,重新启动数据库能够成功启动;

ORACLE 无法启动OOM之linu内核参数shmmax#yyds干货盘点#_oracle_05

四、总结

通过虚拟机模板克隆的主机,在做其他用途时,尤其是数据库服务器主机时,要再次排查调整系统参数,避免类似的参数设置过大不生效,导致数据库实例无法使用系统可用内存而启动失败。