如何配置RAC的SCAN IP_单实例客户端通过SCAN实现负载均衡
SCAN是Oracle RAC专用的DNS轮询名称需客户端11.2网络栈、正确tnsnames.ora含LOAD_BALANCEon、sqlnet.ora配置NAME.DIRECTORY_PATH(TNSNAMES,EZCONNECT)且DNS返回A记录而非CNAME。SCAN 是什么为什么单实例客户端连不上scansingle client access name本质是一个 oracle rac 专用的 dns 轮询名称背后绑定 3 个 vip默认但客户端**不直接解析或连接这些 vip**而是靠 oracle 客户端的 sqlnet.ora 和 tnsnames.ora 配合服务端 scan listener 协同工作。单实例客户端连不上 scan90% 是因为没配对两件事sqlnet.allowed_logon_version_server 兼容性、以及客户端没启用 scan 感知能力。Oracle 12c 及以后默认 SQLNET.ALLOWED_LOGON_VERSION_SERVER12a会拒绝 11g 客户端如 Instant Client 11.2用 SCAN 连接 —— 错误现象是 ORA-12537: TNS:connection closed 或静默失败客户端必须使用 Oracle 11.2 的网络栈哪怕只是 Instant Client老版本如 10.2根本不识别 SCAN 名称会报 ORA-12154: TNS:could not resolve the connect identifier specifiedDNS 必须返回至少一个 A 记录不能只配 CNAME且不能配置成 round-robin 的负载均衡器如 F5、Nginx反代 —— SCAN 要求客户端自己做轮询中间设备会破坏连接亲和性tnsnames.ora 里 SCAN 的标准写法不是随便写个主机名就能走 SCAN必须用 ADDRESS_LIST 多个 ADDRESS LOAD_BALANCEon否则 Oracle 客户端不会触发 SCAN 的连接分发逻辑。漏掉 LOAD_BALANCEon 或写成 LOAD_BALANCEyes无效值都会退化为直连第一个地址。正确写法ORCL_SCAN (DESCRIPTION (ADDRESS_LIST (ADDRESS (PROTOCOL TCP)(HOST myscan.example.com)(PORT 1521)) ) (CONNECT_DATA (SERVICE_NAME orcl) ) (LOAD_BALANCE on) )HOST 值必须是 DNS 可解析的 SCAN 名称如 myscan.example.com不能填 IP也不能填集群任意节点的 VIP 或公网 IP不要加 FAILOVERon 到 SCAN 条目里——SCAN 本身已内置故障转移额外加反而干扰行为如果数据库启用了 GDSGlobal Data ServicesSERVICE_NAME 应换成 GLOBAL_NAME否则可能路由到错误副本客户端 sqlnet.ora 关键配置项光有 tnsnames.ora 不够sqlnet.ora 控制底层连接策略。最常被忽略的是 NAME.DIRECTORY_PATH 和 SQLNET.EXPIRE_TIME前者决定客户端用什么方式解析 SCAN 名后者影响空闲连接在防火墙/NAT 后的存活表现。NAME.DIRECTORY_PATH (TNSNAMES, EZCONNECT) 是底线如果删了 TNSNAMES即使 tnsnames.ora 存在SCAN 条目也不会被加载Oracle 12.2 客户端默认开启 SQLNET.EXPIRE_TIME0禁用死连接检测但在有状态防火墙环境下建议显式设为 10单位分钟避免连接中途断开若客户端跑在容器或云主机上DNS 缓存可能过长如 systemd-resolved 默认缓存 30s导致 SCAN VIP 切换后无法及时感知 —— 可临时加 USE_DEDICATED_SERVERoff 强制走共享模式验证是否真连上了 SCAN验证 SCAN 是否真正生效别只看 tnsping 通不通它只测监听器响应不验证连接是否走 SCAN 分发路径。真实判断要看客户端实际建立的 TCP 连接目标 IP以及服务端 lsnrctl services 输出中该连接对应的 listener 名。 蝉妈妈AI 电商人专属的AI营销助手