ora-01102错误在oracle 12c rac中主因是本地节点残留ipc资源(lk、sgadef.dbf、共享内存段、信号量)或cluster_database=false;需依次检查集群状态、删除锁文件、杀残留进程、清理ipcs资源,并校验cluster_database参数是否为true。
ora-01102: cannot mount database in exclusive mode 在 oracle 12c rac 环境中出现,不是因为“别的实例真在独占运行”,而是本地节点残留了上一次异常关闭留下的 ipc 资源。rac 下每个实例本应共享磁盘但隔离内存资源,一旦 ipcs 残留或 lk<sid></sid> 文件未清理,startup 就会误判为“已有实例在用”,直接拒绝挂载。
查进程和锁文件:先确认是不是真有活实例在抢资源
别急着清内存——先排除真实冲突:
- 用
crsctl stat res -t | grep ora.<db>.db</db>看整个集群里这个数据库是否已在其他节点 running;如果是,srvctl stop database -d <db></db>统一停掉再操作 - 进当前节点的
$ORACLE_HOME/dbs,执行ls lk*:如果看到lk<sid></sid>(比如lkCDB11),说明锁文件没删干净,这是最常见原因 - 检查
ps -ef | grep "ora_.*_<sid>"</sid>:重点看ora_pmon_<sid></sid>、ora_smon_<sid></sid>是否还活着;有就kill -9 <pid></pid>,但注意别杀错 SID 的进程
清共享内存段(shm)和信号量(sem):ipcs + ipcrm 是核心动作
RAC 实例启动失败时,90% 的 ORA-01102 根源是内核 IPC 对象没释放。必须手动清理:
- 运行
ipcs -m查共享内存段:关注owner是 oracle 用户、bytes较大(如 33554432)、且nattch为 0 的项——这类就是僵尸段 - 运行
ipcs -s查信号量:同样找owner是 oracle、nsems≥ 100 的数组;RAC 实例通常用 162 或 154 个信号量 - 逐个清理:
ipcrm -m <shmid></shmid>和ipcrm -s <semid></semid>;不要用ipcs -ma或ipcs -sa全删——可能影响其他 Oracle 实例 - 清理后立刻再跑一遍
ipcs -m和ipcs -s,确认对应 SID 的条目已消失
删 sgadef.dbf 和 lk:两个文件不除,startup 必报错
这两个文件是 Oracle 启动时用于进程互斥的本地锁标记,不在 ASM 或共享存储上,只存在于本地 $ORACLE_HOME/dbs。异常关机后它们常残留:
-
sgadef<sid>.dbf</sid>是 SGA 定义文件,记录上次分配的共享内存 key;lk<sid></sid>是锁文件,startup会尝试flock()它,失败就抛ORA-01102 - 执行
rm -f $ORACLE_HOME/dbs/sgadef<sid>.dbf $ORACLE_HOME/dbs/lk<sid></sid></sid>;注意替换真实 SID,大小写敏感 - 别跳过这步——哪怕
ipcs已空、进程已杀,只要lk<sid></sid>还在,startup mount仍会卡在 “failed to lock … exclusive”
RAC 特有坑:cluster_database 参数被意外设为 false
在单实例环境改过参数后又导入到 RAC,或用 DBCA 手动建库时选错模式,会导致 cluster_database=false。这时实例试图以 EXCLUSIVE 模式启动,但 RAC 的 OCR 和 CRS 机制不允许:
- 查当前值:
sqlplus / as sysdba -c "show parameter cluster_database";若返回FALSE,就是根源 - 临时修复(需重启):
alter system set cluster_database=true scope=spfile sid='*'; - 然后用
srvctl modify database -d <db> -o $ORACLE_HOME</db>确保配置同步,再srvctl start database -d <db></db> - 这个参数一旦错,
startup不报具体提示,只会卡在 mount 阶段并抛ORA-01102,容易误判为资源残留
真正麻烦的从来不是命令记不住,而是清理顺序错了——先删文件、再杀进程、最后清 IPC;或者在 RAC 里忘了 cluster_database 这个隐形开关。漏掉任意一环,startup 都会原地报错。











