服务器端监听器配置

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))

)

)

posted on 2011-10-30 10:32  czjie  阅读(7554)  评论(0编辑  收藏  举报

导航