欢迎光临
我们一直在努力

说说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_nameinstance_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_namedb_domain两个参数组合成服务名实现注册。


 


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


 


 


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


 


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


 


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


 


SQL> alter system register


  2  ;


 


System altered


 


 


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


 


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


 


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


 


 


赞(0)
【声明】:本博客不参与任何交易,也非中介,仅记录个人感兴趣的主机测评结果和优惠活动,内容均不作直接、间接、法定、约定的保证。访问本博客请务必遵守有关互联网的相关法律、规定与规则。一旦您访问本博客,即表示您已经知晓并接受了此声明通告。