分类: Oracle
2008-04-30 23:20:46
今天加班为了一个问题阻了不少时间.为了防止忘记写来备忘.也为了共享.
问题描述如下:
WINDOWS XP+SP2环境. 启动了WINDOWS自己的防火墙.
安装了ORACLE10G数据库.
一台客户机安装了ORACLE10G客户端.
(确定WINDOWS工作正常,ORACLE服务和客户端都工作正常,网络工作正常)
可客户端就是无法连接上服务器端.而在服务器上一切连接正常.
在网上查了一下.发现提这个问题的不少.可真正解决问题的内容却不多.不过最后还是解决了.
网上的提供的解决方法有两个.这里给出原文:(在最后)
我两种方法都实验了.可有一种方法通过了.
通过的方法是:
在注册表:HKEY_LOCAL_MACHINESOFTWAREORACLEHOME0(类似这个名字.我的机器上是HKEY_LOCAL_MACHINESOFTWAREORACLEKEY_OraDb10g_home1)上新建一个字符串项:USE_SHARED_SOCKET 值为:TRUE。如果安装了多个目录,则每个类似的目录都要设置:HKEY_LOCAL_MACHINESOFTWAREORACLEHOMEx (x目录编号) 设置后重新启动实例和监听.(我的机器上要是两个都要重启)
第二种方法不知道我的操作有错误. 我更改的文件是: %ORACLE_HOME%/db/database/SPFILEORCL.ORA 也是在这个文件最后加上: mts_dispatchers="(address=(protocol=tcp)(host=172.16.1.2)(port=1521))(dispatchers=1)" 可我不知道什么原因(我初步估计我是用的一个EDITPLUS的文本编辑工具(类似记事本),在修改时破坏了这个文件的某些格式或不可见字符). 我改后的症状是在WINDOWS服务里启动ORACLE实例时速度变得很快.用服务器上的客户端连接显示数据库为关闭状态.就是说ORACLE实例根本就没有被启动. 后来我尝试在ORACLE客户端的配置参数信息里找这个参数.可无功而返.
我先操作了第一步,并且在WIDNOWS防火墙里加入一个例外(打开ORACLE的1521端口,或者是自己定义的ORACLE端口). 至此问题解决.
********************************************************************************* 附:网上对个问题的一个资料,我认为对原因为操作讲得很清楚.
资料一、 近来由于工作需要,在Windows XP平台上安装了Oracle9i数据库作为测试之用,一切正常。但当客户机连接服务器时却总是超时,我首先想到了防火墙,当我打开1521端口时,连接操作仍然失败。我又怀疑网络有问题,用telnet server_ip:1521尝试,连接被接受,说明1521端口已经被打开。 没有办法,查询Oracle资料后才明白,network listener 只起一个中介作用,当客户连接它时,它根据配置寻找到相应的数据库实例进程,然后spawned一个新的数据库连接,这个连接端口由network listener传递给客户机,此后客户机就不再和打交道了,即使listener停止了工作。这个新的连接端口是不可预知的,因而会被防火墙阻止。 Windows Socket2 规范有一个新的特性,就是Shared Socket, 所谓共享套接字是指一个进程共享另一个进程的套接字(详见MSDN相关参考)。如果让network listener与数据库服务进程共享套接字,那么连接端口就不会变化。 如何设置 Shared Socket? 在注册表:HKEY_LOCAL_MACHINESOFTWAREORACLEHOME0上新建一个字符串值:USE_SHARED_SOCKET=true。如果安装了多个目录,则每个类似的目录都要设置:HKEY_LOCAL_MACHINESOFTWAREORACLEHOMEx (x目录编号) 设置后要求重新启动实例(只重启listener发现没有效果) 引用资料: 典型问题: when a client connects to a listener it uses port 1521 at the client machine. the listener then returns to the client thru a different port. The 1521 port is closed and the db connection uses the new port for communicating with the client. i want the listener to return to the client using port 1521, how? metalink says use the use_shared_socket parameter, but its still not working. i set the parameter to true in the sys env and in the registry. Oracle 原文: USE_SHARED_SOCKET You can set the USE_SHARED_SOCKET parameter to TRUE to enable the use of shared sockets. If this parameter is set to TRUE, the network listener passes the socket descriptor for client connections to the database thread. As a result, the client does not need to establish a new connection to the database thread and database connection time improves. Also, all database connections share the port number used by the network listener, which can be useful if you are setting up third-party proxy servers. On Windows NT 4.0 Service Pack3 or earlier, enabling this option precludes bringing the network listener up or down in a case where a database connection spawned by the network listener is active. Therefore, you may This parameter only works in dedicated server mode in a TCP/IP environment. If this parameter is set, you cannot use the 8.1.5 listener to spawn Oracle 7.x databases. To spawn an Oracle 8.0.x database from an 8.1.5 listener ==============
资料二、 windows 平台上的这个问题成了一大难题,很多论坛都有人问,但很少有人能解决。 unix平台不用担心,系统自动会解决这个问题. Matalink上提供了三种解决办法,实际上USE_SHARED_SOCKET 是最有效最方便的。但经过无数次实现,仍然没有成功,最后终于发现是Oracle 8.1.7的bug 需要打补丁,升级到Oracle 8.1.7.1.2 需要在MTS模式下(共享模式) Oracle默认是专用模式。 经试验发现,如果不在init文件中设参数的话,Oracle仍然会要求一个随机端口和1521端口来共同通讯,只是这个随机端口,并不随客户端会话和登录的变化而变化,在没有重启服务器时,是固定的。 (试验发现,在专用模式下,每次连接,oracle服务器会按+1方式,提供一个非1521的端口。) 所以,还需要在init.ora文件的最后加上一条参数: 这样才真正实现只用一个端口,穿过防火墙。 参考资料: Oracle uses dynamic ports under windows NT because of a bug in windows, so oracle can't use shared sockets. This bug got fixed with service pack 3 I think. By default, oracle uses the dynamic ports without caring which service pack is installed. There is a registry setting to force oracle to use shared sockets. The parameter is (what a surprise!) USE_SHARED_SOCKET in LOCAL_MACHINESoftwareOracleHomeX where X is your desired homedir. This parameter should be set to TRUE. There's a whitepaper from oracle for this too, somewhere on their site. Anyway, this parameter doesnt work for 8.1.7 Some users reported that it worked with 8.1.6.3, but 8.1.7 termiates every conection immediately... Contributed by Arne Brutschy () on July 5, 2001. Actually, I want to establish a replication system in my local machine.. for replicating objects(tables) from remote database to a local database... what data security option i must take in to account. I request you to give me the detail description like which protocal must be used and what parameter must be set in init.ora file,sqlnet.ora and listener.ora file and what other steps to be taken... I would be very thankful to you ... if you kindly describe the things...actually i want to maintain the data privacy which happens between remote and local database while replication take place.. any one can trap the net and extract the data ... so i need to stop that. I would be very thankful to you ... this is a request.. please mail me on the address . regards p.v.raju Contributed by pvraju () on October 8, 2001. Modify Windows registry.
- 作者: |