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: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共享连接?做了什么配置就能够从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的闭环。

watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvYmlzYWw=/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center" >

从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数据库中实现。

范围:

这篇文章主要是提供给须要通过防火墙使用SQL*Net,Net8或Oracle Net连接訪问执行在Windows操作系统的Oracle数据库的DBA和网络管理员。

具体描写叙述:

正如66382.1描写叙述的。有两种方法能够让Oracle数据库执行于使用防火墙的环境中。

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

SQL*Net代理能够开启还有一个让client连接的监听进程(通常在1610port)。然后这个监听进程会代理到数据库的连接,并处理防火墙内部的port重定向。不会触发禁止訪问的规则。此时防火墙就像正在执行Oracle连接管理器(Connectiong Manager或多协议交换器,Multi Protocol Interchange)。

有一点不同的就是。在防火墙和数据库之间安装了连接管理器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<#>

In Oracle release 9 or later \\HKEY_LOCAL_MACHINE\SOFTWARE\ORACLE\Key_<Home>

添加一个STRING_VALUE值(注冊表窗体右側)。不是KEY值(注冊表窗体左側)。

全部这些方法都须要Oracle进程的重新启动,以使进程重新启动时能够读取到注冊表。

Troubleshoot备注:

能够使用‘netstat -a’命令查看配置。他应该展示全部的client连接。以及监听的port。

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

TRACE_DIRECTORY_CLIENT = <directory>

TRACE_FILE_DIRECTORY= <filename>[Insert code here]

通过在跟踪文件里搜索‘port‘字符串。能够定位到详细的唯一端口。

特殊备注:

1. 假设使用TCPS协议或SSL,将会发生port重定向。解决方式是使用支持Sqlnet或Net8连接的防火墙或配置共享server分发port。

2. 10g及以上,默认USE_SHARED_SOCKET=TRUE。

版权声明:本文博客原创文章,博客,未经同意,不得转载。

时间: 2024-10-17 11:38:48

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

AppAssure备份Windows平台Oracle数据库

环境: AppAssure Core : 5.4.3.106 Oracle:  11g Enterprise Edition Release 11.2.0.1.0 -64bit OS: Windows Server 2012 R2 (Core Server and OracleDB) 备份恢复步骤如下: 1. 检查数据库模式, 查看数据库是否处于归档模式中 sqlplus / as sysdba SQL > archive log list 2. 若为非归档,则修改数据库归档模式 SQL > 

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&

【翻译自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平台分布式架构实践 - 负载均衡

概述 最近.NET的世界开始闹腾了,微软官方终于加入到了对.NET跨平台的支持,并且在不久的将来,我们在VS里面写的代码可能就可以通过 Mono直接在Linux和Mac上运行.那么大家(开发者和企业)为什么那么的迫切的希望.NET跨平台呢?第一个理由是便宜,淘宝号称4万多台服务器 全部运行在Linux,Linux平台下还有免费的MySql,这些都是免费的,这些省下来直接就是利润呀,做企业的成本可以降低又没有任何损失,何乐而 不为呢?第二个理由是在Linux系统下还有很多非常优秀的构架(当然同样也

亲试,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平台搭建C语言开发环境的多种方式

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

Windows平台分布式架构实践 - 负载均衡 上

概述 最近.NET的世界开始闹腾了,微软官方终于加入到了对.NET跨平台的支持,并且在不久的将来,我们在VS里面写的代码可能就可以通过Mono直接在Linux和Mac上运行.那么大家(开发者和企业)为什么那么的迫切的希望.NET跨平台呢?第一个理由是便宜,淘宝号称4万多台服务器全部运行在Linux,Linux平台下还有免费的MySql,这些都是免费的,这些省下来直接就是利润呀,做企业的成本可以降低又没有任何损失,何乐而不为呢?第二个理由是在Linux系统下还有很多非常优秀的构架(当然同样也是免费

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

概述 最近.NET的世界开始闹腾了,微软官方终于加入到了对.NET跨平台的支持,并且在不久的将来,我们在VS里面写的代码可能就可以通过Mono直接在Linux和Mac上运行.那么大家(开发者和企业)为什么那么的迫切的希望.NET跨平台呢?第一个理由是便宜,淘宝号称4万多台服务器全部运行在Linux,Linux平台下还有免费的MySql,这些都是免费的,这些省下来直接就是利润呀,做企业的成本可以降低又没有任何损失,何乐而不为呢?第二个理由是在Linux系统下还有很多非常优秀的构架(当然同样也是免费

Windows平台cocos2d-x 3.2下载以及创建新项目过程

首先,有关于cocos2d-x在windows下Android环境的搭建, 请参考一位网友的这篇博文<cocos2d-x 3.0rc开发指南:Windows下Android环境搭建>. 这里简单列一下所需工具的下载地址: 1.JDK 下载地址:http://www.oracle.com/technetwork/java/javase/downloads/index.html 2.ADT(Android Developer Tools),里面包含了SDK和Eclipse. 下载地址是:http: