今天在startup数据库时,发生如下错误:

SQL> conn /as sysdba
Connected to an idle instance.
SQL> startup
oracle instance started.

Total System Global Area 276824064 bytes
Fixed Size 778736 bytes
Variable Size 137371152 bytes
Database Buffers 138412032 bytes
Redo Buffers 262144 bytes
ORA-01102: cannot mount database in EXCLUSIVE mode

SQL> shutdown immediate
ORA-01507: database not mounted

oracle instance shut down.

出现ORA-1102错误可能有以下几种可能:
一、在HA系统中,已经有其他节点启动了实例,将双机共享的资源(如磁盘阵列上的裸设备)占用了;
二、说明Oracle被异常关闭时,有资源没有被释放,一般有以下几种可能,
1、 Oracle的共享内存段或信号量没有被释放;
2、 Oracle的后台进程(如SMON、PMON、DBWn等)没有被关闭;
3、 用于锁内存的文件lk<sid>和sgadef<sid>.dbf文件没有被删除。
 
第一点,可以通过在备节点上查数据库状态来判断是否已启动实例。
第二点,如果系统是因为断电引起数据库宕机的,并且系统在接电被重启后,我们可以排除第二种可能的1、2点。接下来考虑第3点。

GOOGLE一下,发现是lk<SID>文件造成的,该文件位于ORALCE_HOME下的dbs目录下,马上检查该文件:

[root@qa- oracle dbs]# fuser -u lkNDMSQA
lkNDMSQA: 6666( oracle ) 6668( oracle ) 6670( oracle ) 6672( oracle ) 6674( oracle ) 6676( oracle ) 6678( oracle ) 6680( oracle ) 6690(oracle ) 6692( oracle ) 6694( oracle ) 6696( oracle ) 6737( oracle ) 6830( oracle )

果然该文件没释放,用fuser命令kill掉:

[root@qa- oracle dbs]# fuser -k lkNDMSQA
lkNDMSQA: 6666 6668 6670 6672 6674 6676 6678 6680 6690 6692 6694 6696 6737 6830
[root@qa- oracle dbs]# fuser -u lkNDMSQA

然后:

SQL> startup
oracle instance started.

Total System Global Area 276824064 bytes
Fixed Size 778736 bytes
Variable Size 137371152 bytes
Database Buffers 138412032 bytes
Redo Buffers 262144 bytes
Database mounted.
Database opened.
SQL>

数据库成功OPEN.

关于该错误更详细的介绍如下:原文链接:http://www.hellodba.com/cases/case-unexception_down.htm