Windows平台的Oracle使用USE_SHARED_SOCKET的作用

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

继续问后,有如下回复:

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.

// *Action: If the error occurred because of a slow network or system, reconfigure one or all of the parameters SQLNET.INBOUND_CONNECT_TIMEOUT, SQLNET.SEND_TIMEOUT,
SQLNET.RECV_TIMEOUT in sqlnet.ora to larger values.

If a malicious client is suspected, use the address in sqlnet.log to identify the source and restrict access. Note that logged addresses may not
be reliable as they can be forged (e.g. in TCP/IP).

大致意思就是因网络或系统问题超时。

然后建议他能sqlnet.ora添加trace配置,看下sqlplus的跟踪:

TRACE_LEVEL_CLIENT=16

TRACE_FILE_CLIENT=CLIENT

TRACE_TIMESTAMP_CLIENT=ON

trace_directory_client=一个路径

但此时反馈说服务端的支持人员已经开启了Oracle共享连接,现在可以sqlplus。

现在问题就出来了,什么是Oracle共享连接?做了什么配置就可以从客户端访问了?为什么会出现这个问题?

总结来说,这个问题是和Oracle运行于Windows平台相关的。对于运行于Windows平台的,从客户端发起一个连接请求时,服务端监听会让客户端重定向另外一个随机端口。既然是一个随机端口,那么防火墙自然不会允许这个连接。因此会出现从客户端可以telnet监听端口,但sqlplus就是超时,无法连接。究其原因就是由于客户端真正和Oracle线程通信时使用的随机端口会被防火墙拒绝。这种情况只会发生在Windows平台,因为UNIX之类的平台是默认支持端口共享的,不会出现端口被防火墙拒绝的现象。

可行的解决方案有两种,

1. 使用包含内建SQL*Net代理的防火墙。

流程:

1. 连接代理,将连接传给监听。
2. 发送客户端重定向地址。
3. 通过代理连接重定向地址。
4. Oracle接受连接。

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

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

从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

时间: 2024-12-16 15:00:06

Windows平台的Oracle使用USE_SHARED_SOCKET的作用的相关文章

Windows平台,Oracle Database和Client并存方式

由于某些特定需求,生产环境需要在同一台机器上同时安装Database Server和Client,因为plsql没有64位客户端,无法读取64位database的oci.dll文件,所以需要一个32位的客户端,如果使用正常方式安装,则会出现环境变量混乱等各种不可控问题,我采用如下方式使Database Server和Client可以无影响的并存在一台服务器上.1    正常安装database2    随便找一台机器安装32位client3    将安装好的client目录整个拷贝到databa

Windows平台Oracle使用USE_SHARED_SOCKET角色

前两天在一个朋友QQ集团提出了一个问题.背景例如,下面的: 继续问后,有例如以下回复: 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:Con

【翻译自mos文章】在windows平台上怎么启用Oracle database 企业版的partition?

来源于: How to enable Partitioning in Oracle Database Enterprise Edition 11.2 on Windows (文档 ID 1188238.1) 适用于: Oracle Database - Enterprise Edition - Version 11.2.0.1 and later Information in this document applies to any platform. 目标: 在Windows平台上怎么启用Or

Windows平台下利用APM来做负载均衡方案 - 负载均衡(下)

概述 我们在上一篇Windows平台分布式架构实践 - 负载均衡中讨论了Windows平台下通过NLB(Network Load Balancer) 来实现网站的负载均衡,并且通过压力测试演示了它的效果,可以说还是非常的理想的.同时我们也收集到了不少的问题,比如说如何在这种分布式的架构下使用Session,NLB中有一台服务器挂掉了会导致对外暴露的地址无法访问,如果实现服务器之间的同步,如果更好的进行热修复等等,还有我们在上一篇中也提到了NLB所提供的功能是非常简单的,为了回答我们前面提到的问题

亲试,Windows平台上使用Qt5.2.1编写Android

首先把工具都下载好: 1. Qt for Android: http://qt-project.org/downloads 2. Android NDK http://developer.android.com/tools/sdk/ndk/index.html 64位可以下载第二个 3. Apache Ant 1.9.3 http://ant.apache.org/bindownload.cgi 4. JDK http://www.oracle.com/technetwork/java/java

Windows平台分布式架构实践 - 负载均衡(下)

概述 我们在上一篇Windows平台分布式架构实践 - 负载均衡中讨论了Windows平台下通过NLB(Network Load Balancer) 来实现网站的负载均衡,并且通过压力测试演示了它的效果,可以说还是非常的理想的.同时我们也收集到了不少的问题,比如说如何在这种分布式的架构下使用Session,NLB中有一台服务器挂掉了会导致对外暴露的地址无法访问,如果实现服务器之间的同步,如果更好的进行热修复等等,还有我们在上一篇中也提到了NLB所提供的功能是非常简单的,为了回答我们前面提到的问题

在Windows平台搭建C语言开发环境的多种方式

新接触C语言,如何进行C语言开发环境的搭建值得思考并整理 注:本文知识来源于  Windows 平台搭建C语言集成开发环境 - 极客学院 一.在Windows平台配置GNU环境 二.在Windows平台使用Sublime Test开发C语言程序 三.在Windows平台使用VisualStudio开发C语言程序 四.在Windows平台搭建EclipseCDT集成开发环境 五.在Windows平台搭建Clion集成开发环境 一.在Windows平台配置GNU环境 GNU http://www.g

32bit的windows 2008,Oracle实例启动报错ORA-00064

环境:windows 2008 32bit,oracle db 10.2.0.1 32bit 单机,32GB的物理内存 问题:实例启动报错:ORA-00064: object is too large to allocate on this O/S (1,4004280) 现象如下: H:\oracle\product\10.2.0\db_1\BIN>sqlplus / as sysdba SQL*Plus: Release 10.2.0.1.0 - Production on 星期日 5月 2

【MongoDB】windows平台搭建Mongo数据库复制集(类似集群)(转)

原文链接:[MongoDB]windows平台搭建Mongo数据库复制集(类似集群)(一) Replica  Sets(复制集)是在mongodDB1.6版本开始新增的功能,它可以实现故障自动切换和自动修复功能成员节点的功能,各个DB之间的数据完全一致,大大降低了单点故障的风险. [] 以上图示是三个节点的Replica Set架构.该图来源于红丸编写的<Mongodb管理与开发精要>这本书.从上图可以看出,结构类似与一个集群,其实完全可以当做一个集群.因为它确实和集群实现的作用是相同的. 一