ORACLE监听理解
参考官方文档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参数了
配置监听可以通过netca图形配置,也可以命令配置
默认监听的名称LISTENER,配置如上,实际上没有这个listener.ora,默认listen也是可以正常运行的
那么下面增加一个在1522端口的非默认动态监听,名称叫listener2
首先netmgr图形添加一个监听
或者编辑listener.ora来添加监听也行
然后修改tnsnames.ora添加一个listener2的字符串,以便修改local_listener参数,(就是把监听中的那一段复制到tnsnames.ora中)
设置下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中配置多个地址的字符串
再设置alter system
set
local_listener=
'LISTENER2'
;
在共享服务器模式下,可以配置listener的一个参数叫做dispatchers,把这个分派器注册到一个非默认监听
ALTER SYSTEM SET DISPATCHERS=”(PROTOCOL=tcp)(LISTENER=lsnr2)”;
select service_id,name from v$active_services可以查出,前面2个服务是注册到监听的,后面2个是Oracle有两个内部的服务,SYS$BACKGROUND是后台进程使用的,SYS$USERS提供给没有指定服务的用户会话使用
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监听有个大概的了解
ORACLE监听理解的更多相关文章
- oracle监听理解 命名理解
一.监听器是oracle基于服务器端的一种网络服务,主要作用是监听客户端的连接请求,并将请求转发给服务器. 监听器基于端口的,每个监听器会占用一个端口.默认监听端口1521. oracle家目录下的n ...
- 修改Oracle监听端口
修改oracle监听端口 修改端口号的整体步骤:1.1 查看当前监听的状态1.2 停止监听1.3 修改监听文件的端口号1.4 修改初始化参数local_listener1.5 重启 ...
- 【转】oracle 监听静态注册举例解析
网上有很多关于oracle 监听静态注册的文章,但大多都是简单说说,并没有详细的例子,这里,将结合linux as3 下的oracle 10gR2.0.1 举一个具体的例子 1.在 $ORACLE_H ...
- linux 系统下开机自动启动oracle 监听和实例 (亲测有效)
[oracle@oracle11g ~]$ dbstartORACLE_HOME_LISTNER is not SET, unable to auto-start Oracle Net Listene ...
- LINUX启动ORACLE监听和服务
可通过secureCRT或者telnet直接连 启动监听命令:lsnrctl start 成功启动后:sqlplus /nolog 回车 conn / as sysdba 回车 startup 回车 ...
- 服务器重启后Oracle监听服务没有自动启动的解决方案
最近一直在被这样一个问题烦恼,就是服务器断电重启后,Oracle监听服务没有正常自动启动(监听服务已经设置为自启动). 具体是这样的,监听服务设置为开机自启动,Oracle数据库服务设置为开机延时启动 ...
- oracle监听(lsnrctl)详解解读
(总结)Oracle监听服务lsnrctl参数及查询状态详解 lsnrctl命令常用参数详解: lsnrctlstart启动指定的监听器 stop关闭指定的监听器 status显示监听器的状态.s ...
- Oracle监听启动时报TNS-00507问题
Linux系统中,启动oracle监听的时候报如下错误: [oracle@centos ~]$ lsnrctl start LSNRCTL :: Copyright (c) , , Oracle. A ...
- windows 启动关闭Oracle监听和服务
经常要用数据库,让他自己启动的话,开机太慢,所以用命令启动方便点. 1.开启: 在运行中输入cmd,进入控制台,lsnrctl start回车,提示启动监听成功后 net start O ...
随机推荐
- 海量数据MySQL项目实战
主要内容包含 MySQL 典型数据库架构介绍.MySQL 主流数据库架构对比等理论性知识,然后从“订单.用户”两个项目实战,抛砖引玉,介绍亿级互联网业务数据库项目如何设计. MySQL 典型数据库架构 ...
- jQuery的animate()方法做一个颜色的渐变
需求:在1秒内,由一个颜色变到另一个颜色,不是1秒后再变色. <!DOCTYPE html> <html lang="en"> <head> & ...
- linux帮助命令使用
一. help使用 查看ls命令的帮助信息 ls --help # 查看全部 ls --help | less # 分页查看, q退出 二. man手册 同一命令存在于多个章 ...
- Web协议详解与抓包实战:HTTP1协议-内容协商是怎样进行的(8)
一.内容协商的两种方式 每个 URI 指向的资源可以是任何事物,可以有多种不同的表述,例如一份文档可以有不同语言的翻译.不同的媒体格式.可以针对不同的浏览器提供不同的压缩编码等 二.Proactive ...
- [LeetCode] 415. Add Strings 字符串相加
Given two non-negative numbers num1 and num2 represented as string, return the sum of num1 and num2. ...
- [LeetCode] 14. Longest Common Prefix 最长共同前缀
Write a function to find the longest common prefix string amongst an array of strings. If there is n ...
- Salesforce - 建立轮循机制的潜在客户分配规则
客服中心经常会遇到由多个客服轮流分配接进来的订单,例如你有100个订单进入系统,你希望五个客服每人分配20个,也就是一种小组的轮换机制,常被称为“轮询” 这种循环分配规需要保证平均分配给客服新的订单记 ...
- JVM系列之七:HotSpot 虚拟机
1. 对象的创建 1. 遇到 new 指令时,首先检查这个指令的参数是否能在常量池中定位到一个类的符号引用,并且检查这个符号引用代表的类是否已经被加载.解析和初始化过.如果没有,执行相应的类加载. 2 ...
- .NET Core创建Worker Services
.NET CORE 3.0新增了Worker Services的新项目模板,可以编写长时间运行的后台服务,并且能轻松的部署成windows服务或linux守护程序.如果安装的vs2019是中文版本,W ...
- linux写shell注意的问题
linux写shell注意的问题一定要vi crontab.sh来写 ps:在windows系统中编辑过这个文件,就会出现类似的换行符 这样导致linux系统中运行sh报错 比如会出现$MQ字符 如果 ...