ORA-01102 cannot mount database in EXCLUSIVE mode 解決辦法

SQL> startup mount       

ORACLE instance started.

 

Total System Global Area  608174080 bytes

Fixed Size                 1220844 bytes

Variable Size            176164628 bytes

Database Buffers      427819008 bytes

Redo Buffers             2969600 bytes

ORA-01102: cannot mount database in EXCLUSIVE mode

 

Google了一下發現一個寫的非常好的帖子,詳細內如如下(被我修改過了!)

 

分析原因:

一、在HA系統中,已經有其他節點啓動了實例,將雙機共享的資源(如磁盤陣列上的裸設備)佔用了;

 

二、說明Oracle被異常關閉時,有資源沒有被釋放,一般有以下幾種可能,

1、 Oracle的共享內存段或信號量沒有被釋放;

2、 Oracle的後臺進程(如SMON、PMON、DBWn等)沒有被關閉;

3、 用於鎖內存的文件lk<sid>和sgadef<sid>.dbf文件沒有被刪除。

 

解決思路:

當發生1102錯誤時,可以按照以下流程檢查、排錯:

如果是HA系統,檢查其他節點是否已經啓動實例
檢查Oracle進程是否存在,如果存在則殺掉進程
檢查信號量是否存在,如果存在,則清除信號量
檢查共享內存段是否存在,如果存在,則清除共享內存段
檢查鎖內存文件lk<sid>和sgadef<sid>.dbf是否存在,如果存在,則刪除。
 

具體做法:

首先,雖然我們的系統是HA系統,但是備節點的實例始終處在關閉狀態,這點通過在備節點上查數據庫狀態可以證實。

其次、是因系統掉電引起數據庫宕機的,系統在接電後被重啓,因此我們排除了第二種可能種的1、2點。最可疑的就是第3點了。

查$ORACLE_HOME/dbs目錄:

$ cd $ORACLE_HOME/dbs

$ ls sgadef*

sgadef* not found

$ ls lk*

/opt/oracle/product/ 10.2.0/db_1/dbs/lkSIMPLY

lkSIMPLY

果然,lk<sid>文件沒有被刪除。將它刪除掉

$ rm lk*

 

再次啓動時又遇到下面的錯誤,不過別擔心,繼續後面的操作就搞定

SQL> startup mount

ORACLE instance started.

 

Total System Global Area  608174080 bytes

Fixed Size    1220844 bytes

Variable Size     176164628 bytes

Database Buffers      427819008 bytes

Redo Buffers    2969600 bytes

ORA-00205: error in identifying control file, check alert log for more info   : (

 

查看共享內存段

[root@simply bdump]# ipcs -map

 

------ Shared Memory Creator/Last-op --------

shmid   owner  cpid    lpid

786444  root    6490   6438

819213  root    6549   6438

1409040 oracle   31502  16728

根據ID號清楚共享內存段

ipcrm –m 1409040

我這裏操作是沒有成功的,不過執行了下面的操作就ok了!

 

查看信號量

[root@simply bdump]# ipcs -s

 

key       semid      owner   perms    nsems

0x17ff6454 360448     oracle    640     154

 

清除oracle的信號量

[root@simply bdump]# ipcrm -s 360448

 

再次查詢確認

[root@simply bdump]# ipcs -s

 

------ Semaphore Arrays --------

key  semid  owner  perms   nsems

 

再查詢共享內存段也ok了!

[root@simply bdump]# ipcs -m

 

如果是Oracle進程沒有關閉,

$kill -9 <PID>

 

 

 

 

 

 

 

 

 


第二種解決方法!


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

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章