今天在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.
網上找了一下,發現日志:http://nitar.blog.163.com/blog/static/28638792009116355706/,處理方法如下(通過下面的方面,問題成功解決):
發現是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.
數據庫異常關閉後無法啟動問題處理一例
某系統突然掉電,系統啟動後發現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是否存在,如果存在,則刪除。