ORA-ORA-01102: cannot mount database in EXCLUSIVE mode


今天在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.
 
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
 
數據庫異常關閉後無法啓動問題處理一例
 
作者: fuyuncat
 
 
某系統突然掉電,系統啓動後發現Oracle無法啓動。啓動時報如下錯誤:
ORA-01102 cannot mount database in EXCLUSIVE mode
 
出現1102錯誤可能有以下幾種可能:
一、在HA系統中,已經有其他節點啓動了實例,將雙機共享的資源(如磁盤陣列上的裸設備)佔用了;
 
二、說明Oracle被異常關閉時,有資源沒有被釋放,一般有以下幾種可能,
1、 Oracle的共享內存段或信號量沒有被釋放;
2、 Oracle的後臺進程(如SMON、PMON、DBWn等)沒有被關閉;
3、 用於鎖內存的文件lk<sid>和sgadef<sid>.dbf文件沒有被刪除。
 
首先,雖然我們的系統是HA系統,但是備節點的實例始終處在關閉狀態,這點通過在備節點上查數據庫狀態可以證實。
其次、是因系統掉電引起數據庫宕機的,系統在接電後被重啓,因此我們排除了第二種可能種的1、2點。最可疑的就是第3點了。
查$ORACLE_HOME/dbs目錄:
$ cd $ORACLE_HOME/dbs
$ ls sgadef*
sgadef* not found
$ ls lk*
lkORA92
 
果然,lk<sid>文件沒有被刪除。將它刪除掉
$ rm lk*
 
再啓動數據庫,成功。
 
如果懷疑是共享內存沒有被釋放,可以用以下命令查看:
$ipcs -mop
IPC status from /dev/kmem as of Thu Jul  6 14:41:43 2006
T      ID     KEY        MODE        OWNER     GROUP NATTCH  CPID  LPID
Shared Memory:
m       0 0x411c29d6 --rw-rw-rw-      root      root      0   899   899
m       1 0x4e0c0002 --rw-rw-rw-      root      root      2   899   901
m       2 0x4120007a --rw-rw-rw-      root      root      2   899   901
m  458755 0x0c6629c9 --rw-r-----      root       sys      2  9113 17065
m       4 0x06347849 --rw-rw-rw-      root      root      1  1661  9150
m   65541 0xffffffff --rw-r--r--      root      root      0  1659  1659
m  524294 0x5e100011 --rw-------      root      root      1  1811  1811
m  851975 0x5fe48aa4 --rw-r-----    oracle  oinstall     66  2017 25076
 
然後它ID號清除共享內存段:
$ipcrm –m 851975
 
對於信號量,可以用以下命令查看:
$ ipcs -sop
IPC status from /dev/kmem as of Thu Jul  6 14:44:16 2006
T      ID     KEY        MODE        OWNER     GROUP
Semaphores:
s       0 0x4f1c0139 --ra-------      root      root
... ...
s      14 0x6c200ad8 --ra-ra-ra-      root      root
s      15 0x6d200ad8 --ra-ra-ra-      root      root
s      16 0x6f200ad8 --ra-ra-ra-      root      root
s      17 0xffffffff --ra-r--r--      root      root
s      18 0x410c05c7 --ra-ra-ra-      root      root
s      19 0x00446f6e --ra-r--r--      root      root
s      20 0x00446f6d --ra-r--r--      root      root
s      21 0x00000001 --ra-ra-ra-      root      root
s   45078 0x67e72b58 --ra-r-----    oracle  oinstall
 
根據信號量ID,用以下命令清除信號量:
$ipcrm -s 45078
 
如果是Oracle進程沒有關閉,用以下命令查出存在的oracle進程:
$ ps -ef|grep ora
  oracle 29976     1  0  Jun 22  ?         0:52 ora_dbw0_ora92
  oracle 29978     1  0  Jun 22  ?         0:51 ora_dbw1_ora92
  oracle  5128     1  0  Jul  5  ?         0:00 oracleora92 (LOCAL=NO)
... ...
 
然後用kill -9命令殺掉進程
$kill -9 <PID>
 
總結:
當發生1102錯誤時,可以按照以下流程檢查、排錯:
1.如果是HA系統,檢查其他節點是否已經啓動實例;
2.檢查Oracle進程是否存在,如果存在則殺掉進程;
3.檢查信 號量是否存在,如果存在,則清除信號量;
4.檢查共享內存段是否存在,如果存在,則清除共享內存段;
5.檢查鎖內存文件 lk<sid>和sgadef<sid>.dbf是否存在,如果存在,則刪除。
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章