1. Oracle监听器理论基础(摘自书本、网络)
Oracle监听器运行于数据库服务器端一个进程,用于监听所有来自客户端的连接请求,并提供处理数据库服务方面的请求。这个进程负责监听用户的连接请求,每当收到一个用户请求,监听器进程就会创建一个影子进程,然后把用户请求转交给这个影子进程,由影子进程继续完成用户提交的各种命令。一旦监听进程把用户转交给影子进程,监听进程的任务就算完成了,会继续去监听下一个用户请求,监听器配置文件listener.ora。
Oracle能够支持2中连接方式,分别是专有模式和共享模式,二者的区别在于,专有模式为每个用户连接启动一个单独的影子进程,相当于为每个用户提供一个单独的到服务器的会话通道,其特点是响应客户端请求速度快,但PGA占用较多;共享模式是由多个用户连接共享一个进程,多个用户共享一个会话通道。
监听器的主要功能如下:
1.监听客户端请求,监听器运行在数据库服务器之上,与Oracle实例(可为多个)相关关联,是一个专门的进程process。在Windows的服务项目或者Linux的运行进程列表中,都会看到对应的运行进程,Windows上名为TNSLSNR,Linux/Unix平台上是lsnrctl,监听器守候在服务器制定端口(默认为:1521),监听客户端的请求。
2.为客户端请求分配Server Process,监听器只负责接收请求,之后将请求转接给Oracle Server Process,在Oracle的服务模式下,客户端进程是不允许直接操作数据库实例和数据,而是通过一个服务进程Server Process(也称为影子进程)作为代理。监听器接受到请求之后,就向操作系统(或者Dispatcher组件)要求fork(或分配)一个Server Process与客户端相连。
3.注册实例服务,本质上讲,listener是建立实例和客户端进程之间联系的桥梁。Listener与实例之间的联系,就是通过注册的过程来实现的,注册的过程就是实例告诉监听器,它的数据库数据库实例名称instance_name和服务名service_names。监听器注册上这样的信息,对客户端请求根据监听注册信息,找到正确的服务实例名称,目前Oracle版本中,提供动态注册和静态注册两种方式。
4.错误转移failover,Failover是RAC容错的一个重要方面功能,其功能是在数据库实例崩溃的时候,可以自动将请求转移到其他可用实例上的一种功能。可以提供很大程度上的可用性(Availability)功能,这个过程中,发现实例已经崩溃,并且将请求转移到其他实例上,就属于是listener的功能。
负载均衡衡量,在RAC架构中,Oracle实现了负载均衡。当一个客户请求到来时,Oracle会根据当前RAC集群环境中所有实例的负载情况,避开负载较高的实例,将请求转移到负载较低的实例进行处理。在早期RAC版本中,负载轻重的衡量是根据监听器当前维护连接数目来确定的,而不是实时查看多实例的负载,RAC环境中的监听器之间进行沟通通信。
2.动态注册监听
一台数据库服务器一般只需要一个监听器,一个监听器可以监听多个数据库,也可以一个数据库多个监听,当然也可以为每个数据库配置专门的监听器,这要根据具体的情况来配置。事实上,配置监听就是将数据库服务的注册信息写入指定文件,那样每次启动监听的时候就会自动读取数据库的相关信息。我们把实例将数据库将所提供的服务名及相关信息告知listener的过程称之为服务注册,注册通常包括数据库的服务名、实例名、SERVER模式、端口号等。我们可以通过Lsnrctl命令查看监听的运行情况和数据库的状态:
-
Ready:代表实例可以接受连接请求,是动态注册的监听;
-
Blocked:实例目前不能接受连接请求;
-
Unknown:静态注册的监听。
在运行lsnrctl命令的status时,常会看到如下返回值(下图红色部分):
结果显示,状态UNKOWN和READY的监听记录,它们分别是静态和动态注册的监听。先来说一下动态注册,动态注册是在instance启动的时候,由PMON进程根据init.ora中的instance_name、service_names两个参数将实例和服务动态注册到listener中。如果没有定义service_name,数据库会根据db_name和db_domain组成的一个全局数据库名成注册到监听器中,instance_name是实例名称,一般和SID值一样。
动态注册不必须显式的配置在listener.ora文件中,当然在listener.ora配置如图7-4绿色部分的内容来实现动态注册也无妨,DBA还可以通过SQL语句—“alter system register;”强制PMON向监听器动态注册。在Oracle 9i之后,不需要任何配置即可实现动态注册,实例启动后会自动在本地主机默认的号端口上查找监听器,并进行注册。
说明:在数据库服务器启动过程中,数据库服务器会向监听程序注册相应的服务(无论何时启动一个数据库,默认地都有两条信息注册到监听器中:数据库服务器对应的实例和服务。)相当于是这样:在数据库服务器和客户端之间有一监听程序(Listener),在监听程序中,会记录相应数据库对应的服务名(一个数据库可能对应有多个服务名),当客户端需要连接数据库时,只需要提供服务名,就可以建立客户端和服务器之间的连接。
注意:Oracle_SID从ORACLE 10G开始,参数文件不再记录INSTANCE_NAME,此时INSTANCE_NAME动态从系统ORACLE_SID获得来保持一致。
3 静态注册监听
事实上,我们常说的Oracle数据库监听配置,一般都是指静态注册—将实例的相关信息手动告知listener,即将数据库的相关信息配置到listener.ora中。在实例启动时就会读取listener.ora文件的配置,listener.ora中的GLOBAL_DBNAME向外提供服务名,listener.ora中的SID_NAME提供注册的实例名,将实例和服务注册到监听程序,静态配置最大的问题就是监听器无法知道数据库真正的状态。
说明:如果关闭数据库后在查看监听会发现动态注册的自动消失了只有静态注册的在,动态注册机制不需要对监听器做任何额外配置,而结果却比静态注册更准确,静态注册机制需要针对每个数据库都做额外配置,但是结果却不准确。
关于监听的配置,可以使用网络配置助手(Oracle Net Configuration Assistant)或网络管理器(Oracle Net Manager),也可以通过“f:\app\nn\pruduct\11.2.0\dbhome_1\network\admin\listener.ora”直接手动配置。
1.Net Configuration Assistant,主要为用户提供Oracle数据库的监听程序、命名方法、本地NET服务名和目录配置,网络配置助手以向导的形式出现,使配置过程简单,适合初学者,根据向导输入监听程序名称→网络协议→主机→端口,完成配置。
2.Net Manager和Net Configuration Assistant功能相似,主要内容为本地服务命名和监听程序配置,但Net Manager将所有配置步骤集合到同一界面,更适合熟练者进行操作。根据界面的提示,点击“监听程序”,再点击左侧栏的“+”添加监听,按步骤输入:监听程序名称→网络协议→主机→端口,完成配置。
3.通过“$ORACLE_HOME/network/admin/listener.ora”(Linux系统下)“$ORACLE_HOME\11.2.0\dbhome_1\network\admin\listener.ora”(Windows系统)直接手动配置,在listener.ora加入下图红色部分的内容。
说明:可以通过查看listener.ora文件判断监听的注册方式,如果[监听名]和SID_LIST_[监听名]配置是成对出现的,这代表是静态监听;如果listener.ora文件只有[监听名]的配置,监听就变成动态监听了,这时它需要由oracle数据库的pmon主动向监听注册,告知监听有这么一个服务的存在。