根本原因是新建数据库服务未正确注册到集群监听器:服务未启动、未绑定有效实例、remote_listener未全局配置或指向错误、网络不通导致PMON注册失败、服务ENABLED状态为NO,或注册后因重启/抖动丢失实例条目。
oracle rac 的负载均衡器(如客户端 tnsnames.ora 或服务器端 remote_listener)无法识别新建的数据库服务,根本原因通常是服务未被正确注册到集群监听器中 —— 而不是配置写错了就完事。
新建服务没在 CRS 中注册,lsnrctl status 看不见它
即使你用 srvctl add service 添加了服务,若没启动或没关联到正确实例,CRS 不会将其纳入集群资源管理,监听器也就不会动态注册该服务。
- 检查服务是否已启动:
srvctl status service -d <db_name> -s <service_name></service_name></db_name>;若显示is not running,说明资源未上线 - 确认服务是否绑定到至少一个实例:
srvctl config service -d <db_name> -s <service_name></service_name></db_name>,输出中必须包含Preferred instances且对应实例当前处于OPEN状态 - 手动启动服务:
srvctl start service -d <db_name> -s <service_name></service_name></db_name>,而非仅依赖自动启动策略
remote_listener 指向错误或未全局生效
每个实例必须通过 remote_listener 参数告知 Cluster Ready Services(CRS):「我把服务注册到哪个监听器」。如果这个参数没设、设错、或只对单个实例生效,新服务就只会在部分节点可见。
- 检查是否全局设置:
SELECT name, value FROM v$parameter WHERE name = 'remote_listener';,结果中sid应为*,而非具体实例名 - 确认值与
tnsnames.ora中定义的别名完全一致(大小写敏感),例如:LISTENERS_MYDB,且该别名下地址列表必须包含所有节点的 SCAN VIP 或 VIP 地址 - 修改后需执行:
ALTER SYSTEM SET remote_listener='LISTENERS_MYDB' SCOPE=BOTH SID='*';,缺SID='*'就只改当前实例
监听器没收到服务注册请求,PMON 日志里有 ORA-12523 或超时
实例的 PMON 进程负责向 remote_listener 注册服务。若网络不通、监听器未运行、或防火墙拦截 1521/1522 端口,注册失败,服务就“隐身”。
- 查
PMONtrace 文件(路径见background_dump_dest),搜索TNS-12523、TNS-12514或failed to register - 从数据库节点直连目标监听器验证通路:
tnsping LISTENERS_MYDB,再用sqlplus /@LISTENERS_MYDB测试基础连通性 - 确保 SCAN listener 正在运行:
crsctl stat res -t | grep lsnr,正常应显示ONLINE状态,而非OFFLINE或INTERMEDIATE
客户端 tnsnames.ora 配置了 LOAD_BALANCE=yes,但服务没启用 ENABLED 状态
即使服务注册成功,若其 ENABLED 属性为 NO(比如创建时加了 -e false),监听器就不会把它加入负载分发池,客户端永远轮不到它。
- 查服务当前状态:
srvctl config service -d <db_name> -s <service_name></service_name></db_name>,确认输出含Enabled: YES - 启用服务:
srvctl enable service -d <db_name> -s <service_name></service_name></db_name> - 注意:禁用/启用操作不重启实例,但需等几秒让 PMON 重新广播注册信息;可用
lsnrctl services <listener_name></listener_name>确认服务是否出现在输出的Service "xxx" has 1 instance(s)区域
最易被忽略的一点是:服务注册不是“一劳永逸”的动作。实例重启、监听器重启、网络抖动都可能导致服务短暂掉线;不要只看一次 srvctl status 就认为万事大吉,得盯住 lsnrctl services 输出里有没有你的服务名,以及它下面有没有 Instance 条目 —— 没有实例,等于没有服务。


















