tnsping超时由SQLNET.OUTBOUND_CONNECT_TIMEOUT控制,单位秒,需配置在客户端sqlnet.ora中;默认未设置,故tnsping约60秒后报ORA-12170。
tnsping超时时间由sqlnet.ora的SQLNET.OUTBOUND_CONNECT_TIMEOUT控制
oracle客户端默认不设连接超时,tnsping 会卡住约60秒才报 ora-12170: tns:connect timeout。这不是网络层超时,而是客户端等待监听器响应的上限。真正起作用的是 sqlnet.ora 中的 sqlnet.outbound_connect_timeout 参数——它只影响 outbound 连接(即客户端发起的连接),对监听器内部转发无效。
- 该参数单位是秒,设为
SQLNET.OUTBOUND_CONNECT_TIMEOUT = 10后,tnsping和sqlplus都会在10秒内失败并返回错误 - 必须放在客户端的
sqlnet.ora文件中(路径通常为$ORACLE_HOME/network/admin/sqlnet.ora),服务端配置无效 - 若文件里已有
SQLNET.INBOUND_CONNECT_TIMEOUT,别混淆:那是限制客户端连进来的时间,和DG连接无关 - 值设太小(如1)可能导致误判——尤其在高延迟跨机房DG环境中,一次重试都来不及完成
DG环境必须双向配置tnsnames.ora且SERVICE_NAME严格匹配GLOBAL_DBNAME
DGMGRL 在 switchover 或 reinstate 时,会用本地 tnsnames.ora 解析目标库地址。如果只配单向、大小写不一致或拼写差一位,就会卡在解析阶段,根本触达不到超时机制。
- 主库
tnsnames.ora中必须有备库条目,SERVICE_NAME值等于备库listener.ora里静态注册的GLOBAL_DBNAME(例如STANDBY_DG) - 备库同理,必须有主库条目,
SERVICE_NAME = PRIMARY_DG,且大小写完全一致 -
HOST必须填对方 VIP(RAC 环境下不能用 SCAN 地址,SCAN 不保证始终解析到活动节点) - 别依赖动态注册:DG 切换瞬间 PMON 可能还没来得及向监听器注册服务,
ORA-12514就已发生
监听器静态注册缺失会导致DGMGRL连接失败,与超时无关但现象相似
很多人看到 ORA-12170 就调超时参数,结果白忙一场。真正拦住 DGMGRL 的,往往是监听器压根没加载对应服务——lsnrctl status 显示服务名在列表里,不代表它能被 DGMGRL 用。
- 每个节点的
listener.ora必须含SID_LIST_LISTENER段,且每条SID_DESC显式写出SID_NAME、ORACLE_HOME、GLOBAL_DBNAME -
GLOBAL_DBNAME必须和tnsnames.ora里SERVICE_NAME字符完全一致(包括下划线、数字、大小写) - 改完后执行
lsnrctl reload,不是stop/start——否则正在运行的 DG 同步会中断 - 验证不能只靠
lsnrctl services,要实际跑:dgmgrl sys/password@PRIMARY_DG和sqlplus / as sysdba@PRIMARY_DG
tnsnames.ora里别混用EZCONNECT语法和传统配置
在DG切换脚本或自动化工具中,有人把 tnsnames.ora 条目写成类似 PRIMARY_DG = (DESCRIPTION=(ADDRESS=(PROTOCOL=TCP)(HOST=192.168.1.10)(PORT=1521))(CONNECT_DATA=(SERVICE_NAME=PRIMARY_DG))),又在代码里用 EZCONNECT 格式 192.168.1.10:1521/PRIMARY_DG ——这看似等价,实则绕过了 tnsnames.ora 的所有校验,也丢失了 SQLNET.OUTBOUND_CONNECT_TIMEOUT 的控制。
- EZCONNECT 不读
sqlnet.ora的超时设置,也不触发tnsnames.ora的别名解析逻辑 - DGMGRL 默认走 TNSNAMES 解析,硬编码 IP+PORT+SERVICE_NAME 会跳过配置一致性检查
- 混合使用导致故障定位困难:一个地方改了
service_name,另一个地方没同步,报错却是ORA-12154而非超时 - 统一用
tnsnames.ora别名,所有连接都写成sqlplus /@PRIMARY_DG或dgmgrl /@PRIMARY_DG
SQLNET.OUTBOUND_CONNECT_TIMEOUT 前,先确认 tnsping PRIMARY_DG 能秒回,再确认 lsnrctl services 里真有那条服务——否则调再小的超时值,也只是更快地告诉你“连不上”。


















