欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

ORACLE监听理解

程序员文章站 2022-12-22 12:30:50
参考官方文档Net Services Reference的7 Oracle Net Listener Parameters (listener.ora)1 监听概念oracle监听,是个服务器端进程,负责监听客户端发来的请求监听器可以不必驻留在数据库主机上,即可以把实例注册到远程主机上的监听监听是o... ......

参考官方文档net services reference的7 oracle net listener parameters (listener.ora)

1 监听概念

oracle监听,是个服务器端进程,负责监听客户端发来的请求

监听器可以不必驻留在数据库主机上,即可以把实例注册到远程主机上的监听

监听是oracle自带的软件或者说组件

本地连接可以不用监听,但是远程连接必须要


oracle监听收到user process发出的request后,派生出server process来提供服务,server进程根据数据库的配置有2种模式:专有模式和共享模式

  专有模式:每个客户端进程都有单独的server进程来建立session提供服务,绝大部分超过99%的数据库都是这种模式

  共享模式:有个分配器叫dispatch,监听把请求放入请求队列中,dispatch会不停的查询请求队列,当发现有请求时候就把请求转给server进程,再通过server进程提供服务,处理完后反馈给响应队列,dispatch再把响应队列中的转发给用户进程。类似与饭馆吃饭,server进程相当于厨师,dispatch相当于服务员,服务员接受请求并转发给相应的空闲厨师提供服务,厨师做好的菜放在哪儿,服务员再端给客户;这种模式用的不多


dbca建库后一般会有默认监听,不用再配置,监听的服务端口默认1521

一般的库一个监听就够了,但是并发量太大的话可能需要配置多个监听,非默认监听的端口号大于1024即可,不同监听之间服务名和端口号不能一样

监听如何区别不同的库呢,所以需要把实例进行服务注册,注册到listen中,

注册就是将主机上跑的实例添加到listen里,让listen知道主机上有哪些实例

2 配置方法

2.1 动态注册

服务注册有2种,一种是动态注册,是通过pmon进程主动的自动的把实例注册到listen中

监听和实例的启动顺序,当监听先启动,没问题,如果监听后启动,那么可以手工alter system register注册下,或者不用管,pmon会隔一段时间就去注册下

一般默认监听是动态注册

不需要listener.ora文件

服务状态中有status ready(库在mount或者open状态)字样

pmon给监听提供实例名、服务名、服务处理程序的类型和地址

注册的服务名叫 db_name.db_domain,db_namexdb.db_domain

如果要pmon注册到非默认监听,就要配置local_listener参数了

ORACLE监听理解


配置监听可以通过netca图形配置,也可以命令配置

ORACLE监听理解默认监听的名称listener,配置如上,实际上没有这个listener.ora,默认listen也是可以正常运行的


那么下面增加一个在1522端口的非默认动态监听,名称叫listener2

首先netmgr图形添加一个监听

ORACLE监听理解

或者编辑listener.ora来添加监听也行

ORACLE监听理解

然后修改tnsnames.ora添加一个listener2的字符串,以便修改local_listener参数,(就是把监听中的那一段复制到tnsnames.ora中)

ORACLE监听理解设置下local_listener参数并手工注册下即可,

[oracle@study admin]$ sql

sql*plus: release 11.2.0.1.0 production on thu sep 19 17:07:41 2019

copyright (c) 1982, 2009, oracle.  all rights reserved.


connected to:
oracle database 11g enterprise edition release 11.2.0.1.0 - 64bit production
with the partitioning, olap, data mining and real application testing options

17:07:42 sys@study> show parameter local_list

name                                 type        value
------------------------------------ ----------- ------------------------------
local_listener                       string
17:08:19 sys@study> alter system set local_listener='listener2';

system altered.

elapsed: 00:00:00.04
17:09:03 sys@study> alter system register;

system altered.

elapsed: 00:00:00.00
17:09:21 sys@study> disconnected from oracle database 11g enterprise edition release 11.2.0.1.0 - 64bit production
with the partitioning, olap, data mining and real application testing options
[oracle@study admin]$ lsnrctl status listener2

lsnrctl for linux: version 11.2.0.1.0 - production on 19-sep-2019 17:10:22

copyright (c) 1991, 2009, oracle.  all rights reserved.

connecting to (description=(address=(protocol=tcp)(host=study.localdomain)(port=1522)))
status of the listener
------------------------
alias                     listener2
version                   tnslsnr for linux: version 11.2.0.1.0 - production
start date                19-sep-2019 16:38:16
uptime                    0 days 0 hr. 32 min. 6 sec
trace level               off
security                  on: local os authentication
snmp                      off
listener parameter file   /u01/app/oracle/product/11.2.0/dbhome_1/network/admin/listener.ora
listener log file         /u01/app/oracle/diag/tnslsnr/study/listener2/alert/log.xml
listening endpoints summary...
  (description=(address=(protocol=tcp)(host=study.localdomain)(port=1522)))
