说说Oracle监听器(二)

监听器工作过程

为景洪等地区用户提供了全套网页设计制作服务,及景洪网站建设行业解决方案。主营业务为成都做网站、成都网站制作、景洪网站设计,以传统方式定制建设网站,并提供域名空间备案等一条龙服务,秉承以专业、用心的态度为用户提供真诚的服务。我们深信只要达到每一位用户的要求,就会得到认可,从而选择与我们长期合作。这样,我们也可以走得更远!

 

下面我们谈谈监听器的工作过程。一般,监听器作为一个独立process在操作系统中运行,守候在特定网络端口(默认为:1521),等待客户端请求的到来。注意:我们在客户端配置命名服务的时候,输入的1521也就是为了与监听器程序建立连接。

 

当一个请求“如期而至”,监听器对照已经注册的服务列表,查找对应的数据库实例信息,获取到指定实例的ORACLE_HOME路径。相当于表明可以进行连接。

 

客户端与实例的交互不是直接的,是通过Server Process作为代理中介来实现的。所有指令SQL都是客户端通过Server Process发送到实例中,这种体系结构是Oracle对于实例和数据库文件一种保护机制。

 

当监听器获得请求之后,要从Oracle实例中分配一个Server Process与之对应。这里不同的Oracle连接方式存在一些差别。

 

如果是专用连接模式,也就是一个客户端连接对应一个Server Process。监听器就会向OS请求fork(创造)出一个Server Process,与监听器尝试交互。

 

如果是共享连接模式,也就是多个客户端共享一个Server Process(注意:这里还不是连接池)。监听器就会向Dispatcher进程(管理共享模式连接的进程)请求一个Server Process与之交互。

 

Server Process与监听器的连接,实际上就是相互信息的交换。Server Process将自身在OS中的进程编号、连接地址信息发给监听器。监听器将客户端信息传递给Server Process

 

监听器获取到Server Process的信息之后,将其返回给客户端连接程序。客户端获取到信息之后,进行重连接,根据返回的信息与Server Process在制定的服务器端口进行联系。

 

直到这个时候,客户端程序才将连接用户名、密码等信息发给Server Process,进行登录验证等操作。监听器的工作也就到此结束。

 

这里面有一个技术细节,就是Server Process与客户端连接的时候,是允许不使用1521端口的。具体连接的端口,是带有随机因素的。在9i版本Windows平台下,如果安装了防火墙,只允许1521端口通信,是会带来一些连接问题。好在在其他平台上和之后的版本中,实现了一种端口共享技术,连接可以和监听器一起使用1521端口。

 

介绍了监听器工作原理,下面我们说说动静态注册的机制。

 

 

 

动静态注册机制

 

在上面的内容中,我们已经初步了解了注册的作用,就是实现数据库实例名和服务名注册到运行的监听器程序中。目前的Oracle,支持静态注册和动态注册两种注册方式。

 

静态注册顾名思义,就是显示的指定出监听器程序要为那个实例以哪个服务名做监听。在启动监听器的时候,监听程序是不知道所监听实例服务是否存在。直到有客户端请求指定的服务。

 

指定静态注册的位置是在listener.ora参数文件,下面是一个典型参数文件的结构。

 

# listener.ora Network Configuration File: D:\oracle\product\10.2.0\db_1\network\admin\listener.ora

# Generated by Oracle configuration tools.

 

SID_LIST_LISTENER =

 (SID_LIST =

   (SID_DESC =

     (SID_NAME = PLSExtProc)

     (ORACLE_HOME = D:\oracle)

     (PROGRAM = extproc)

   ) 

   (SID_DESC =

     (GLOBAL_DBNAME = orcl)

     (ORACLE_HOME = D:\oracle)

     (SID_NAME = orcl)

   )

 

 )

 

LISTENER =

 (DESCRIPTION_LIST =

   (DESCRIPTION =

     (ADDRESS = (PROTOCOL = IPC)(KEY = EXTPROC0))

     (ADDRESS = (PROTOCOL = TCP)(HOST = 127.0.0.1)(PORT = 1521))

   )

 )

 

