Oracle监听器相关知识(1)

本文大部分为转载。
原文作者1:realkid4,原文地址:链接
原文作者2:chyinzi,原文地址:链接

1,监听器的作用

Oracle监听器(listener)是一个重要的数据库服务器组件,在整个Oracle体系结构中,扮演着重要的作用。

监听器Lisener功能

从当前的Oracle版本看,Listener主要负责下面的几方面功能:

  1. 监听客户端请求
    监听器运行在数据库服务器之上,与Oracle实例(可为多个)相关关联,是一个专门的进程process,在Windows的服务项目或者Linux的运行进程列表中,都会看到对应的运行进程。
    Windows上进程名为TNSLSNR,Linux/Unix平台上是lsnrctl。
    监听器在服务器指定端口(默认端口1521)监听客户端的请求。

  2. 为客户端请求分配Server Process
    监听器只负责接听请求,之后将请求转接给Oracle Server Process。
    监听器接收到请求之后,就向操作系统(或者Dispatcher组件)要求Fork或分配一个Server Process与客户端相连。
    在Oracle的服务模式下,客户端进程是不允许直接操作数据库实例和数据,而是通过一个服务进程Server Process(也称为影子进程)作为代理。

  3. 注册实例服务
    本质上讲,Listener是建立实例和客户端进程之间联系的桥梁。Listener与实例之间的联系,就是通过注册的过程来实现的。注册的过程就是实例告诉监听器,它的数据库数据库实例名称instance_name和服务名service_names。
    在监听器注册好信息,就能根据客户端请求查找监听注册信息,找到正确的服务实例名称。
    目前Oracle版本中,提供动态注册和静态注册两种方式。

  4. 错误转移failover
    Failover是RAC容错的一个重要方面功能,其功能是在数据库实例崩溃的时候,可以自动将请求转移到其他可用实例上的一种功能。
    在这个过程中,发现实例已经崩溃,并且将请求转移到其他实例上,就属于Listener的功能。

  5. 负载均衡衡量
    在RAC架构中,Oracle实现了负载均衡。当一个客户请求到来时,Oracle会根据当前RAC集群环境中所有实例的负载情况,避开负载较高的实例,将请求转移到负载较低的实例进行处理。
    在早期RAC版本中,负载轻重的衡量是根据监听器当前维护连接数目来确定的,而不是实时查看多实例的负载。
    RAC环境中的监听器之间进行沟通通信。

2,监听器的动/静态注册

  • 静态注册,顾名思义,就是显式的指定监听器程序要为哪个数据库例程做监听,以及监听该例程时使用的服务名。
    静态注册情况下,监听程序不知道所监听例程服务是否存在。

  • 动态注册,是与静态注册相对应的一种注册方法,不需要指定instance_name和service_name,而是在数据库例程启动时,通过例程的后台进程PMON定期向监听器注册服务。
    动态注册情况下,监听程序知道例程服务的状态。


那么,如何区分数据库是动态注册还是静态注册呢?

  1. 使用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进程自动从参数文件获取)
  1. 使用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就是动态注册。

  1. 可以看到,在上面listener.ora的配置中,并没有ora11g的静态注册信息,而且在lsnrctl的status命令中,ora11g的状态为Ready。
  2. 通过Oracle自带的管理工具Net Manager能看到,在数据库服务中,仅注册了sales,并没有注册ora11g(见下图)


    Oracle监听器相关知识(1)_第1张图片
    net manager.jpg

你可能感兴趣的:(Oracle监听器相关知识(1))