时间:2021-07-01 10:21:17 帮助过:3人阅读
继续问后,有例如以下回复:
1、对方server连接无问题。
2、从client能够telnetserver的1521port。
3、tnsping正常。
4、对方server没有设置IP信任。
5、windows 2003 server,Oracle 10.1.0.2.0
但从clientsqlplus就是超时,无法连接。
首先,看下ORA-12170的定义:
oerr ora 12170
12170, 00000, "TNS:Connect timeout occurred" // *Cause: The server shut down because connection establishment or communication with a client failed to complete within the allotted time interval. This may be a result of network or system delays; or this may indicate that a malicious client is trying to cause a Denial of Service attack on the server.
大致意思就是因网络或系统问题超时。
然后建议他能sqlnet.ora加入trace配置,看下sqlplus的跟踪:
TRACE_LEVEL_CLIENT=16
TRACE_FILE_CLIENT=CLIENT
TRACE_TIMESTAMP_CLIENT=ON
trace_directory_client=一个路径
但此时反馈说服务端的支持人员已经开启了Oracle共享连接。如今能够sqlplus。
如今问题就出来了。什么是Oracle共享连接?做了什么配置就能够从client訪问了?为什么会出现这个问题?
总结来说,这个问题是和Oracle执行于Windows平台相关的。
对于执行于Windows平台的。从client发起一个连接请求时,服务端监听会让client重定向另外一个随机port。既然是一个随机port。那么防火墙自然不会同意这个连接。因此会出现从client能够telnet监听port,但sqlplus就是超时。无法连接。
究其原因就是由于client真正和Oracle线程通信时使用的随机port会被防火墙拒绝。这样的情况仅仅会发生在Windows平台,由于UNIX之类的平台是默认支持port共享的,不会出现port被防火墙拒绝的现象。
可行的解决方式有两种。
1. 使用包括内建SQL*Net代理的防火墙。
流程:
1. 连接代理。将连接传给监听。
2. 发送client重定向地址。
3. 通过代理连接重定向地址。
4. Oracle接受连接。
2. 升级数据库到8.0.x以上,设置注冊表中USE_SHARED_SOCKET变量值为TRUE。
监听器会在“listener.ora”文件里指定的地址上绑定和创建一个socket。在这个socket中,监听器的监听状态是ACTIVE。
当监听器接收连接请求时。监听器会在监听port派生一个Oracle线程。这样的情况会重复产生。以至于最后形成了一个监听器和一些已建立的连接都在使用1521port的闭环。
从10.2以上的。USE_SHARED_SOCKET就已经是默认值为TRUE了,无需再改动。
MOS的124140.1文章具体介绍了这部分内容,翻译原文例如以下:
目的: 执行于Windows NT,Windows 2000。或兴许版本号的操作系统,连接Oracle数据库的Oracle Net或Net 8连接。可能会让client重定向连接一个短port范围中的一个port号(除非碰到以下”特殊备注“节中的问题)。微软WINSOCK V1.1 API不同意进程将一个TCP的socket传给还有一个进程。也就是不同意像UNIX系统中的port共享。为了让Oracle连接能够执行于防火墙环境中。客户不得不使用包括内建SQL*Net代理的防火墙。或者使用Windows NT 4.0(可从Service Pack#3中获得)、Windows 2000以上的版本号的WINSOCK V2 API,或者Windows 2000以上的版本号。这样的特性也能通过在Windows注冊表中使用"USE_SHARED_SOCKET"參数在Oracle数据库中实现。有一点不同的就是。在防火墙和数据库之间安装了连接管理器Connection Manager。而且安装防火墙时同意他能够连接到连接管理器。那么防火墙就不须要Oracle Net或SQL*Net了。
2. 另外一种方法是升级到8.0.x或以上版本号,并在注冊表中设置參数USE_SHARED_SOCKET。目的就是为了激活port共享(在Oracle 10.2及以上中该值默认是TRUE)。这个參数在Windows NT 4.0(SP3或更高),Windows 2000,或Winsock V2支持的更高版本号中可以设置。
通过该參数,也可以使用仅支持port过滤以及没有SQL*Net代理(至少是专用连接)的防火墙。多线程server(MTS)仍旧须要将连接重定向到一个动态port,因此也须要SQL*Net代理。
当Oracle执行于Windows操作系统时,能够通过在系统环境或Windows注冊表中设置这个參数变量来激活port共享。推荐最好在Windows注冊表中设置:USE_SHARED_SOCKET = TRUE。 在Windows NT设置系统环境变量的方式:控制面板-系统-环境。Windows 2000以上,也能够使用控制面板的系统button。但环境变量须要点击”高级”button来找到并设置。
亦能够使用Windows注冊表设置: In Oracle release 8.0 \\HKEY_LOCAL_MACHINE\SOFTWARE\ORACLE In Oracle release 8.1 \\HKEY_LOCAL_MACHINE\SOFTWARE\ORACLE\HOME<#>C:\>netstat -an
Active Connections
Proto Local Address Foreign Address State
TCP 0.0.0.0:1521 0.0.0.0:0 LISTENING
TCP 198.51.100.9:1521 198.51.100.6:55769 ESTABLISHED
TCP 198.51.100.9:1521 198.51.100.91:13452 ESTABLISHED
TCP 198.51.100.9:1521 198.51.100.92:13203 ESTABLISHED
TCP 198.51.100.9:1521 198.51.100.92:13202 ESTABLISHED
TCP 198.51.100.9:1521 203.0.113.166:12331 ESTABLISHED
TCP 198.51.100.9:1521 203.0.113.10:12123 ESTABLISHED
TCP 198.51.100.9:1521 203.0.113.10:11252 ESTABLISHED
TCP 198.51.100.9:1521 192.0.2.22:14524 ESTABLISHED
TCP 198.51.100.9:1521 192.0.2.20:13524 ESTABLISHED
TCP 198.51.100.9:1521 192.0.2.102:13452 ESTABLISHED
TCP 198.51.100.9:1521 192.0.2.121:1342 ESTABLISHED
能够在clientSQLNET.ORA文件里设置例如以下參数,来激活Oracle Netclient跟踪:
TRACE_LEVEL_CLIENT= 16版权声明:本文博客原创文章,博客,未经同意,不得转载。
Windows平台Oracle使用USE_SHARED_SOCKET角色
标签: