Oracle起動庫時1102報錯處理
2024-08-29 13:30:54
供稿:網友
 
一、提出問題
 
實際過程中有時我們會遇到這樣的問題,當你用startup試圖啟動數據庫時會遇到ora-01102的報錯。我們可以在unix下切換到oracle的用戶,執行一下oerr ora 1102便會看到有關1102的簡短的描述,如下:
 
rp2$[/home/ora2]oerr ora 1102
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
 
看了這個1102的簡短的解釋你一定有些迷惑,因為它有一些的誤導性。如下我便來分析一下問題產生的原因,并給出解決的辦法。
 
二、分析原因
 
當你啟動數據庫遇到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>
 
四、應該沒問題了,再試一下吧^-^