services summary...
service "study" has 1 instance(s).
  instance "study", status ready, has 1 handler(s) for this service...
service "studyxdb" has 1 instance(s).
  instance "study", status ready, has 1 handler(s) for this service...
the command completed successfully
[oracle@study admin]$ 

不过这样的话默认,pmon就不会往默认监听中注册了,也就是从1521访问不到了,如果要1521 1522同时提供服务,可以删除默认监听,配置改为

listener2 =
  (description =
    (address = (protocol = tcp)(host = study.localdomain)(port = 1522))
    (address = (protocol = tcp)(host = study.localdomain)(port = 1521))
  )

由于动态监听依赖于pmon,删除监听配置文件,默认监听依然有效,监听依旧监听localhost:1521,local_listener这个参数控制实例将自身动态注册到哪儿,local_listener 这个参数的默认值是(address = (protocol=tcp)(host=hostname)(port=1521)),pmon依旧主动注册实例到监听,dbca建库后默认就是这样的注册方式

看的出来动态监听要求监听和local_listener参数配置是一致的,都是缺省的空的配置即默认监听,非默认就显示配置这两个地方即可

tnsnames

.ora在动态监听中不是必须的,只是为了配置个本地的字符串方便local_listener的配置命令而已,直接配置如下形式也ok

alter system set local_listener='(address=(protocol=tcp)(host=study.localdomain)(port=1521))';      

等同于alter system set local_listener='';

配置注册到多个监听,可以如下

alter system set local_listener='(address=(protocol=tcp)(host=study.localdomain)(port=1521))','(address=(protocol=tcp)(host=study.localdomain)(port=1522))';

或者先在tnsnames.ora中配置多个地址的字符串

ORACLE监听理解

再设置alter system set local_listener='listener2';


在共享服务器模式下,可以配置listener的一个参数叫做dispatchers,把这个分派器注册到一个非默认监听

alter system set dispatchers=”(protocol=tcp)(listener=lsnr2)”;


ORACLE监听理解

select service_id,name from v$active_services可以查出,前面2个服务是注册到监听的,后面2个是oracle有两个内部的服务,sys$background是后台进程使用的,sys$users提供给没有指定服务的用户会话使用


ORACLE监听理解service_names是服务名,如果为空,会把db_name.db_domain 注册到监听

2.2  静态注册

另一种是静态注册,服务的状态一般是status unknown字样,静态注册是监听程序根据配置文件listener.ora里面的配置去监听指定的地址端口和实例,是oem和其他服务所需要的

静态注册不是实例主动去监听处注册,而是监听自己管理一个端口和服务的列表,监听根据这个列表来将请求转发到具体的实例

比如如下配置

listener2 =
  (description =
    (address = (protocol = tcp)(host = study.localdomain)(port = 1522))
  )

sid_list_listener2=
  (sid_list=
    (sid_desc=
      (global_dbname=study)
      (oracle_home=/u01/app/oracle/product/11.2.0/dbhome_1)
      (sid_name=study)
    )
  )
adr_base_listener2 = /u01/app/oracle

global_dbname即服务名,看service_names参数即可,如果为空,就是db_name.db_domain,或者先动态注册看一下服务名

sid_name需要大写,否则安装em会有影响,如果不确定也可以先动态注册观察下

注意命名格式是listener_name 和 sid_list_listener_name


当数据库关闭的时候,静态注册的监听依旧可以连接,动态监听就不行了,所以远程启动数据库这样的操作就一定需要静态监听


[oracle@study admin]$ sqlplus sys/oracle@10.0.0.10:1521/study as sysdba 

sql*plus: release 11.2.0.1.0 production on fri sep 20 10:59:06 2019

copyright (c) 1982, 2009, oracle.  all rights reserved.

error:
ora-12514: tns:listener does not currently know of service requested in connect
descriptor


enter user-name: ^c
[oracle@study admin]$ sqlplus sys/oracle@10.0.0.10:1522/study as sysdba

sql*plus: release 11.2.0.1.0 production on fri sep 20 10:59:15 2019

copyright (c) 1982, 2009, oracle.  all rights reserved.

connected to an idle instance.

10:59:15 sys@10.0.0.10:1522/study> startup
oracle instance started.

total system global area 1536602112 bytes
fixed size                  2213616 bytes
variable size             922749200 bytes
database buffers          603979776 bytes
redo buffers                7659520 bytes
database mounted.
database opened.
10:59:25 sys@10.0.0.10:1522/study> 

好了,对oracle监听有个大概的了解