Oracle监听器

运行于数据库服务器端一个进程, 用于监听所有来自客户端的连接请求,监听守候在服务器制定端口(默认为:1521),Windows/Linux运行进程列表中都会看到,Windows上名为TNSLSNR, Unix平台上是lsnrctl,如下图

监听器

1,每当收到一个用户请求,监听器进程就会创建一个影子进程;然后把用户请求转交给这个影子进程,由影子进程继续完成用户提交的各种命令。PS: 客户端进程是不允许直接操作数据库实例和数据,而是通过一个服务进程Server Process(也称为影子进程)作为代理。

2,一旦监听进程把用户转交给影子进程,监听进程的任务就算完成了,会继续去监听下一个用户请求,监听器配置文件listener.ora
listener.ora

本质上讲,listener是建立实例和客户端进程之间联系的桥梁。

Listener与实例之间的联系,就是通过注册的过程来实现的,注册的过程就是实例告诉监听器,它的数据库数据库实例名称instance_name和服务名service_names

如下图为网络环境下,远程客户端通过Oracle net与服务器端的监听守候进程通讯示意图
Oracle net

服务注册

我们把实例/数据库将所提供的服务名及相关信息告知listener的过程称之为服务注册,注册通常包括数据库的服务名、实例名、SERVER模式、端口号等。

Lsnrctl命令查看监听的运行情况和数据库的状态:
Lsnrctl

Ready:代表实例可以接受连接请求,是动态注册的监听;

Blocked:实例目前不能接受连接请求;

Unknown:静态注册的监听

图上结果显示,状态UNKOWN和READY的监听记录,它们分别是静态和动态注册的监听。

11g安装后默认的listener.ora配置文件,如下
配置文件

1, 动态注册

在instance启动的时候,由PMON进程根据init.ora中的instance_name、service_names两个参数将实例和服务动态注册到listener中。如果没有定义service_name,数据库会根据db_name和db_domain组成的一个全局数据库名成注册到监听器中,instance_name是实例名称,一般和SID值一样。

动态注册不必须显式的配置在listener.ora文件中,DBA还可以通过SQL语句—“alter system register;” 强制PMON向监听器动态注册。在Oracle 9i之后, 实例启动后会自动在本地主机默认的号端口上查找监听器,并进行注册。

2, 静态注册

将实例的相关信息手动告知listener, 数据库的相关信息配置到listener.ora中,也就是常说的Oracle数据库监听配置。在实例启动时就会读取listener.ora文件的配置。

PS:静态配置最大的问题就是监听器无法知道数据库真正的状态。关闭数据库后在查看监听会发现动态注册的自动消失了只有静态注册的在。
服务
lsnrctl状态

同时,通过查看listener.ora文件判断监听的注册方式,如果[监听名]SID_LIST_[监听名]配置是成对出现的,这代表是静态监听;如果listener.ora文件只有[监听名]的配置,监听就变成动态监听了,这时它需要由oracle数据库的pmon主动向监听注册,告知监听有这么一个服务的存在。

Oracle能够支持2中连接方式,分别是专有模式和共享模式,

1,专有模式为每个用户连接启动一个单独的影子进程,相当于为每个用户提供一个单独的到服务器的会话通道,其特点是响应客户端请求速度快,但PGA占用较多。

2,共享模式是由多个用户连接共享一个进程,多个用户共享一个会话通道

文章来源:Oracle入门精读11_监听原理

最后修改:2023 年 09 月 17 日
如果觉得我的文章对你有用,请随意赞赏