其中,SID_LIST配置节点中的SID_DESC就是配置静态注册的节点项目。SID_LIST里用来配置当前监听器注册的服务项目,通过多个SID_DESC进行配置,每个SID_DESC基本上就是一个配置项目。默认是动态注册的时候,只有PLSExtProc项目。

 

静态配置项目中,通过GLOBAL_NAME配置服务项目,通过SID_NAME指定数据库实例的名称,通过ORACLE_HOME配置Oracle数据库软件安装的基本目录。

 

动态注册是与静态注册相对应的一种注册方法。同样也是通过listener.ora进行配置。下面是一个典型的配置参数文件。

 

# listener.ora Network Configuration File: D:\oracle\product\10.2.0\db_1\network\admin\listener.ora

# Generated by Oracle configuration tools.

 

SID_LIST_LISTENER =

 (SID_LIST =

   (SID_DESC =

     (SID_NAME = PLSExtProc)

     (ORACLE_HOME = D:\oracle)

     (PROGRAM = extproc)

   )

 )

 

LISTENER =

 (DESCRIPTION_LIST =

   (DESCRIPTION =     

     (ADDRESS = (PROTOCOL = TCP)(HOST = www-0e6111dff74)(PORT = 1521))

   )

 )

 

对比上面的静态注册文件,可以发现显示指定服务名称和数据库实例名的项目不见了。只有本地地址和监听器端口信息。

 

动态注册的动作是监听器所在主机上数据库实例完成。动态注册是Oracle上一个不能关闭的功能。实例的background process PMON,每隔一段时间(一到两分钟)就会将实例的参数信息注册到监听器上,实现动态注册。

 

注册的信息是数据库参数service_name和instance_name。可以通过Show Parameter命令查看。

 

SQL> show parameter instance_name;

 

NAME                                TYPE       VALUE

------------------------------------ ----------- ------------------------------

instance_name                       string     orcl

 

SQL> show parameter service_names;

 

NAME                                TYPE       VALUE

------------------------------------ ----------- ------------------------------

service_names                       string     orcl

 

一般数据库在建立的时候,这两个参数都是已经设置好的,不会轻易的发生变化。

 

如果instance_name参数没有设置,则系统会选取参数db_name作为实例名称返回。如果service_names没有设置,则会将db_name和db_domain两个参数组合成服务名实现注册。

 

值得注意的一个问题是,service_names参数是一个可以指定多个服务名称的参数,以逗号分隔。也就是说,一个Oracle实例时可以同时作为多个服务名向外提供服务的。Service_name是Oracle在新近版本中提出,替代SID_NAME的概念。使用Service的指定方式,多个Oracle实例就可以统一提供一致的数据访问服务(也就是RAC)。

 

 

通常,对instance_name和service_name两个参数,还是建议设置上。因为会在一定程度上影响到动态注册的效果。

 

如果没有显示的指定这两个参数,那么只有在数据库实例启动在监听器实例之后的时候,才会一次动态注册。一旦之后监听器重新启动,动态注册的信息就不会存在,而且很难再次注册上。所以,我们是推荐将这两个参数设置上的。

 

只有显示设置两个值的情况下,PMON才会周期性的将注册信息加以注册。通过命令行,也可以强迫PMON立即执行一次注册操作。

 

SQL> alter system register

 2 ;

 

System altered

 

 

最后,我们聊一聊动态注册的作用,支持错误转移failover。注册操作的发动方是PMON后台进程,PMON是Oracle实例最重要的后台进程,很多资料和DBA都是以该进程的状态确定数据库实例的状态。PMON负责动态注册,如果不能进行动态注册,说明PMON已经失去了工作能力,也就意味着监听程序所服务的实例已经不能工作。

 

通过动态注册的机制,监听程序是可以知道所服务的服务器实例已经崩溃,对于客户端的请求,可以实现错误转移。

 

当然,我们这里谈到的崩溃是实例的崩溃。如果监听器程序崩溃了,情况又是另一种样子了。

 

 


分享标题:说说Oracle监听器(二)
链接地址:http://scyanting.com/article/jigcdi.html