srvctl start database 启动失败本质是实例未真正启动,因srvctl仅执行startup不校验状态;常见原因有SPFILE路径错误、ASM磁盘组未挂载、监听未启致归档失败。
srvctl start database 启动失败,报
或
本质是数据库实例没起来,但
以为该起的都起了——它只管调用
执行
,不校验实际状态。常见原因是:spfile 路径不对、asm 磁盘组没挂载、监听没启导致归档失败。
先看整体状态,再用
定位具体哪个实例卡住
进对应节点,手动跑:
→
,观察真实报错;
确认 SPFILE 是否指向 ASM(如
)
如果 SPFILE 在 ASM,确保该磁盘组已在线:
,再查
srvctl stop database 不杀进程,实例还在 running
默认走的是
,但如果某个会话正执行长事务或被锁住,Oracle 就会 hang 住,
超时后返回成功,其实实例还活着。
加
强制终止:
,等价于
,但注意这会导致下次启动需要实例恢复
更稳妥的做法是先查阻塞:
看进程是否存在,再结合
确认 CRS 认为的状态是否同步
别依赖
结果判断“已停”——CRS 可能已标记资源 offline,但 PMON 进程残留,需手动
并清理
下的 ASM 文件句柄(极少数情况)
srvctl add database 时指定的
和
参数影响实例启动顺序和角色
(role)决定数据库在 Data Guard 中的角色(
或
),
(start option)控制启动时是否自动 open(
)还是只到 mount(
)。这两个参数不光影响 DG 切换逻辑,也决定
的最终行为。
主库必须设
,否则启动后是 mounted 状态,应用连不上
备库若设
,启动后自动进入 MOUNT + managed recovery,符合 DG 最佳实践
改错后不能直接
更新角色——得先
再重新
,否则 CRS 注册信息和实际 DB 角色不一致,切主时可能失败
集群内多个数据库共用监听,srvctl start listener 失败但数据库能连
这是因为
启的是 CRS 管理的监听资源(比如
),而 Oracle 数据库可能用的是本地
指向非 CRS 管理的监听(如手工启的
)。两者监听名、端口、协议可能重叠但互不感知。
查监听资源名:
,确认是否启用了
指定的监听名;默认是
,但 RAC 中常配成
或自定义名
检查监听配置文件:
,重点看
是否包含
和
地址,CRS 只认它声明的地址
别用
判断 CRS 监听状态——它只显示本地监听进程,应改用
RAC 实例管理里最易被忽略的不是命令怎么敲,而是 CRS 资源状态、数据库实际状态、ASM 磁盘组状态三者之间存在延迟和不一致。一次看似成功的
后,务必交叉验证三处输出。
CRS-2674ORA-01078srvctlsqlplus / as sysdbastartupsrvctl status database -d srvctl status instance -d -i sqlplus / as sysdbastartup nomountshow parameter spfile+DATA//spfile.ora crsctl stat res -t | grep -i asmasmcmd lsdgsrvctl stop databaseshutdown immediatesrvctl-o abortsrvctl stop database -d -o abort shutdown abortps -ef | grep pmon | grep crsctl stat res -w "TYPE = ora.database.type"pskill -9/proc//fd/ -r-s-rPRIMARYPHYSICAL_STANDBY-sopenmountsrvctl start database-r PRIMARY -s open-r PHYSICAL_STANDBY -s mountsrvctl modify databasesrvctl remove databaseaddsrvctl start listenerora..LISTENER.lsnr tnsnames.oralsnrctl startsrvctl config listener-lLISTENERLISTENER_SCAN$ORACLE_HOME/network/admin/listener.oraENDPOINT_LISTIPCTCPSlsnrctl statuscrsctl stat res -t | grep listenersrvctl start