今天测试服务器的Oracle突然关闭了,测试组跟我说的时候我就直接上去startup了一下,结果Oracle的提示有点不对劲。
SQL> startup mount
ORACLE instance started.
Total System Global Area 1068937216 bytes
Fixed Size 2260088 bytes
Variable Size 331350920 bytes
Database Buffers 729808896 bytes
Redo Buffers 5517312 bytes
ORA-01102: cannot mount database in EXCLUSIVE mode
这可让我觉得有点奇怪了。
逐网上找了下资料,发现有人的解决办法比较简单粗暴,直接删除/u01/app/oracle/product/10.2.0/db_1/dbs/lkEPPS文件,但是后来又出现其它错误。
有个老外写的方法比较靠谱,我这里使用的就是老外的方法,都是些简单的英语,记录下来备用。
Problem Description:
====================
You are trying to startup the database and you receive the following error:
ORA-01102: 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.
Problem Explanation:
====================
A database is started in EXCLUSIVE mode by default. Therefore, the ORA-01102 error is misleading and may have occurred due to one of the following reasons:
- there is still an “sgadef.dbf” file in the “ORACLE_HOME/dbs” directory
- the processes for Oracle (pmon, smon, lgwr and dbwr) still exist
- shared memory segments and semaphores still exist even though the
database has been shutdown
- there is a “ORACLE_HOME/dbs/lk” file
Search Words:
=============
ORA-1102, crash, immediate, abort, fail, fails, migration
Solution Description:
=====================
Verify that the database was shutdown cleanly by doing the following:
- Verify that there is not a “sgadef.dbf” file in the directory “ORACLE_HOME/dbs”.
% ls $ORACLE_HOME/dbs/sgadef<sid>.dbf If this file does exist, remove it. % rm $ORACLE_HOME/dbs/sgadef<sid>.dbf
- Verify that there are no background processes owned by “oracle” % ps -ef | grep ora_ | grep $ORACLE_SID
If background processes exist, remove them by using the Unix
command “kill”. For example:
% kill -9 <rocess_ID_Number>
- Verify that no shared memory segments and semaphores that are owned by “oracle” still exist
% ipcs -b
If there are shared memory segments and semaphores owned by “oracle”, remove the shared memory segments
% ipcrm -m <Shared_Memory_ID_Number>
and remove the semaphores
% ipcrm -s <Semaphore_ID_Number>
NOTE: The example shown above assumes that you only have one
database on this machine. If you have more than one
database, you will need to shutdown all other databases
before proceeding with Step 4.
- Verify that the “$ORACLE_HOME/dbs/lk” file does not exist
- Startup the instance
Solution Explanation:
=====================
The “lk” and “sgadef.dbf” files are used for locking shared memory. It seems that even though no memory is allocated, Oracle thinks memory is still locked. By removing the “sgadef” and “lk” files you remove any knowledge oracle has of shared memory that is in use. Now the database can start.