实例恢复慢的根源在于集群资源注册和asm磁盘组挂载阶段被阻塞,需优先检查ora.asm、ora.cssd、ora.diskmon状态是否均为online,ocr/voting disk路径是否为多路径聚合设备,以及data磁盘组是否处于mounted状态。

实例恢复慢不是数据库层卡住,而是集群资源注册和 ASM 磁盘组挂载阶段被阻塞;真正拖时间的环节在 ora.asm 启动失败、ora.<db_name>.db</db_name> 资源状态为 UNKNOWN、或 DATA 磁盘组仍处于 DISMOUNTED 状态。
srvctl start instance 执行卡住时先查什么
执行 srvctl start instance -d orcl -i orcl1 卡住,别急着重试——它本质是向 CRS 提交启动请求,后续全由 Clusterware 驱动。卡住说明底层依赖没就绪:
-
crsctl stat res -t | grep -E "(asm|cssd|diskmon)":确认ora.asm、ora.cssd、ora.diskmon全部是ONLINE;若ora.asm是OFFLINE或INTERMEDIATE,实例根本不会开始启动 -
crsctl check cluster -n <node_name></node_name>:返回CRS-4638才算通过;若报CRS-4639,说明 OHAS 没起来,得先crsctl start crs(root 用户) -
ocrcheck和votedisk状态:运行crsctl query css votedisk,输出设备名必须是多路径聚合后设备(如/dev/mapper/vote01),不能是/dev/sdb这类物理盘;否则ora.asm会反复尝试访问失败
ora.asm 启动失败常见原因与快速验证
ora.asm 卡在 STARTING 或直接变 OFFLINE,90% 和 ASM 实例自身无法拉起有关,而非磁盘故障:
- 检查
orapw+ASM是否存在且权限正确:ls -l $GRID_HOME/dbs/orapw+ASM,必须属主grid,权限-rw-r-----;缺失或权限错会导致 ASM 实例静默退出 - 确认 ASM 监听是否就位:
lsnrctl status LISTENER_SCAN1(或对应 SCAN 监听名),若监听未运行,ora.asm注册失败后会退回到OFFLINE - 查
$GRID_HOME/log/<hostname>/asm/asm.log</hostname>,重点搜ORA-15077(找不到 ASM 实例服务 OCR)、ORA-15183(ASM 参数文件缺失)、ORA-15032(磁盘组未 mount) - 手动测试 ASM 连接:
sqlplus / as sysasm,进不去就说明密码文件、监听、或 ASM 进程本身有问题;能进去但select name, state from v$asm_diskgroup;显示空或DISMOUNTED,问题在磁盘路径或多路径配置
磁盘组 Dismounted 导致实例无法启动怎么办
节点恢复后 DATA 或 FRA 磁盘组仍是 DISMOUNTED,实例必然无法启动——因为数据文件不可见。这不是等就能好的问题,必须主动干预:
- 先确认磁盘路径是否真实可用:
asmcmd lsdsk -k(加-k显示内核态路径),看输出里有没有大量ORCL:MISSING或路径指向已失效的设备(比如旧多路径名/dev/dm-3,而当前multipath -ll显示的是/dev/mapper/data01) - 刷新 ASM 发现路径:
alter system flush asm_discovery;(在已 mount 的其他磁盘组上执行),再asmcmd lsdsk看是否识别新路径 - 若磁盘组仍不 mount,手动强制 mount:
alter diskgroup DATA mount;失败则看 alert.log 里具体报错,常见是权限(grid用户对设备无读写)、udev 规则未生效、或存储链路未完全恢复(如光纤交换机 zone 错误) - 切忌跳过磁盘组 mount 直接启实例——
srvctl start instance会一直等待,直到超时或人工中断
实例启动后响应仍慢的隐藏瓶颈
实例进程起来了、v$instance 显示 OPEN,但应用连上去还是慢,这时候问题已不在集群层,而在数据库内部初始化过程:
- 查
v$session中是否存在大量ACTIVE状态的SMON、DBW0或CKPT进程,它们卡在 recovery 阶段,说明前序实例崩溃留下大量未刷盘事务,正在做 instance recovery - 检查
v$recovery_file_status和v$log_history,确认是否有归档日志缺失或 gap,导致 recovery 停滞 - 留意
alter database open后的 alert.log,搜索Media Recovery、Instance Recovery、parallel recovery—— 如果 recovery 时间远超正常值(比如 >5 分钟),大概率是 redo 日志损坏或 I/O 子系统延迟高 - 不要忽略 OS 层:
iostat -x 1 5看%util和await,若存储响应长期 >50ms,实例即使启动完成,也会因 I/O hang 表现为“假死”
真正耗时的从来不是命令敲下去那一下,而是你没去查的那几行日志、没确认的那两个路径、以及以为“自动恢复”就不用管的那一个磁盘组状态。











