srvctl add service仅注册服务元数据,不启动服务,需手动执行srvctl start service;常见问题包括crsctl stat res -t看不到资源、ORA-12514报错、lsnrctl services无对应service_name。
srvctl add service 命令加了但服务没起来,查什么?
服务加完不自动启动是常态,srvctl add service 只注册元数据,不启动实例级服务。必须手动 srvctl start service 才行。
常见错误现象:crsctl stat res -t 里看不到服务资源;应用连不上,报 ORA-12514: TNS:listener does not know service requested;lsnrctl services 输出里没有对应 service_name。
- 先确认服务是否已启动:
srvctl status service -d <db_name> -s <service_name> - 检查服务绑定的实例是否在线:
srvctl status instance -d <db_name> - 查看 CRS 资源状态:
crsctl stat res ora.<db_name>.<service_name>.svc -p,重点看START_DEPENDENCIES和PLACEMENT - 如果用的是 policy-managed 数据库,服务默认只在部分实例上运行,需显式指定
-i或用-r指定首选实例
业务隔离靠 service_name 还是 instance_name?
Oracle RAC 里业务隔离的核心载体是 service_name,不是 instance_name。每个 service 可绑定到特定实例(或动态负载),监听器按 service_name 路由连接,应用通过 SERVICE_NAME=xxx 连接,才能真正落到目标实例组。
容易踩的坑:开发直接写 INSTANCE_NAME=rac1 在连接串里 —— 这绕过 service 机制,失去故障转移、负载均衡和策略控制能力,也违背 RAC 设计初衷。
- 业务系统必须使用
SERVICE_NAME(而非 SID 或 INSTANCE_NAME)配置连接串 - 一个 service 可以跨多个实例,但同一时刻只在
-r(首选)和-a(可用)指定的实例上运行 - 不同业务线用不同 service_name,再配合
DBMS_SERVICE.MODIFY_SERVICE动态调整运行实例,才是隔离关键
srvctl add service 的 -r 和 -a 参数到底怎么配?
-r 是 preferred instances,-a 是 available instances,两者共同决定服务在哪跑、故障时往哪切。配错会导致服务起不来、切不走、或永远卡在单点。
典型场景:两节点 RAC,A 应用要求高可用,B 应用允许短时中断。A 服务设 -r rac1,rac2,B 服务设 -r rac1 -a rac2,这样 B 默认只在 rac1 跑,rac1 挂了才切到 rac2。
- policy-managed 数据库不能用
-r列具体实例名,必须用 server pool 名,否则报错PRKO-2002 : Invalid instance name - admin-managed 数据库才支持
-r rac1,rac2这种写法 -
-a不是“备用”,而是“可接受的故障转移目标”;没配-a时,服务故障后不会自动迁移 - 修改已有 service 的实例列表,要用
srvctl modify service,不是重新 add
service 启动后连接仍被分发到错误实例?
监听器知道 service,但连接还是打到非预期实例,大概率是客户端没启用 TAF 或服务没开 FAILOVER_TYPE,或者负载均衡策略(LOAD_BALANCE=ON)干扰了隔离意图。
根本原因:service 的 CLB_GOAL 和 GOAL 属性没对齐业务需求。比如想让某 service 固定跑在 rac1,却设了 CLB_GOAL = LONG + GOAL = SERVICE_TIME,结果连接被 LB 推向负载更低的 rac2。
- 强隔离场景建议设
CLB_GOAL = SHORT+GOAL = NONE,关闭连接级负载均衡 - 用
DBMS_SERVICE.CREATE_SERVICE或MODIFY_SERVICE设置这些属性,srvctl命令本身不暴露这些参数 - 检查当前值:
SELECT NAME, CLB_GOAL, GOAL FROM DBA_SERVICES WHERE NAME = '<service_name>'; - 改完要重启 service:
srvctl stop service; srvctl start service,否则不生效
service 的实例绑定、路由策略、客户端连接串三者必须咬合,漏掉任何一环,业务隔离就形同虚设。










