ora-12514在rac高并发下主因是服务注册链断裂,需检查local_listener是否指向本节点vip ip(禁用localhost/主机名)、remote_listener是否因dns解析超时失效,并验证scan监听器是否接纳注册。

ORA-12514 在 RAC 环境下因连接暴增而集中出现,基本不是监听器扛不住并发,而是服务注册链在高负载下断裂——local_listener 配置错误、remote_listener 解析超时、SCAN 监听器未及时接纳新注册,三者叠加导致部分节点的服务名“消失”于 lsnrctl status LISTENER_SCAN1 的 Services Summary 中。
查 local_listener 是否在高并发下失效
连接暴增时,若 local_listener 指向的是 localhost 或解析缓慢的主机名,实例可能在注册阶段卡住或退避,造成该节点服务不进 SCAN。这不是配置“错”,而是“不可靠”。
- 运行
show parameter local_listener:输出必须是本节点 VIP 的 IP 地址(如(HOST=192.168.10.11)),禁用主机名(rac1-vip)和localhost - 检查
tnsping该 VIP 地址是否秒回:若延迟 >100ms 或丢包,说明 VIP 网络已拥塞,需排查网卡队列、ARP 缓存或交换机 buffer - RAC 每个实例独立设置:执行
ALTER SYSTEM SET local_listener='(DESCRIPTION=(ADDRESS=(PROTOCOL=TCP)(HOST=192.168.10.11)(PORT=1521)))' SID='racdb1',不能只设一个 SID
验证 remote_listener 是否触发 DNS 解析阻塞
remote_listener 若设为 SCAN 域名(如 scan-cluster.example.com:1521),连接暴增时 DNS 查询可能排队超时,导致实例无法广播服务到 SCAN 监听器——此时 lsnrctl status LISTENER_SCAN1 里看不到新服务,但 lsnrctl status(本地监听)里仍有。
- 运行
show parameter remote_listener:确认值是完整 SCAN 域名 + 端口,且与srvctl config scan输出一致 - 立刻测试 DNS 解析:在数据库服务器上执行
nslookup scan-cluster.example.com,响应时间应 192.168.20.100:1521)并同步更新所有节点 - 避免混用:不要让部分节点用域名、部分用 IP;RAC 要求
remote_listener全局一致
确认 SCAN 监听器是否丢弃动态注册请求
Oracle 11g+ SCAN 监听器有内部注册队列,默认长度有限。当每秒连接请求数超过阈值(常见于应用未复用连接池),注册请求可能被 silently dropped,现象是 ALTER SYSTEM REGISTER 执行成功但 lsnrctl status LISTENER_SCAN1 无变化。
- 检查 SCAN 监听日志:
$GRID_HOME/log/<host>/client/listener_scan1.log</host>,搜索REGISTRATION和REJECTED - 临时扩容注册队列:在 SCAN 监听器所在节点的
listener.ora中添加REGISTRATION_TIMEOUT_LISTENER_SCAN1=30和MAX_REGISTRATION_QUEUE=200(默认 50) - 强制重注册后观察:执行
ALTER SYSTEM REGISTER后,等待 10 秒再跑lsnrctl status LISTENER_SCAN1 | grep -A5 "Services Summary",看服务名是否带(DYNAMIC)
绕过注册依赖:静态注册兜底(生产环境必做)
动态注册在连接暴增场景下本质是脆弱链路。RAC 生产环境必须为每个节点的 SCAN 监听器补静态注册,确保即使 PMON 卡住或网络抖动,服务仍可被发现。
- 编辑 SCAN 监听器的
listener.ora(路径见lsnrctl status LISTENER_SCAN1输出中的Listener Parameter File) - 在
SID_LIST_LISTENER_SCAN1块中显式加入本节点服务:(SID_DESC = (SID_NAME = racdb1) (ORACLE_HOME = /u01/app/oracle/product/19c/dbhome_1) (GLOBAL_DBNAME = racdb.example.com)) - 重启 SCAN 监听器:
srvctl stop scan_listener; srvctl start scan_listener,注意不是lsnrctl reload—— 静态注册需完全重启才生效
真正容易被忽略的点是:RAC 中 SCAN 监听器和本地监听器是两个独立进程,各自维护服务列表;连接暴增时,问题往往不出在“数据库没注册”,而出在“注册请求发到了 A 监听器,客户端却连向 B 监听器”。务必用 lsnrctl status LISTENER_SCAN1 直接查 SCAN,别只看本地 lsnrctl status。











