当前位置:文档之家› oracle_listener_详解

oracle_listener_详解

Oracle监听-提纲o ORACLE工作机制o ORACLE监听参数o ORACLE监听功能o ORACLE监听配置o ORACLE网络构架o ORACLE精简版构造o ORACLE常见问题ORACLE工作机制o从一个用户请求开始讲,ORACLE的完整的工作机制是怎样的,首先一个用户进程发出一个连接请求,如果使用的是主机命名或者是本地服务命中的主机名使用的是机器名(非IP地址),那么这个请求都会通过DNS服务器或HOST文件的服务名解析然后传送到ORACLE监听进程,监听进程接收到用户请求后会采取两种方式来处理这个用户请求o下面我们分专用服务器和共享服务器分别采用这两种方式时的情况来讲专用服务器模式o一种方式是监听进程接收到用户进程请求后,产生一个新的专用服务器进程,并且将对用户进程的所有控制信息传给此服务器进程,也就是说新建的服务器进程继承了监听进程的信息,然后服务器进程给用户进程发一个RESEND包,通知用户进程可以开始给它发信息了,用户进程给这个新建的服务器进程发一个CONNECT包,服务器进程再以ACCEPT包回应用户进程,致此,用户进程正式与服务器进程确定连接。

我们把这种连接叫做HAND-OFF连接,也叫转换连接专用服务器模式o另一种方式是监听进程接收到用户进程的请求后产生一个新的专用服务器进程,这个服务器进程选用一个TCP/IP端口来控制与用户进程的交互,然后将此信息回传给监听进程,监听进程再将此信息传给用户进程,用户进程使用这个端口给服务器进程发送一个CONNECT包,服务器进程再给用户进程发送一个ACCEPT包,致此,用户进程可以正式向服务器进程发送信息了。

这种方式我们叫做重定向连接。

专用服务器模式o另HAND-OFF连接需要系统平台具有进程继承的能力,为了使WINDOWS NT/2000支持HAND-OFF必须在HKEY_LOCAL_MACHINE>SOFTWARE>ORACLE >HOMEX中设置USE_SHARED_SOCKET 。

o案例:o具体的应用环境描述如下:1、有数据库主机A,在局域网内2、局域网有代理网关服务器B操作系统3、在外网有一台工作站C。

想实现,在B机器上对A机器上的数据库Listener端口进行映射,将A机的数据库发布给外网。

在C机上通过sqlplus等工具,可以通过B机访问A机的数据库。

目前1521端口只是监听端口,数据端口是随机分配的。

o服务器上的监听进程在1521端口上进行侦听o客户端发起一个数据库连接请求o监听进程listern一个Oracle服务器进程(Server Process),也可称之为影子进程(Shadow Process )。

服务器进程选择一个大于1024的端口号进行侦听,监听进程把这个端口号发回到客户端,要求客户端重新连接这个指定的端口。

o客户端重新连接监听指定的新端口,也就是重新进行连接。

o客户端与Server Process直接对话,不再通过监听,进行会话认证(登录),执行SQL等等o Oracle客户端连接服务器,首先去找1521监听端口,服务器的1521监听端口再向server process进程发出请求,并返回一个随机端口,返回给客户端,客户端再来连接这个端口。

这样就给服务器上的防火墙设置带来了麻烦,这个端口是随机的,如何开放?o(CONNECT_DATA=(SERVICE_NAME=orcl)(CID=(PROGR AM=D:\Program?Files\Quest?Software\Toad?for?Oracle?10.6\Toad.exe)(HOST=KTSP)(USER=Administrator))) *(ADDRESS=(PROTOCOL=tcp)(HOST=192.18.0.105)(POR T=50691)) * establish * orcl * 0o从上述过程可以看到,客户端最终连接的端口实际上并不是1521。

由于防火墙一般只开放了几个端口,对Oracle数据库只开放了1521端口,这样在客户端进行第二次连接时,不能通过防火墙,导致连接数据库失败o庆幸的是,只有Windows平台上的9i及以下版本的Oracle才会有这个问题。

Oracle在Linux以及Unix平台下,多个进程间可以对端口进行复用,Oracle Server Process仍然使用的是跟监听进程一个端口(1521)。

通过在linux使用strace跟踪客户端连接数据库的过程可以发现,客户端只连接了一次,并没有进行第二次连接,与上面描述的流程相比已经发生了变化。

在Windows平台上,10g及以上版本的库,也同样利用端口复用,避免了这样的问题o方法一:n在windows2000的注册表中,hkey_local_machine\software\oracle\home0\下加入字符串值:USE_SHARED_SOCKET=TRUE,即可o方法二:n1、首先将数据库实例改为SHARED SERVER模式2、以SYSDBA登录SQLPLUS,通过SQLPLUS生成系统当前的参数设置文件pfile:create pfile='d:\init.ora' from spfile;3、修改d:\init.ora文件,在其中增加(用editplus编辑):*.service_names='yourservice name'和*.dispatchers='(address=(protocol=tcp)(host=localhost)(port=1521)(dispatchers=1)'4、生成新的SPFILE:create spfile from pfile='d:\init.ora';5、重启动数据库。

