您的位置:首页 > 博客中心 > 数据库 >

Windows平台的Oracle使用USE_SHARED_SOCKET的作用

时间:2022-03-10 17:52

前两天有位朋友在QQ群问了一个问题,背景如下:

gxlsystem.com,布布扣

继续问后,有如下回复:

1、对方服务器连接无问题。

2、从client可以telnet服务器的1521端口。

3、tnsping正常。

4、对方服务器没有设置IP信任。

5、windows 2003 server,Oracle 10.1.0.2.0

但从客户端sqlplus就是超时,无法连接。


首先,看下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.

2. 升级数据库到8.0.x以上,设置注册表中USE_SHARED_SOCKET变量值为TRUE。

监听器会在“listener.ora”文件中指定的地址上绑定和创建一个socket。在这个socket中,监听器的监听状态是ACTIVE。当监听器接收连接请求时,监听器会在监听端口派生一个Oracle线程。这种情况会反复产生,以至于最后形成了一个监听器和一些已建立的连接都在使用1521端口的闭环。

gxlsystem.com,布布扣

从10.2以上的,USE_SHARED_SOCKET就已经是默认值为TRUE了,无需再修改。


MOS的124140.1文章详细介绍了这部分内容,翻译原文如下:

目的: 运行于Windows NT,Windows 2000,或后续版本的操作系统,连接Oracle数据库的Oracle Net或Net 8连接,可能会让客户端重定向连接一个短端口范围中的一个端口号(除非碰到下面”特殊备注“节中的问题)。微软WINSOCK V1.1 API不允许进程将一个TCP的socket传给另一个进程。也就是不允许像UNIX系统中的端口共享。为了让Oracle连接可以运行于防火墙环境中,客户不得不使用包含内建SQL*Net代理的防火墙,或者使用Windows NT 4.0(可从Service Pack#3中获得)、Windows 2000以上的版本的WINSOCK V2 API,或者Windows 2000以上的版本。这种特性也能通过在Windows注册表中使用"USE_SHARED_SOCKET"参数在Oracle数据库中实现。
范围: 这篇文章主要是提供给需要通过防火墙使用SQL*Net,Net8或Oracle Net连接访问运行在Windows操作系统的Oracle数据库的DBA和网络管理员。
详细描述: 正如66382.1描述的,有两种方法可以让Oracle数据库运行于使用防火墙的环境中。 1. 使用包含内建SQL*Net代理的防火墙。 SQL*Net代理可以开启另一个让客户端连接的监听进程(通常在1610端口)。然后这个监听进程会代理到数据库的连接,并处理防火墙内部的端口重定向,不会触发禁止访问的规则。此时防火墙就像正在运行Oracle连接管理器(Connectiong Manager或多协议交换器,Multi Protocol Interchange)。有一点不同的就是,在防火墙和数据库之间安装了连接管理器Connection Manager,并且安装防火墙时允许他可以连接到连接管理器。那么防火墙就不需要Oracle Net或SQL*Net了。 2. 第二种方法是升级到8.0.x或以上版本,并在注册表中设置参数USE_SHARED_SOCKET,目的就是为了激活端口共享(在Oracle 10.2及以上中该值默认是TRUE)。这个参数在Windows NT 4.0(SP3或更高),Windows 2000,或Winsock V2支持的更高版本中可以设置。通过该参数,也能够使用仅支持端口过滤以及没有SQL*Net代理(至少是专用连接)的防火墙。多线程服务器(MTS)仍旧需要将连接重定向到一个动态端口,因此也需要SQL*Net代理。 当Oracle运行于Windows操作系统时,可以通过在系统环境或Windows注册表中设置这个参数变量来激活端口共享。推荐最好在Windows注册表中设置:USE_SHARED_SOCKET = TRUE。 在Windows NT设置系统环境变量的方式:控制面板-系统-环境。Windows 2000以上,也可以使用控制面板的系统按钮,但环境变量需要点击”高级”按钮来找到并设置。 亦可以使用Windows注册表设置: In Oracle release 8.0 \\HKEY_LOCAL_MACHINE\SOFTWARE\ORACLE In Oracle release 8.1 \\HKEY_LOCAL_MACHINE\SOFTWARE\ORACLE\HOME<#>
In Oracle release 9 or later \\HKEY_LOCAL_MACHINE\SOFTWARE\ORACLE\Key_<Home> 增加一个STRING_VALUE值(注册表窗口右侧),不是KEY值(注册表窗口左侧)。 所有这些方法都需要Oracle进程的重启,以使进程重启时可以读取到注册表。
Troubleshoot备注: 可以使用‘netstat -a’命令查看配置。他应该展示所有的客户端连接,以及监听的端口。
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
可以在客户端SQLNET.ORA文件中设置如下参数,来激活Oracle Net客户端跟踪: TRACE_LEVEL_CLIENT= 16
TRACE_DIRECTORY_CLIENT = <directory>
TRACE_FILE_DIRECTORY= <filename>[Insert code here] 通过在跟踪文件中搜索‘port‘字符串,可以定位到具体的唯一端口。
特殊备注: 1. 如果使用TCPS协议或SSL,将会发生端口重定向。解决方案是使用支持Sqlnet或Net8连接的防火墙或配置共享服务器分发端口。 2. 10g及以上,默认USE_SHARED_SOCKET=TRUE。

Windows平台的Oracle使用USE_SHARED_SOCKET的作用,布布扣,bubuko.com

热门排行

今日推荐

热门手游