Preferred/Available 实例配置是 Oracle 19c RAC 中数据库服务的动态节点放置策略,指定服务优先运行(preferred)和故障时备用(available)的实例,仅影响服务启停与自动回切,不改变 CRS 启动顺序。

Oracle 19c RAC 中的 preferred 和 available 实例配置,本质是数据库服务(Database Service)的节点放置策略,不是 RAC 集群层或 ASM 层的设置,也不影响 CRS 资源启动顺序。它只在服务启动、故障转移、节点恢复后自动回切时起作用。
什么是 Preferred / Available 实例配置
这是 Oracle 19c 引入的动态服务放置能力,用于精细化控制服务在哪几个实例上运行:
-
preferred:服务优先启动的实例列表(如fgedudb1),节点正常时服务一定在此运行 -
available:当所有preferred实例不可用时,服务才允许启动的备用实例(如fgedudb2) - 两者不互斥,可重叠;但不能全空,至少一个
preferred实例必须存在 - 该配置仅对通过
srvctl add service或DBMS_SERVICE.CREATE_SERVICE创建的服务生效,不适用于默认服务(如ORCL)
如何用 srvctl 添加带 Preferred/Available 的服务
使用 srvctl add service 时必须显式指定 -preferred 和 -available 参数,顺序无关,但节点名必须真实存在于集群中:
srvctl add service -db fgedudb -service app_rw -preferred "fgedudb1" -available "fgedudb2" -taf_policy BASIC -rlb_goal SERVICE_TIME
-
fgedudb是 DB_UNIQUE_NAME(不是全局数据库名),可通过srvctl config database确认 - 节点名
fgedudb1/fgedudb2必须与srvctl config instance输出完全一致(区分大小写) - 若漏掉
-available,服务在fgedudb1故障后将完全停止,不会漂移到fgedudb2 - 添加后需手动启动:
srvctl start service -db fgedudb -service app_rw
节点恢复后服务是否自动切回 preferred 实例
会,但有前提条件:
- 必须启用
AUTO_START=1(默认),且服务配置了-failover_type SESSION或SELECT - CRS 检测到原
preferred实例重新上线后,会在约 60–120 秒内触发自动迁移(由oraagent进程驱动) - 迁移期间新连接会路由到当前运行节点,已有连接不受影响(除非配置了 TAF)
- 如果服务正在被客户端大量使用(如长事务未提交),迁移可能延迟或失败,日志中会出现
ORA-48172: service migration failed
常见错误与验证要点
配置后不生效,大概率卡在这几个点:
- 误把实例名写成主机名(如
p19c01)或服务名(如app_rw)——必须是srvctl config instance输出的实例名 - 服务已存在但未删除就重复
add,报错PRKO-2002 : Invalid command line option,应先srvctl remove service - 未开启 TAF 或连接字符串未指定
FAILOVER_MODE,导致应用层感知不到切换 - 用
crsctl stat res -t查看服务资源状态时,显示OFFLINE,说明preferred节点当前不可达或实例未启动 - 验证命令:
srvctl config service -db fgedudb -service app_rw,输出中必须明确列出Preferred instances: fgedudb1和Available instances: fgedudb2
这个机制看似简单,但依赖 CRS 对实例健康状态的准确判断,以及服务资源定义与实际数据库实例状态的一致性。生产环境务必在非高峰时段做一次完整故障模拟:停掉 preferred 实例 → 观察服务是否漂移到 available → 启动原实例 → 等待并确认自动回切成功。任何环节卡住,都意味着容灾链路存在断点。


