6、在防火墙中开放1521端口。

o方法三:n在数据库端(也可以是另外的机器,但是cman的机器必须和数据库都在防火墙的后面)安装了cman的前提下,启动cman,然后开放防火墙端的1630端口(看cman开的是什么端口啦),最后在客户端的tnsnames.ora文件中添加:cmantest = (description = (address_list = (address = <-first address is toCMAN (protocol=tcp) (host=hostname or ip of cman) (port=1610) )(address= <-second address is to Listener (protocol=tcp) (host=hostnameor ip of listener) (port=1521) ) ) (connect_data = (sid = sidname))(source_route = yes)o ORA-3113错误:n防火墙设置了TCP连接超时,如果在1小时内没有任何活动,就会被防火墙拆除n操作系统中keep alive的相关设置,不同的系统有不同的设置方法。

比如在Linux中,在sysctl中设置net.ipv4.tcp_keepalive_time = 120,表示探测时间为120秒,即2分钟。

在AIX中,通过no命令将tcp_keepidle参数设置为240,表示探测时间为120秒。

注意AIX中这个参数的单位是1/2秒,而在Linux中是1秒o ORA-3113错误:n防火墙设置了TCP连接超时,如果在1小时内没有任何活动,就会被防火墙拆除n操作系统中keep alive的相关设置,不同的系统有不同的设置方法。

比如在Linux中,在sysctl中设置net.ipv4.tcp_keepalive_time = 120,表示探测时间为120秒,即2分钟。

在AIX中,通过no命令将tcp_keepidle参数设置为240,表示探测时间为120秒。

注意AIX中这个参数的单位是1/2秒,而在Linux中是1秒n不幸的是,通过在Linux和AIX上对Oracle进行跟踪发现,Oracle客户端连接数据库时(包括Oracle Server作为客户端连接DB LINK上的数据库),并没有在TCP Socket上打开SO_KEEPALIVE,因此不能通过设置操作系统的tcp keep alive的设置来解决此问题。

n还好Oracle提供了类似的机制。

也就是DCD(Dead Conneciton Detection)。

在$ORACLE_HOME/network/admin/sqlnet.ora文件中增加如下一行:n EXPIRE_TIME=2 分共享服务器模式o只有重定向连接的方式,工作方式是监听进程接收到用户进程的请求后产生一个新的调度进程,这个调度进程选用一个TCP/IP端口来控制与用户进程的交互,然后将此信息回传给监听进程,监听进程再将此信息传给用户进程,用户进程使用这个端口给调度进程发送一个CONNECT包,调度进程再给用户进程发送一个ACCEPT包,致此,用户进程可以正式向调度进程发送信息了。

可以通过设置MAX_DISPIATCHERS这个参数来确定调度进程的最大数目,如果调度进程的个数已经达到了最大,或者已有的调度进程不是满负荷,监听进程将不再创建新的调度进程,而是让其中一个调度进程选用一个TCP/IP端口来与此用户进程交互共享服务器模式o调度进程每接收一个用户进程请求都会在监听进程处作一个登记,以便监听进程能够均衡每个调度进程的负荷,所有的用户进程请求将分别在有限的调度进程中排队,所有调度进程再顺序的把各自队列中的部分用户进程请求放入同一个请求队列,等候多个ORACLE的共享服务器进程进行处理(可以通过SHARED_SERVERS参数设置共享服务器进程的个数),也就是说所有的调度进程共享同一个请求队列,共享服务器模式下一个实例只有一个请求队列,共享服务器进程处理完用户进程的请求后将根据用户进程请求取自不同的调度进程将返回结果放入不同的响应队列,也就是说有多少调度进程就有多少响应队列,然后各个调度进程从各自的响应队列中将结果取出再返回给用户进程共享服务器模式o调度进程每接收一个用户进程请求都会在监听进程处作一个登记,以便监听进程能够均衡每个调度进程的负荷,所有的用户进程请求将分别在有限的调度进程中排队,所有调度进程再顺序的把各自队列中的部分用户进程请求放入同一个请求队列,等候多个ORACLE的共享服务器进程进行处理(可以通过SHARED_SERVERS参数设置共享服务器进程的个数),也就是说所有的调度进程共享同一个请求队列,共享服务器模式下一个实例只有一个请求队列,共享服务器进程处理完用户进程的请求后将根据用户进程请求取自不同的调度进程将返回结果放入不同的响应队列,也就是说有多少调度进程就有多少响应队列,然后各个调度进程从各自的响应队列中将结果取出再返回给用户进程ORACLE监听参数o LISTENER 指出一个监听器定义的起始点。

相关主题