服务器端监听器配置
1、服务器端监听器配置
Oracle监听器是运行在数据库端的一个进程,这个进程负责监听用户的连接请求。每当收到一个用户请求,监听器进程就会创建一个影子进程(Shraw Process),然后把用户请求转交给这个影子进程,由影子进程继续完成用户提交的各种命令。一旦监听器进程把用户转交给影子进程,监听进程的任务就算完成了,它就继续监听下一个用户请求。所以监听器的角色就像一个中间人,它只是负责为用户进程和影子进程搭桥牵线。
监听器是根据配置文件工作的,这个文件叫做listener.ora,位于$ORACLE_HOME/network/admin目录下,因为监听器只工作在数据库服务器端,因此这个文件只有服务器端需要,客户端并不需要这个文件。这个文件的内容如下:
LISTENER =
(DESCRIPTION_LIST =
(DESCRIPTION =
(ADDRESS = (PROTOCOL = TCP)(HOST = 192.168.2.51)(PORT = 1521))
)
)
这个文件内容说明监听器在IP地址192.168.2.51的1521端口上监听。
Oracle能够支持两种连接方式,分别是专有模式(Dedicated Service)和共享模式(Shared Server)。二者的区别在于,专有模式为每个用户连接启动一个单独的进程(Shadow Process),相当于为每个用户提供一个单独的到服务器的会话通道,专有由此得名。而共享模式是躲个用户连接共享一个进程,也就是多个用户共享一个会话通道,因此叫做共享。Net Services Administrator’s Guide,使用哪一种模式是在创建数据库时确定的。
2、静态注册和动态注册
服务器端的监听进程和数据库是两组独立的进程。换句话说,一台物理服务器上可以同时运行多个数据库,具体数量取决于服务器的资源能力,理论上可以是无限的。但是一台服务器上一般只需要一个监听进程就足够了,一个监听进程足以为它所在的服务器上的所有数据库提供服务,也就是说,监听进程并不固定为一个数据库服务。
因为监听进程并不绑定在特定数据库,所以监听器要想完成它的使命——传递用户的连接请求,首先必须知道如果才能知道找到目标数据库,这个信息的获得可以通过两种方式,静态注册和动态注册。
2.1、静态配置
所谓静态配置,就是在配置监听器时,就明确的告诉监听器某个数据库的信息,监听器在启动过程中就会加载这一部分信息。这个信息同样是记录在监听器的配置文件LISTENER.ORA中,下面就是使用静态配置的LISTENER.ORA文件,注意其中SID_LIST_LISTENER部分就是静态配置内容。
SID_LIST_LISTENER =
(SID_LIST =
(SID_DESC =
(GLOBAL_DBNAME = ORCL.192.168.2.51)
(ORACLE_HOME = C:\oracle\product\10.1.0\Db_1)
(SID_NAME = ORCL)
)
)
LISTENER =
(DESCRIPTION_LIST =
(DESCRIPTION =
(ADDRESS = (PROTOCOL = TCP)(HOST = 192.168.2.51)(PORT = 1521))
)
)
这个例子就是说,名字叫做LISTENER的监听器需要负责SID=ORCL的数据库的连接请求,静态配置的最大问题就是监听器无法知道数据库的真正状态。
2.2、动态注册。
除了静态配置,Oracle数据库还可以动态地像监听器注册。动态注册是在instance启动的时候PMON进程根据init.ora中的INSTANCE_NAME,SERVICE_NAMES两个参数将实例和服务动态注册到listener中。要想使用动态注册功能,首先需要在数据库的初始化SERVICE_NAME和INSTANCE_NAME。如果没有定义SERVER_NAME参数,数据库会使用DB_NAME和DB_DOMAIN组成的一个全局数据库名称(Global Database Name)注册到监听器中。INSTANCE_NAME是实例名称,通常和SID值一样。
只要数据库处于运行状态,PMON进程就会自动、定期的地向监听进程注册、更新信息,DBA也可以使用下面命令强制PMON立即向监听器注册:
SQL>alert system register;
System altered.
静态配置和动态注册二者在监听器中的表现状态不一样,这一点可以利用Oracle提供的lsnrctl工具来验证。比如在下面查看结果中,有两个ORCL条目,这两个条目对应的是同一个数据库,只不过记录的生成方式不一同。第一条目的状态是UNKNOWN,这个条目就是静态配置产生的,而第二条目是READY,这个条目是动态注册生成的。
在数据库处于运动状态时,如果执行lsnrctl status命令来查看监听器状态,可以看到两个条目。注意两种方式的状态区别:静态配置的状态是UNKNOWN,动态注册的状态是READY。
C:\Documents and Settings\Administrator>lsnrctl start
LSNRCTL for 32-bit Windows: Version 10.1.0.2.0 - Production on 28-10月-2011 22:04:52
Copyright (c) 1991, 2004, Oracle. All rights reserved.
Starting tnslsnr: please wait...
TNSLSNR for 32-bit Windows: Version 10.1.0.2.0 - Production
System parameter file is C:\oracle\product\10.1.0\Db_1\network\admin\listener.ora
Log messages written to C:\oracle\product\10.1.0\Db_1\network\log\listener.log
Listening on: (DESCRIPTION=(ADDRESS=(PROTOCOL=tcp)(HOST=192.168.1.104)(PORT=1521)))
Connecting to (DESCRIPTION=(ADDRESS=(PROTOCOL=TCP)(HOST=192.168.1.104)(PORT=1521)))
STATUS of the LISTENER
------------------------
Alias LISTENER
Version TNSLSNR for 32-bit Windows: Version 10.1.0.2.0 - Production
Start Date 28-10月-2011 21:54:57
Uptime 0 days 0 hr. 0 min. 0 sec
Trace Level off
Security ON: Local OS Authentication
SNMP OFF
Listener Parameter File C:\oracle\product\10.1.0\Db_1\network\admin\listener.ora
Listener Log File C:\oracle\product\10.1.0\Db_1\network\log\listener.log
Listening Endpoints Summary...
(DESCRIPTION=(ADDRESS=(PROTOCOL=tcp)(HOST=192.168.1.104)(PORT=1521)))
Services Summary...
Service "ORCL" has 1 instance(s).
Instance "ORCL", status UNKNOWN, has 1 handler(s) for this service...
Service " ORCL " has 1 instance(s).
Instance " ORCL ", status READY, has 1 handler(s) for this service...
The command completed successfully
现在关闭数据库,然后再次查看监听器的状态。现在命令结果就只剩下一个条目了,这个条目的状态是UNKNOWN,很显然这二个条目对应的是静态配置产生的,而动态注册的那个条目随着数据库的关闭已经自动消失了。
C:\Documents and Settings\Administrator>lsnrctl start
LSNRCTL for 32-bit Windows: Version 10.1.0.2.0 - Production on 28-10月-2011 22:14:51
Copyright (c) 1991, 2004, Oracle. All rights reserved.
Starting tnslsnr: please wait...
TNSLSNR for 32-bit Windows: Version 10.1.0.2.0 - Production
System parameter file is C:\oracle\product\10.1.0\Db_1\network\admin\listener.ora
Log messages written to C:\oracle\product\10.1.0\Db_1\network\log\listener.log
Listening on: (DESCRIPTION=(ADDRESS=(PROTOCOL=tcp)(HOST=192.168.1.104)(PORT=1521)))
Connecting to (DESCRIPTION=(ADDRESS=(PROTOCOL=TCP)(HOST=192.168.1.104)(PORT=1521)))
STATUS of the LISTENER
------------------------
Alias LISTENER
Version TNSLSNR for 32-bit Windows: Version 10.1.0.2.0 - Production
Start Date 28-10月-2011 21:54:57
Uptime 0 days 0 hr. 0 min. 0 sec
Trace Level off
Security ON: Local OS Authentication
SNMP OFF
Listener Parameter File C:\oracle\product\10.1.0\Db_1\network\admin\listener.ora
Listener Log File C:\oracle\product\10.1.0\Db_1\network\log\listener.log
Listening Endpoints Summary...
(DESCRIPTION=(ADDRESS=(PROTOCOL=tcp)(HOST=192.168.1.104)(PORT=1521)))
Services Summary...
Service "ORCL" has 1 instance(s).
Instance "ORCL", status UNKNOWN, has 1 handler(s) for this service...
The command completed successfully
从这个实验已经很明显地看出动态注册和静态配置的区别了:动态注册机制不需要对监听器做任何额外配置,而结果却比静态注册更准确。静态配置机制需要针对每个数据库都做额外的配置,但是结果却不准确。
除此之外,在RAC环境中中,动态注册还包括每个实例的负载信息,这也是RAC能够实现负载均衡、故障转移的基础。
3、LSNRCTL命令
Oracle提供了一个叫做lsnrctl的工具来管理监听进程。我们刚刚演示了查看状态的方法,数据库的状态可以有3种。
READY:代表实例可以接受连接请求;
BLOCKED:实例目前不能接受连接请求;
UNKNOWN:这个条目是通过静态注册、而不是动态注册的。
Lsnrctl命令可以使用很多个参数,具体可通过help命令查看。
日常工作中最常用的选项包括start启动监听器,stop停止监听器,status报告监听器状态,reload重新加载listener.ora配置文件,不需重新启动监听器就使配置立即生效。
QUEUESIZE参数
如果监听器经常同时收到大量的连接请求,这时可以使用这个参数增大监听器的队伍长度,这个长度默认是5,见一下例子:
LISTENER =
(DESCRIPTION_LIST =
(DESCRIPTION =
(ADDRESS = (PROTOCOL = TCP)(HOST = 192.168.2.51)(PORT = 1521)(QUEUESIZE=20))
)
)
作者:czjie
出处:http://www.cnblogs.com/czjie/
本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。