** 一、提出问题 **
实际过程中有时我们会遇到这样的问题,当你用 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
1<sid>" and "sgadef<sid>.dbf" 这两个用于锁内存的文件存在着。
2
3** 三、解决问题 **
4
5知道了原因,解决起来就简单多了,办法如下:
6
71 、看一下 "lk<sid>" and "sgadef<sid>.dbf" 这两个文件是不是存在着,如果存在将其删掉。
8
9oracle$cd $ORACLE_HOME/dbs
10
11oracle$ls -l sgadef<sid>.dbf
12
13如果存在删掉它
14
15oracle$rm sgadef<sid>.dbf
16
17oracle$ls -l lk<sid>
18
19如果存在删掉它
20
21oracle$rm lk<sid>
22
232 、看是不是有后台进程存在了
24
25oracle$ps -ef | grep ora_ | grep $ORACLE_SID
26
27如果有 pmon 这些后台进程的残留, kill -9 掉它
28
29oracle$kill -9 pid
30
313 、看一下 oracle 的共享内存段及信号集 (semaphores) 是不是还存在着
32
331) 清共享内存段
34
35oracle$ipcs -m \-- 显示一下 , 看 owner 是 Oracle 用户的
36
37oracle$ipcrm -m <shared_memory_id>
38
392) 清信号集
40
41oracle$ipcs -s \-- 显示一下 , 看 owner 是 Oracle 用户的
42
43oracle$ipcrm -s <semaphore_id>
44
45** 四、应该没问题了,再试一下吧 ^-^ **</semaphore_id></shared_memory_id></sid></sid></sid></sid></sid></sid></sid></sid>