禁用反向解析能立刻变快,是因为Oracle监听器默认对客户端IP执行30秒超时的反向DNS查询,若DNS不可达或配置异常(如/etc/resolv.conf为空),该等待会阻塞连接建立;添加tcp.reverse_dns_checking=no并reload监听器即可跳过此步骤。
ORA-12170 或连接卡在 “Connecting…” 60 秒才失败,90% 不是网络不通,而是 Oracle 19c 在连接建立阶段被 DNS 反向解析或 sqlnet.ora 参数卡住。直接改配置就能见效,不用重启数据库。
为什么禁用反向解析能立刻变快
oracle 监听器(tnslsnr)默认对每个新连接的客户端 ip 执行反向 dns 查询(即 gethostbyaddr()),哪怕你只连本地 vip 或 scan。若客户端 ip 无法被正向/反向解析(比如测试机没配 dns、/etc/resolv.conf 为空、或 dns 服务器不可达),监听器会等满默认 30 秒超时才继续——这还不算重试次数。rac 环境下更明显,因为 scan 和节点 vip 都可能触发多次查询。
真正起效的操作不是“优化 DNS”,而是让监听器跳过这一步:
- 在数据库服务器端
$ORACLE_HOME/network/admin/sqlnet.ora中添加:tcp.reverse_dns_checking = no - 确保该文件不为空且权限为
644,属主是运行监听器的用户 - 执行
lsnrctl reload(单实例)或逐节点srvctl stop listener && srvctl start listener(RAC) - 验证:连一次,查
$ORACLE_HOME/network/log/listener.log,不再出现reverse lookup failed或长时间等待日志行
sqlnet.ora 里必须设的三个关键参数
光关反向解析不够,sqlnet.ora 中以下三项不显式设置,19c 就按保守默认值硬扛,尤其在高延迟或双栈(IPv4+IPv6)环境下极易卡顿:
-
SQLNET.INBOUND_CONNECT_TIMEOUT = 180:服务端接受连接并完成认证的总时限。默认 60 秒,在 DNS 卡顿、ACL 检查或 SSL 协商慢时根本不够。设为 180 是安全底线,别设 0(禁用) -
SQLNET.ALLOWED_LOGON_VERSION_SERVER = 12和SQLNET.ALLOWED_LOGON_VERSION_CLIENT = 12:不配这对,Navicat、旧 JDBC 驱动会卡在认证阶段,报ORA-28040,现象也是“连不上”,但日志里看不到连接建立记录 - 删掉或注释掉
tcp.invited_nodes和tcp.excluded_nodes:只要这两行中任一存在,tcp.validnode_checking = yes就自动生效,即使你写了= no也会被覆盖;只注释invited_nodes不够,必须同时处理两者
/etc/hosts 比 DNS 配置还关键
DBCA 创建实例、RAC 启动、甚至普通客户端连接,都会调用 getaddrinfo() 查本机 hostname、SCAN 名、VIP 名。如果这些名字没在 /etc/hosts 里映射到明确的 IPv4 地址,系统 fallback 到 DNS 查询——而这时 DNS 已被你禁用或不可用,就只能等超时。
正确写法(以主机名 rac1、SCAN rac-scan 为例):
192.168.31.115 rac1 192.168.31.116 rac2 192.168.31.117 rac-scan
必须满足:
- 每行只写一个 IPv4 地址 + 主机名,不要空格以外的字符
- 不要把
127.0.0.1 rac1当成合法映射——Oracle 集群拒绝 loopback 地址用于节点通信 - 不要混写 IPv6 行(如
fd15::115 rac1),getaddrinfo()会先试 IPv6,失败后才切 IPv4,白白耗时 -
/etc/resolv.conf不能为空:哪怕填个假地址nameserver 10.0.0.1,也比空着强——空文件会让 glibc 默认连127.0.0.1:53等 30 秒
容易被忽略的客户端加载路径问题
很多人在服务器端改了 sqlnet.ora,但客户端(比如 Navicat、JDBC 应用、PL/SQL Developer)根本没读到。Oracle 客户端查找 sqlnet.ora 有严格顺序:
- 当前工作目录下的
sqlnet.ora -
$ORACLE_HOME/network/admin/(Windows 是%ORACLE_HOME%\network\admin\) -
$TNS_ADMIN环境变量指向的路径(最高优先级)
常见踩坑点:
- Java 应用(JDBC)默认不读
sqlnet.ora,除非显式调用OracleDataSource.setConnectionProperties()设置oracle.net.CONNECT_TIMEOUT - Windows 下路径写成
C:\oracle\network\admin\sqlnet.ora,但文件里用了单反斜杠\,Oracle 会静默忽略整行 - Linux 下文件权限是
600或属主不对,Oracle 客户端直接跳过该文件,不报错也不提示
验证是否生效最简单的方法:在你认为正确的 sqlnet.ora 里加一行非法内容,比如 INVALID.PARAM = 1,然后运行 tnsping your_alias —— 如果报 TNS-03505 以外的错误(比如参数解析失败),说明文件确实被加载了。


















