srvctl仅管理ocr注册的rac资源;未用srvctl add注册的数据库、实例或服务,srvctl无法识别和操作,常见错误如prcd-1001即因未注册所致,须先用srvctl config database确认注册状态,再执行add命令并严格匹配节点名与实例名。
srvctl 不是通用数据库管理命令,它只作用于已注册到 oracle clusterware(ocr)的 rac 资源;没用 srvctl add 注册过的实例、服务或监听器,srvctl 根本看不到、也管不了。
srvctl status 查不到实例?先确认资源是否已注册
常见错误现象:执行 srvctl status database -d orcl 返回 “PRCD-1001: Database orcl does not exist”,或查不到某个实例。这不是命令写错了,而是该数据库/实例根本没被添加进 OCR。
-
srvctl config database列出所有已注册数据库;如果目标库不在其中,说明尚未注册 - 注册数据库需指定唯一名(
-d)、Oracle Home(-o)、SPFILE 位置(-p),例如:srvctl add database -d orcl -o /u01/app/oracle/product/19c/dbhome_1 -p +DATA/ORCL/PARAMETERFILE/spfile.272.123456789 - 注册实例必须与
INSTANCE_NAME和节点主机名严格匹配:srvctl add instance -d orcl -i orcl1 -n node1;若节点名在/etc/hosts或 DNS 中解析失败,注册会静默失败 - 注册后必须用
crsctl check cluster确认 CRS 正常,否则srvctl操作可能卡住或报CRS-0215
启动数据库却只启了一个实例?注意 -d 和 -i 的作用范围
srvctl start database -d orcl 启动的是“整个数据库”——即 OCR 中为该 -d 注册的所有实例。但实际启几个,取决于实例是否被启用(enabled)且所在节点在线。
- 用
srvctl config database -d orcl查看每个实例绑定的节点;如果某节点宕机或 CRS offline,对应实例不会被拉起 - 要强制只启某一个实例,必须用
srvctl start instance -d orcl -i orcl1;但前提是该实例状态为 enabled(srvctl status instance显示 “is enabled”) - 禁用某个实例(比如维护时):
srvctl disable instance -d orcl -i orcl2;之后即使执行srvctl start database,orcl2也不会启动 -
srvctl start database -d orcl -o open中的-o是启动选项(如open、mount),不是 Oracle 启动模式参数;它不等价于 SQL*Plus 里的startup mount
srvctl add service 配置 TAF 失败?关键参数不能漏
添加带透明应用故障转移(TAF)的服务时,-P(TAF policy)和 -e(failover type)必须成对出现,否则服务创建成功但 TAF 不生效。
- 正确示例:
srvctl add service -d orcl -s reports -r "orcl1,orcl2" -P BASIC -e SELECT -m BASIC -z 180 -w 5 -
-r是 preferred 实例列表,-a才是 available 实例(备用);若只写-r,故障时不会 failover 到其他节点 -
-e SELECT表示查询中的连接可自动重连;若设为NONE,TAF 实际被禁用 - 添加后必须手动启动服务:
srvctl start service -d orcl -s reports;否则srvctl status service显示 “is not running” - TAF 生效还依赖客户端连接字符串中指定
FAILOVER=ON和正确的 service_name,srvctl本身不校验客户端配置
srvctl stop database 卡住?检查依赖资源状态
执行 srvctl stop database -d orcl 长时间无响应,大概率是某个依赖资源(如 ASM、监听器、nodeapps)异常或未就绪。
- 先查依赖链:
crsctl stat res -t | grep orcl,看数据库资源状态及依赖项(如ora.orcl.db依赖ora.DATA.dg和ora.LISTENER.lsnr) - 若 ASM 磁盘组离线(
srvctl status asm -n node1显示 not running),数据库无法正常关闭,得先恢复 ASM - 监听器异常也会阻塞关闭流程;可临时用
srvctl stop listener -l LISTENER强制停掉再试 - 慎用
-f(force):它绕过依赖检查直接发 kill,可能导致实例异常终止、SMON 重启时做大量 recovery
真正容易被忽略的是:srvctl 的所有操作都走 CRS API,任何一步失败都会留下不一致状态(比如资源显示 online 但实际进程不存在)。遇到问题别只盯着命令语法,先用 crsctl stat res -v 看底层资源真实状态,再决定是 srvctl stop -f 强制清理,还是手动补救依赖项。











