本文大部分为转载。
原文作者1:realkid4,原文地址:链接
原文作者2:chyinzi,原文地址:链接
1,监听器的作用
Oracle监听器(listener)是一个重要的数据库服务器组件,在整个Oracle体系结构中,扮演着重要的作用。
监听器Lisener功能
从当前的Oracle版本看,Listener主要负责下面的几方面功能:
监听客户端请求
监听器运行在数据库服务器之上,与Oracle实例(可为多个)相关关联,是一个专门的进程process,在Windows的服务项目或者Linux的运行进程列表中,都会看到对应的运行进程。
Windows上进程名为TNSLSNR,Linux/Unix平台上是lsnrctl。
监听器在服务器指定端口(默认端口1521)监听客户端的请求。为客户端请求分配Server Process
监听器只负责接听请求,之后将请求转接给Oracle Server Process。
监听器接收到请求之后,就向操作系统(或者Dispatcher组件)要求Fork或分配一个Server Process与客户端相连。
在Oracle的服务模式下,客户端进程是不允许直接操作数据库实例和数据,而是通过一个服务进程Server Process(也称为影子进程)作为代理。注册实例服务
本质上讲,Listener是建立实例和客户端进程之间联系的桥梁。Listener与实例之间的联系,就是通过注册的过程来实现的。注册的过程就是实例告诉监听器,它的数据库数据库实例名称instance_name和服务名service_names。
在监听器注册好信息,就能根据客户端请求查找监听注册信息,找到正确的服务实例名称。
目前Oracle版本中,提供动态注册和静态注册两种方式。错误转移failover
Failover是RAC容错的一个重要方面功能,其功能是在数据库实例崩溃的时候,可以自动将请求转移到其他可用实例上的一种功能。
在这个过程中,发现实例已经崩溃,并且将请求转移到其他实例上,就属于Listener的功能。负载均衡衡量
在RAC架构中,Oracle实现了负载均衡。当一个客户请求到来时,Oracle会根据当前RAC集群环境中所有实例的负载情况,避开负载较高的实例,将请求转移到负载较低的实例进行处理。
在早期RAC版本中,负载轻重的衡量是根据监听器当前维护连接数目来确定的,而不是实时查看多实例的负载。
RAC环境中的监听器之间进行沟通通信。
2,监听器的动/静态注册
静态注册,顾名思义,就是显式的指定监听器程序要为哪个数据库例程做监听,以及监听该例程时使用的服务名。
静态注册情况下,监听程序不知道所监听例程服务是否存在。动态注册,是与静态注册相对应的一种注册方法,不需要指定instance_name和service_name,而是在数据库例程启动时,通过例程的后台进程PMON定期向监听器注册服务。
动态注册情况下,监听程序知道例程服务的状态。
那么,如何区分数据库是动态注册还是静态注册呢?
- 使用lsnrctl的status命令
在运行lsnrctl的status命令时,会看到如下返回值:
LSNRCTL> status
正在连接到 (DESCRIPTION=(ADDRESS=(PROTOCOL=IPC)(KEY=EXTPROC1521)))
LISTENER 的 STATUS
------------------------
别名 LISTENER
版本 TNSLSNR for 32-bit Windows: Version 11.2.0.1.0 - Production
启动日期 07-11月-2017 13:24:32
正常运行时间 0 天 0 小时 51 分 31 秒
跟踪级别 off
安全性 ON: Local OS Authentication
SNMP OFF
监听程序参数文件 C:\app\Administrator\product\11.2.0\dbhome_1\network\admin\listener.ora
监听程序日志文件 c:\app\administrator\diag\tnslsnr\class11g\listener\alert\log.xml
监听端点概要...
(DESCRIPTION=(ADDRESS=(PROTOCOL=ipc)(PIPENAME=\\.\pipe\EXTPROC1521ipc)))
(DESCRIPTION=(ADDRESS=(PROTOCOL=tcp)(HOST=class11g)(PORT=1521)))
服务摘要..
……
服务 "ora11g" 包含 1 个实例。
实例 "ora11g", 状态 READY, 包含此服务的 1 个处理程序...
服务 "sales" 包含 1 个实例。
实例 "sales", 状态 READY, 包含此服务的 1 个处理程序...
……
命令执行成功
根据返回状态可以判断数据库的注册方式
- 状态UNKOWN即表明为静态注册(手动填写参数)
- 状态为READY的记录,表明为动态注册(listener.ora参数由PMON进程自动从参数文件获取)
- 使用Oracle自带的图形化管理工具Net Manager
静态注册
监听配置中,数据库服务中的全局数据库名,可以写任意内容,与数据库无关,只要保证SID正确即可连上数据库。
由于静态注册,参数是手动静态添加,与数据库无关。数据库无法确认监听是否正确配置。因此,lsnrctl中的status显示状态为unkown。即不保证能连通数据库。
注意:静态注册监听,客户端在配置tnsnames.ora服务命名时,“(Oracle 8i或更高版本)服务名”里填写内容要与服务端静态注册监听器时的全局数据库名(即GLOBAL_DBNAME)一致。否则,无法连通。
配置静态监听前,lsnrctl中status显示如下
服务摘要..
……
服务 "ora11g" 包含 1 个实例。
实例 "ora11g", 状态 READY, 包含此服务的 1 个处理程序...
服务 "sales" 包含 1 个实例。
实例 "sales", 状态 READY, 包含此服务的 1 个处理程序...
……
对配置文件listener.ora修改如下
SID_LIST_LISTENER =
(SID_LIST =
……
(SID_DESC =
(GLOBAL_DBNAME = Example_1)
(ORACLE_HOME = C:\app\Administrator\product\11.2.0\dbhome_1)
(SID_NAME = sales)
)
)
其中,Example_1是监听配置时,数据库服务中的“全局数据库名”的值(即配置文件中GLOBAL_DBNAME的值),“sales”是监听配置中,数据库服务中SID读到的值(即SID_NAME的值)。
同时,客户端需要正确配置tnsname.ora文件,服务名(SERVICE_NAME)需要与服务器配置中的GLOBAL_DBNAME一致,例如上文的Example_1。否则,将连接不到数据库。
客户端tnsname.ora文件中相应的配置见下方
Example_1 =
(DESCRIPTION =
(ADDRESS = (PROTOCOL = TCP)(HOST = class11g)(PORT = 1521))
(CONNECT_DATA =
(SERVER = DEDICATED)
(SERVICE_NAME = sales)
)
)
ORA11G =
(DESCRIPTION =
(ADDRESS = (PROTOCOL = TCP)(HOST = class11g)(PORT = 1521))
(CONNECT_DATA =
(SERVER = DEDICATED)
(SERVICE_NAME = ora11g)
)
)
这里的Example_1,为服务名,可以设置为任意值,只要在客户端连接服务器时。
此时,服务器端使用lsnrctl的status命令,显示如下
服务 "Example_1" 包含 1 个实例。
实例 "sales", 状态 UNKNOWN, 包含此服务的 1 个处理程序...
服务 "ora11g" 包含 1 个实例。
实例 "ora11g", 状态 READY, 包含此服务的 1 个处理程序...
在客户端使用sqlplus登录,成功,显示如下
C:\Documents and Settings\Administrator>sqlplus scott/tiger@example_1
SQL*Plus: Release 11.2.0.1.0 Production on 星期二 11月 7 17:43:54 2017
Copyright (c) 1982, 2010, Oracle. All rights reserved.
连接到:
Oracle Database 11g Enterprise Edition Release 11.2.0.1.0 - Production
With the Partitioning, OLAP, Data Mining and Real Application Testing options
SCOTT@example_1>
动态注册
仍然使用上面的例子。
可以注意到,在Example_1例程之外,还有一个数据库服务ora11g并没有在监听器配置文件中设置,但可以如Example_1一样正常使用。
再看一下上面服务器端使用lsnrctl的status命令,显示如下
服务 "Example_1" 包含 1 个实例。
实例 "sales", 状态 UNKNOWN, 包含此服务的 1 个处理程序...
服务 "ora11g" 包含 1 个实例。
实例 "ora11g", 状态 READY, 包含此服务的 1 个处理程序...
再次展示listener.ora的配置相关部分如下
SID_LIST_LISTENER =
(SID_LIST =
……
(SID_DESC =
(GLOBAL_DBNAME = Example_1)
(ORACLE_HOME = C:\app\Administrator\product\11.2.0\dbhome_1)
(SID_NAME = sales)
)
)
在客户端使用sqlplus登录,成功,显示如下
C:\Documents and Settings\Administrator>sqlplus scott/tiger@ora11g
SQL*Plus: Release 11.2.0.1.0 Production on 星期二 11月 7 17:59:20 2017
Copyright (c) 1982, 2010, Oracle. All rights reserved.
连接到:
Oracle Database 11g Enterprise Edition Release 11.2.0.1.0 - Production
With the Partitioning, OLAP, Data Mining and Real Application Testing options
SCOTT@ora11g>
可见,这里的ora11g就是动态注册。
- 可以看到,在上面listener.ora的配置中,并没有ora11g的静态注册信息,而且在lsnrctl的status命令中,ora11g的状态为Ready。
-
通过Oracle自带的管理工具Net Manager能看到,在数据库服务中,仅注册了sales,并没有注册ora11g(见下图)