crsctl手工解锁是crs资源循环依赖无法自动启动时最快生效的干预手段,需先排除ocr/olr/asm等底层故障,再按网络→asm监听→asm实例→storage顺序执行crsctl start res -init -f并逐级验证。
crs资源循环依赖无法自动启动时,crsctl 手工解锁是最快生效的干预手段,但必须在确认非底层故障(如ocr损坏、olr丢失、asm未就绪)的前提下进行。
为什么crsctl start res -f会卡在ora.storage或ora.crsd?
这不是命令本身的问题,而是CRS内部依赖链被阻塞后进入等待超时状态。典型表现是:crsctl stat res -t -init 显示 ora.storage 状态为 OFFLINE 或 UNKNOWN,且日志中反复出现 CRS-5055: unable to connect to an ASM instance because no ASM instance is running in the cluster 或 ORA-12541: TNS:no listener。
根本原因往往是:ASM实例因密码文件错误、监听未就绪、或ora.asm资源自身依赖的ora.net1.network尚未稳定,导致ora.storage无法完成初始化,而ora.crsd又依赖ora.storage提供磁盘组访问能力——形成死锁。
- 不要直接重启
ohasd或init.ohasd,这会跳过依赖校验,可能引发更严重的资源状态不一致 - 先用
crsctl stat res -p ora.storage查START_DEPENDENCIES字段,确认它卡在哪一级依赖上 - 检查
$ORACLE_BASE/diag/crs/<hostname>/crs/trace/crsd.trc</hostname>里最近的Dependency evaluation段落,定位首个失败的前置资源
手工解锁的关键命令与执行顺序
核心思路是:绕过自动依赖调度,强制拉起关键基础资源,让链条“活”起来。顺序不能错,否则会触发反向依赖冲突。
- 先确保网络资源就绪:
crsctl start res ora.net1.network -init(注意带-init,这是初始化阶段资源) - 再启动ASM监听(不是数据库监听):
crsctl start res ora.ASMNET1LSNR_ASM.lsnr -init - 强制启动ASM实例:
crsctl start res ora.asm -init -f(-f是关键,跳过状态检查) - 最后解锁存储层:
crsctl start res ora.storage -init -f
每执行一步后,立刻用crsctl stat res -t -init确认该资源是否转为ONLINE。如果某步失败,不要继续往下走,回看对应资源的日志(如asmalert.log或ohasd_orarootagent_root.trc),常见原因是ASM密码文件损坏——此时应转向asmcmd --nocp credfix修复流程。
容易忽略的权限与上下文陷阱
所有crsctl操作必须由root用户执行,且GRID_HOME环境变量必须正确指向集群软件根目录(通常是/u01/app/19c/grid)。临时切换用户或漏设PATH会导致命令找不到或读取错误的配置。
- 执行前务必确认:
echo $GRID_HOME输出正确路径,且ls $GRID_HOME/bin/crsctl可访问 - 不要在
oracle用户下执行,即使加sudo也容易因环境变量继承不全而失败 - 若节点已部分启动(比如
ohasd在运行但crsd没起来),crsctl start res ... -init仍有效;但若ohasd完全挂死,则需先恢复OLR或检查/etc/oracle/olr.loc
真正棘手的从来不是命令记不住,而是分不清当前卡点到底是依赖锁死,还是某个组件已实质损坏。每次执行-f前,多看一眼日志里那行具体的错误码——它比状态显示更诚实。











