基本是DNS解析超时;Oracle客户端在tnsnames.ora使用域名时,若本地DNS响应慢或失败,会在TCP建连前卡5–30秒并报ORA-12170,此时网络、监听器、防火墙均正常,需通过nslookup/dig测DNS、tnsping验证、hosts补全及sqlnet.ora配置NAMES.DIRECTORY_PATH=(HOSTNAME,TNSNAMES,EZCONNECT)来解决。
tnsnames.ora里写主机名,但连接卡5–30秒才报ORA-12170?基本是DNS卡住
oracle客户端发起连接时,若tnsnames.ora中host字段用的是域名(如rac-node1.example.com),而本地dns解析慢或失败,就会在tcp建连前卡住——此时数据库监听器、网络连通性、防火墙全都没问题,但用户感知就是“连不上”或“等很久”。尤其在rac环境中,多个节点域名反复解析,延迟会被放大。
实操建议:
- 先用
nslookup rac-node1.example.com或dig rac-node1.example.com测响应时间;超过1秒就危险,2秒以上基本可判定为瓶颈 - 立即用
tnsping racdb验证:如果输出里“Attempting to contact...”后卡顿明显,且OK (xxxx ms)数值远高于预期(比如>5000ms),说明解析环节拖累 - 临时把
tnsnames.ora里所有HOST=xxx替换成对应IP(如HOST=192.168.10.11),再试sqlplus /@racdb;若秒连,100%锁定DNS问题
/etc/hosts必须覆盖全部RAC节点域名+SCAN+VIP,大小写要严格一致
RAC环境至少涉及三类地址:节点公网名(rac-node1)、SCAN名(rac-scan.example.com)、VIP名(rac-node1-vip.example.com)。少写一个,客户端在NAMES.DIRECTORY_PATH回退到DNS时就会卡住。
实操建议:
- Linux/macOS编辑
/etc/hosts,Windows改C:\Windows\System32\drivers\etc\hosts - 每行格式为:
IP地址<tab>全限定域名<space>短名</space></tab>(短名可选,但SCAN和VIP必须带FQDN) - 确保所有域名拼写与
tnsnames.ora和listener.ora中完全一致——Rac-Node1.example.com≠rac-node1.example.com,某些resolver会区分大小写导致缓存未命中 - 示例条目:
192.168.10.11 rac-node1.example.com rac-node1、192.168.10.100 rac-scan.example.com
sqlnet.ora里NAMES.DIRECTORY_PATH必须含HOSTNAME,且排第一位
Oracle默认NAMES.DIRECTORY_PATH = (TNSNAMES, EZCONNECT),它不查/etc/hosts,只走DNS。即使你写了hosts,客户端也根本不会看。
GitHub Hosts 更新工具(仅限中国用户),安全更新系统hosts文件,保留原有非GitHub条目,仅替换GitHub相关地址。支持备份恢复和风险提示。用于解决GitHub访问问题。
实操建议:
- 在
$ORACLE_HOME/network/admin/sqlnet.ora中显式添加:NAMES.DIRECTORY_PATH = (HOSTNAME, TNSNAMES, EZCONNECT) - 删掉
SQLNET.EXPIRE_TIME(除非真需要保活),它会在空闲连接上发probe,首次连接时反而触发额外DNS查询 - Windows客户端确认
SQLNET.AUTHENTICATION_SERVICES没设(NTS)——非域环境启用NTS会额外调用安全子系统,拖慢数秒 - Java应用不读
sqlnet.ora,所以JDBC URL里必须直接写IP,或靠JVM参数-Dsun.net.inetaddr.ttl=30控制DNS缓存
别信tnsnames.ora里的CONNECT_TIMEOUT,它对DNS卡顿完全无效
CONNECT_TIMEOUT和RECV_TIMEOUT是TCP层超时,只在DNS解析完成、开始建连后才起作用。DNS卡住时,这个参数压根没机会生效。
实操建议:
- Oracle 12c及以上版本可在
tnsnames.ora的ADDRESS段内加(CONNECT_TIMEOUT=5),但仅防TCP握手慢,不解决解析慢 - 11g及更早版本别写这些参数——语法不识别,可能让整个连接串解析失败
- 真要控DNS超时,得改系统级配置:
/etc/resolv.conf里加timeout:1和attempts:2,比依赖Oracle参数更底层、更可靠
nslookup和tnsping起步,而不是一上来就翻listener.log或查AWR。










