Oracle 19c RAC中SCAN名称解析失败主因是getaddrinfo()调用异常,需确保getent hosts返回单行真实IP、/etc/nsswitch.conf仅含files dns、/etc/resolv.conf search域精简且SCAN域名排首,否则客户端根本无法发起连接。

SCAN 名称解析失败:先看 getent hosts 输出
Oracle 客户端根本不会尝试连接,除非系统能正确解析 SCAN 域名——它不走 nslookup 或 dig,而是调用 getaddrinfo(),完全依赖 /etc/nsswitch.conf 和 /etc/resolv.conf。
getent hosts rac-scan.example.com 必须返回单行、真实 IP、无空格或制表符;若超时、返回空或多个 IP(如三行),说明链路已断。
常见错误:
• /etc/nsswitch.conf 中 hosts: files mdns4_minimal [NOTFOUND=return] dns ——删掉 mdns4_minimal 和 [NOTFOUND=return],只留 hosts: files dns
• /etc/resolv.conf 的 search 域冗余,例如 search corp.example.com example.com,会导致客户端反复拼接并超时;应精简为 search example.com,且 SCAN 所在域名必须排第一
• 所有节点的 /etc/nsswitch.conf 和 /etc/resolv.conf 必须完全一致,差一个空格都可能引发部分节点解析失败
改完后执行 nscd -i hosts(如果启用了 nscd)
实例未注册进 SCAN 监听器:查 lsnrctl status LISTENER_SCAN1
能解析、能 ping、能 telnet 1522,不代表数据库可连——关键看服务是否真在 SCAN 监听器里注册。执行 lsnrctl status LISTENER_SCAN1,输出中必须出现类似 SERVICE_NAME='ORCL' STATUS=READY 的条目;没有就说明注册失败。
排查重点:
• remote_listener 参数是否指向 SCAN 域名 + 端口(默认 1522),不能写 IP 或节点 VIP,典型值:(DESCRIPTION=(ADDRESS=(PROTOCOL=TCP)(HOST=rac-scan.example.com)(PORT=1522)))
• local_listener 是否为空或错配(如指向 127.0.0.1 或私网 IP);查 show parameter local_listener,为空则立刻补全:alter system set local_listener='(ADDRESS=(PROTOCOL=TCP)(HOST=rac1-vip)(PORT=1521))' sid='orcl1'
• 防火墙是否放行 TCP 1522(不是 1521);临时验证:sudo firewall-cmd --permanent --add-port=1522/tcp && sudo firewall-cmd --reload
• 补完配置后必须执行 alter system register,而非重启监听器——这是唯一即时触发注册的方式
客户端未启用 SCAN 轮询:检查 tnsnames.ora 和 sqlnet.ora
客户端配置错,SCAN 就形同虚设。Oracle 客户端必须同时满足两个条件才真正支持 SCAN:
• tnsnames.ora 中 SCAN 条目必须含 ADDRESS_LIST 且显式启用负载均衡:LOAD_BALANCE = on;只写单个 ADDRESS 或漏掉该参数,客户端会退化为直连单点
• sqlnet.ora 中 NAME.DIRECTORY_PATH 必须包含 TNSNAMES,且不能被 EZCONNECT 排在前面(否则跳过 tnsnames 解析,而 EZCONNECT 不支持 SCAN)
典型错误:
• HOST = 192.168.10.50(填 IP)或 HOST = rac1-vip(填节点 VIP)——无效,必须是 DNS 可解析的 SCAN 域名
• SQLNET.ALLOWED_LOGON_VERSION_SERVER = 12a 与老客户端(如 Instant Client 11.2)不兼容,报 ORA-12537 或静默超时,需下调版本或升级客户端
SCAN VIP 绑定异常或防火墙拦截 ICMP/1522
SCAN IP 无法 ping 通,90% 不是 DNS 问题,而是网络层绑定失败或策略拦截。
确认要点:
• 在节点上执行 ip addr show,SCAN VIP(如 192.168.10.50/24)必须出现在 Public 网卡(如 eth0)下,且子网掩码一致;若出现在 lo 或私网网卡,说明 CRS 绑定异常
• 检查 /etc/hosts 是否误写 127.0.0.1 rac-scan.example.com ——这会导致本节点 ping 通、跨节点不通,是最隐蔽的坑
• 防火墙必须同时放行 ICMP(用于 ping 测试)和 TCP 1522(SCAN 监听端口);仅开 1521 无效
• 交换机 VLAN 配置必须确保 SCAN 所在网段与节点 Public 网卡处于同一 VLAN,且三层接口(SVI)已启用
注意:ping 通只代表网络层可达,telnet rac-scan.example.com 1522 通只代表监听进程响应,但不代表实例服务已注册——最终仍要回看 lsnrctl status LISTENER_SCAN1 输出


















