Oracle的报错:ORA-00845MEMORY_TARGET not supported on this system和ORA-01102: cannot mount database in EXCLUSIVE mode

可能会奇怪为什么两个报错写到一起,可以明确的说,这两个报错都和内存有关。

ORA-00845:MEMORY_TARGET not supported on this system这个报错通常是在启动数据库发生,有的人是在重启机器后,再次启动Oracle数据库时报错,有的是在使用过程中,重启Oracle报错。产生的原因大体如下:

 

oracle 11g中新增的内存自动管理的参数MEMORY_TARGET,它能自动调整SGA和PGA,这个特性需要用到/dev/shm共享文件系统,而且要求/dev/shm必须大于MEMORY_TARGET,如果/dev/shm比MEMORY_TARGET小,就会报错。

是不是有点眼熟的感觉?没错,在内核管理文件 /etc/sysctl.conf内,我们可以发现如下参数:

kernel.shmall = 18446744073692774399
      kernel.shmmax = 18446744073692774399
      kernel.shmmni = 4096

通俗的说,我们设定的这个kernel.shmmax的值过于小了,那么又不能胡乱设置.

通过我的这个博客设置的数值是没有错的,然后重启机器即可解决问题。

第二个报错:ORA-01102: cannot mount database in EXCLUSIVE mode,也是在启动Oracle数据库时发生,据别的技术文章,原因如下:

 

一、在系统中,已经有其他节点启动了实例,将双机共享的资源(如磁盘阵列上的裸设备)占用了;

二、说明Oracle被异常关闭时,有资源没有被释放,一般有以下几种可能,

1、 Oracle的共享内存段或信号量没有被释放;

2、 Oracle的后台进程(如SMON、PMON、DBWn等)没有被关闭;

3、 用于锁内存的文件lk<sid>和sgadef<sid>.dbf文件没有被删除。

原因说了很多,可能还是茫然,不知道该怎么办,其实也说的很清楚了,并不是Oracle的某些地方的设置问题,而是某些关键内存被占用而已,说人话,也就是和 /dev/shm 这个还是有点关系,但,只是某些进程并没有释放内存资源导致的问题,那么,解决的方法很简单:重启机器。

其实呢,MySQL数据库也是有同样的问题,很多人都会遇到,mysql的主进程并未关闭,然后又想在启动MySQL,系统一看,内存里有显示启动MySQL啊,你在这么启动,如果成功了,那么系统不是有概率会内存崩溃了?所以,会报错,提示不能启动的。

总结:基本是有关内存的报错,最好是重启一下机器,如果你当时并没有有效的手段释放内存(Linux的清理内存大部分操作是找到出问题的进程,然后kill -9 这个进程,对吧,这其实就是有效手段的一种)。

两个报错,都和内存有关,产生的原因比较复杂,但,高效的手段就是重启机器。(不是见到错误就重启,首先搞明白什么原因,内存的管理是很复杂的事情,重启只是快速初始化内存,从而迅速排除错误)

看懂的,请掌声。