ORA-01102

一、解决问题

此问题因为lk<sid>文件造成。

[oracle@ocp dbs]$ fuser -u lkOCPTEST 
lkOCPTEST:           14158(oracle) 14160(oracle) 14162(oracle) 14164(oracle) 14166(oracle) 14168(oracle) 14170(oracle) 14172(oracle) 14174(oracle) 14176(oracle) 14178(oracle) 14186(oracle) 14367(oracle) 14369(oracle) 18196(oracle)
[oracle@ocp dbs]$ fuser -k lkOCPTEST 
lkOCPTEST:           14158 14160 14162 14164 14166 14168 14170 14172 14174 14176 14178 14186 14367 14369
[oracle@ocp dbs]$ 

 然后启动数据库就ok了。

[oracle@ocp dbs]$ fuser -u lkOCPTEST 
lkOCPTEST:           14158(oracle) 14160(oracle) 14162(oracle) 14164(oracle) 14166(oracle) 14168(oracle) 14170(oracle) 14172(oracle) 14174(oracle) 14176(oracle) 14178(oracle) 14186(oracle) 14367(oracle) 14369(oracle) 18196(oracle)
[oracle@ocp dbs]$ fuser -k lkOCPTEST 
lkOCPTEST:           14158 14160 14162 14164 14166 14168 14170 14172 14174 14176 14178 14186 14367 14369
[oracle@ocp dbs]$ 

二、问题分析  

1、查看日志错误信息

SQL> ! oerr ora 01102
01102, 00000, "cannot mount database in EXCLUSIVE mode"
// *Cause:  Some other instance has the database mounted exclusive or shared.
// *Action: Shutdown other instance or mount in a compatible mode.

SQL> 

2、当你启动数据库遇到1102报错时,之前的数据库的down操作一般都不是正常完成的,或由于一些异常使Oracle在操作系统中残留一些内存结构,Pmon等一几个进程依然存在等原因使Oracle误认为Instance依然在运行着,所以库就没有启动,具体说来大体原因有如下几个:

1、pmon、smon、lwgw及dbwr这些后台进程依然存在着
2、Oracle开辟的共享内存没有释放掉
3、"lk<sid>" and "sgadef<sid>.dbf"这两个用于锁内存的文件存在着。

三、进一步方法

1、看一下"lk<sid>" and "sgadef<sid>.dbf"这两个文件是不是存在着,如果存在将其删掉。
oracle$cd $ORACLE_HOME/dbs
oracle$ls -l sgadef<sid>.dbf

如果存在删掉它
oracle$rm sgadef<sid>.dbf
oracle$ls -l lk<sid>

如果存在删掉它
oracle$rm lk<sid>

2、看是不是有后台进程存在了
oracle$ps -ef | grep ora_ | grep $ORACLE_SID

如果有pmon这些后台进程的残留,kill -9掉它
oracle$kill -9 pid

3、看一下oracle的共享内存段及信号集(semaphores)是不是还存在着
1)清共享内存段
oracle$ipcs -m   --显示一下,看owner是Oracle用户的
oracle$ipcrm -m <Shared_Memory_ID>

2)清信号集
oracle$ipcs -s   --显示一下,看owner是Oracle用户的
oracle$ipcrm -s <Semaphore_ID>

四、小结

  此问题不复杂,但了解其业务逻辑关系处理起来就方便了。

原文地址:https://www.cnblogs.com/alexy/p/ora_01102.html