ora-00230 是因另一会话持有控制文件快照锁(cf锁,id1=0、id2=2)导致rman无法获取,需通过v$enqueue_lock定位持有者,rac环境须各节点分别执行;id2=2为关键标识,不可省略。

ORA-00230 是谁在抢控制文件快照锁
ORA-00230 不是权限或配置问题,而是另一个会话正拿着 CF 锁(ID1 = 0, ID2 = 2)不放,RMAN 备份控制文件时抢不到。这个锁专用于 snapshot controlfile 的排他访问,ID2 = 2 是关键标识,漏掉它就查不到真凶。
常见现象:RMAN 卡在 waiting for snapshot controlfile enqueue,持续几十秒甚至几分钟;BACKUP CURRENT CONTROLFILE 或 BACKUP SPFILE 命令反复失败,但其他备份(如数据文件)正常。
- 必须查
V$ENQUEUE_LOCK,不能只看V$SESSION—— 后者不暴露锁类型和 ID2 - RAC 环境下,
V$ENQUEUE_LOCK不跨实例,得在每个节点都执行诊断 SQL - 如果 SQL 返回空,但 RMAN 仍卡住,大概率是 OS 层残留进程(比如崩溃未清理的
rman或ora_*M[0-9])占着锁没释放
怎么快速定位并确认持有锁的会话
在任意节点连入 SQL*Plus 或 SQL Developer,执行:
SELECT s.SID, s.USERNAME, s.PROGRAM, s.MODULE, s.ACTION, l.ID1, l.ID2 FROM V$SESSION s, V$ENQUEUE_LOCK l WHERE l.SID = s.SID AND l.TYPE = 'CF' AND l.ID1 = 0 AND l.ID2 = 2;
重点看 PROGRAM 和 ACTION 字段:
-
PROGRAM是rman或oracle@... (M002),且ACTION含controlfile autobackup或spfile backup→ 基本可杀 -
MODULE是backup,STATUS为INACTIVE、STATE为WAITING→ 安全 kill 范围 - 千万别碰
PMON、SMON、DBW0这类后台进程,哪怕它们出现在结果里——此时应怀疑锁状态异常,不是 kill 能解决的
杀会话前必须验证的三件事
别一看到 SID 就 ALTER SYSTEM KILL SESSION。先跑这三条:
- 查会话当前状态:
SELECT SID, SERIAL#, STATUS, STATE FROM V$SESSION WHERE SID = <sid>;</sid>—— 必须是INACTIVE+WAITING - 查它是否还在干活:
SELECT EVENT, SECONDS_IN_WAIT FROM V$SESSION WHERE SID = <sid>;</sid>—— 如果EVENT是control file sequential read且SECONDS_IN_WAIT持续增长,说明它真卡住了 - 确认不是定时任务冲突:检查 crontab 或调度工具,是否存在多个
rman脚本在同一分钟触发(尤其 RAC 中各节点未错峰)
满足全部条件后,再执行:ALTER SYSTEM KILL SESSION '<sid>,<serial>' IMMEDIATE;</serial></sid>
杀完之后怎么验证真解决了
别等下次备份窗口才确认。立刻手动试最小闭环:
- 进 RMAN:
rman target / as sysdba - 强制绕过自动配置,直备 SPFILE:
BACKUP SPFILE TO '/tmp/spfile_bak.ora'; - 成功后,再试控制文件:
BACKUP CURRENT CONTROLFILE TO '/tmp/ctl_bak.ctl';
如果第二步又报 ORA-00230,说明锁没清干净,或者刚 kill 完就有新脚本立刻抢占了锁 —— 这时候得翻 crontab,把所有备份任务暂停,逐个排查启动逻辑。RAC 下最容易忽略的是:不同节点的备份脚本用了相同时间点,却没做分布式互斥。











