一、提出问题
实际过程中有时我们会遇到这样的问题,当你用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>.dbforacle$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>
Java Asp PHP .Net XML C/C++ CGI VB Jsp J2ee J2se J2me EJB Servlet Tomcat Resin Struts Weblogic Eclipse ANT GUI JMS Web servise IDEA Webphere Hibernate Spring Jboss Applet Swing Socket Javamail Perl Ajax P2P 安全 模式 框架 测试 开源 游戏
Windows XP Windows 2000 Windows 2003 Windows Me Windows 9.x Linux UNIX 注册表 操作系统 服务器 应用服务器