ORA-01102: cannot mount database in EXCLUSIVE mode

   安装完数据库启动的时候报错ORA-01102: cannot mount database in EXCLUSIVE mode

 

这是个常见的错误。下面这个case讲述了如何fix.
 
一、提出问题
 
实际过程中有时我们会遇到这样的问题,当你用startup试图启动数据库时会遇到ORA-01102的报错。
 我们可以在Unix下切换到Oracle的用户,执行一下oerr ora 1102便会看到有关1102的简短的描述,
 如下:
 

$oerr ora 1102
 
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
 

看了这个1102的简短的解释你一定有些迷惑,因为它有一些的误导性。如下我便来分析一下问题产生的原因,并给出解决的办法。
 


二、分析原因
 
当你启动数据库遇到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>
 

 

ORA-01102 报错解决方法  
 
SQL> startup
 

ORACLE instance started.
 
Total System Global Area  599785472 bytes
 
Fixed Size                  2022600 bytes
 
Variable Size             171967288 bytes
 
Database Buffers          419430400 bytes
 
Redo Buffers                6365184 bytes
 
ORA-01102: cannot mount database in EXCLUSIVE mode
 
这个错误主要是lk<SID>文件造成的,该文件位于ORALCE_HOME下的dbs目录下,
 


这个lk<SID>的主要作用是说明DATABASE MOUNT上了,不用在MOUNT了.DATABASE UNMOUNT 后会删除掉,如果DATABASE确实没有MOUNT,这个文件在你也MOUNT上,只有手工删除,所以一定要小心.
 
具体解决ORA-01102问题的步骤:
 
# /sbin/fuser -u lkTEST
 
lkTEST: 4918(oracle) 20726(oracle) 20728(oracle) 20730(oracle) 20732(oracle) 20734(oracle) 20736(oracle) 20738(oracle) 20740(oracle) 20742(oracle) 20744(oracle) 20746(oracle) 20754(oracle) 21781(oracle) 21783(oracle)
 
该文件没释放,用fuser命令kill掉:
 
# /sbin/fuser -k lkTEST
 
lkTEST: 6666 6668 6670 6672 6674 6676 6678 6680 6690 6692 6694 6696 6737 6830
 
# /sbin/fuser -u lkTEST
 
然后:
 
SQL> startup
 
ORACLE instance started.
 
Total System Global Area  599785472 bytes
 
Fixed Size                  2022600 bytes
 
Variable Size             171967288 bytes
 
Database Buffers          419430400 bytes
 
Redo Buffers                6365184 bytes
 
Database mounted.
 
Database opened.
 
SQL>
 
数据库成功OPEN.

 

你可能感兴趣的:(database)