ICMP ping 正常,但 tnsping 到 oracle 超时

ICMP ping 正常,但 tnsping 到 oracle 超时

我们在 Windows 服务器和几个 Linux 客户端上运行 Oracle。Windows 客户端运行良好。然而,tnsping在 Linux(运行 RHEL 6.9)客户端上运行有一个有趣的问题。例如:

tnsping <IP> 100

这最终会在 Linux 客户端上失败:

TNS-12535: TNS:operation timed out

请记住 - ping 不会显示任何丢失的数据包。我用 tcpdump 做了一些测试,当我将其加载到 wireshark 中时,我唯一能看到的奇怪现象是 TCP 重传。我尝试的每个 Linux 客户端都表现出这种行为。我尝试调整一些操作系统级别的 TCP 超时/保持活动,但仍然没有解决问题。

我确实对 tnsping 进行了 strace,但它唯一显示的是超时,这没有帮助。

所讨论的系统是在 VMWare 上运行的虚拟机。

编辑:

我创建了一个跟踪文件并再次运行 tnsping。它确实成功连接了许多次,但最终超时了:

nttcni: Tcp conn timeout = 60000 (ms)
nttcni: TCP Connect TO enabled. Switching to NB
nttctl: entry
nttctl: Setting connection into non-blocking mode
nttcni: trying to connect to socket 5.
ntt2err: entry
ntt2err: exit
ntctst: size of NTTEST list is 1 - not calling poll
sntpoltst: No of conn to test 1, wait time 60
sntpoltst: fd 5 need 1 readiness events
sntpoltst: exit
nttcni: TImeout or Error on this socket
nttcni: exit
nttcon: exit
nserror: entry
nserror: nsres: id=0, op=65, ns=12535, ns2=12560; nt[0]=505, nt[1]=0, nt[2]=0; ora[0]=0, ora[1]=0, ora[2]=0
nsopen: unable to open transport
nsiocancel: entry
nsiofrrg: entry
nsiofrrg: cur = 24eff18
nsbfr: entry
nsbaddfl: entry
nsbaddfl: normal exit
nsbfr: normal exit
nsiofrrg: exit
nsiocancel: exit
nsvntx_dei: entry
nsvntx_dei: exit

我确实找到了这篇文章,它与我的问题类似但不完全一样。在他们的示例中,tnsping 能够连接并发送数据 - 我的 tnsping 甚至没有建立 TCP 连接。

https://ardentperf.com/2010/09/08/mysterious-oracle-net-errors/

如果我在 tnsnames.ora 文件中的连接中添加以下选项:

(RETRY_COUNT=3)
    (TRANSPORT_CONNECT_TIMEOUT=10)

然后它将无需超时即可工作,但会导致较高的延迟:

OK (10 msec)
OK (0 msec)
OK (0 msec)
OK (10 msec)
OK (0 msec)
OK (0 msec)
OK (10020 msec)
OK (0 msec)
OK (0 msec)
OK (0 msec)
OK (10 msec)
OK (0 msec)

这种“修复”相当于泡泡糖和胶带,但确实有效。

答案1

听起来连接很可能被防火墙阻止了,或者 Oracle 监听器可能刚好关闭了。您可以尝试在客户端 sqlnet.ora 中设置以下参数来生成 tnsping 的跟踪文件,看看是否能为您提供更多信息。

TNSPING.TRACE_LEVEL=SUPPORT
TNSPING.TRACE_DIRECTORY=<your trace directory>

相关内容