一、解决问题
此问题因为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>
四、小结
此问题不复杂,但了解其业务逻辑关系处理起来就方便了。