本文大部分为转载。
原文作者1:realkid4,原文地址:链接
原文作者2:chyinzi,原文地址:链接
1,lsnrctl的使用
监听器在Windows和Linux/Unix平台上,都可以直接操作。
下面将以Windows平台操作为例,Linux/Unix平台的操作类似。
在命令行窗口(CMD),输入lsnrctl,就可以进入监听器控制窗口。
C:\Documents and Settings\Administrator>lsnrctl
LSNRCTL for 32-bit Windows: Version 10.2.0.1.0 - Production on 26-12月-2010 21:53:04
Copyright (c) 1991, 2005, Oracle. All rights reserved.
欢迎来到LSNRCTL, 请键入"help"以获得信息。
LSNRCTL>
通过输入命令help,可以查看支持的监听器操作命令。下面介绍常用的几个。
a,status
功能:查看当前监听器状态
LSNRCTL> status
正在连接到 (DESCRIPTION=(ADDRESS=(PROTOCOL=IPC)(KEY=EXTPROC1521)))
//连接监听器的名称和信息:主机名+监听端口号
LISTENER 的 STATUS
------------------------
别名 LISTENER
版本 TNSLSNR for 32-bit Windows: Version 11.2.0.1.0 - Production
//Listener版本信息,在一台机器多实例的情况下,很重要!因为版本对应向下兼容
启动日期 08-11月-2017 13:47:21
正常运行时间 0 天 0 小时 4 分 32 秒
跟踪级别 off
安全性 ON: Local OS Authentication
//监听器一般有操作系统验证和密码验证两种安全验证方式。
//这里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)))
(DESCRIPTION=(ADDRESS=(PROTOCOL=tcp)(HOST=127.0.0.1)(PORT=1521)))
//监听器监听的服务器和端口信息
服务摘要..
服务 "CLRExtProc" 包含 1 个实例。
实例 "CLRExtProc", 状态 UNKNOWN, 包含此服务的 1 个处理程序...
服务 "Example_1" 包含 1 个实例。
实例 "sales", 状态 UNKNOWN, 包含此服务的 1 个处理程序...
服务 "a" 包含 1 个实例。
实例 "sales", 状态 READY, 包含此服务的 1 个处理程序...
服务 "b" 包含 1 个实例。
实例 "sales", 状态 READY, 包含此服务的 1 个处理程序...
服务 "ora11g" 包含 1 个实例。
实例 "ora11g", 状态 READY, 包含此服务的 1 个处理程序...
服务 "ora11gXDB" 包含 1 个实例。
实例 "ora11g", 状态 READY, 包含此服务的 1 个处理程序...
服务 "sales" 包含 1 个实例。
实例 "sales", 状态 READY, 包含此服务的 1 个处理程序...
服务 "salesXDB" 包含 1 个实例。
实例 "sales", 状态 READY, 包含此服务的 1 个处理程序...
//当前已经在监听器中注册的服务名称和实例名称
命令执行成功
b,start/stop
功能:开启/关闭监听器
监听器的行为受到参数文件listener.ora的控制。该文件是一个文本文件。
Oracle对于文本类型的参数文件,大多数情况下是不支持热加载的。例如数据库的Pfile和listener.ora都是如此。因此,当我们调整了监听器的参数,通常会先停止监听器,再开启监听器,这样监听器就会重新读取参数文件并按照新的参数运行。
调整监听参数的有两种途径,可以通过Oracle提供的GUI界面完成,也可以通过手工修改listener.ora来完成。
使用界面GUI,就是使用Net Configuration Assistant来配置。配置完成后,配置程序会自动重新启动监听器程序,来加载修改的参数文件。如果采用手工修改listener.ora,就必须要手工的进行监听程序关闭和启动。
使用GUI可以满足大部分的情况,而且可以避免拼写错误引发的监听器故障(监听器不会检查配置项目的正确与否)。但是,在一些比较复杂的情况下,比如一台机器绑定多个IP的情况,或者RAC的复杂功能配置上,还是更多使用手工编写listener.ora的方法。
start命令执行后,会自动运行一次status命令,命令执行结果如下
LSNRCTL> stop
正在连接到 (DESCRIPTION=(ADDRESS=(PROTOCOL=IPC)(KEY=EXTPROC1521)))
命令执行成功
LSNRCTL> start
启动tnslsnr: 请稍候...
TNSLSNR for 32-bit Windows: Version 11.2.0.1.0 - Production
系统参数文件为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)))
监听: (DESCRIPTION=(ADDRESS=(PROTOCOL=tcp)(HOST=127.0.0.1)(PORT=1521)))
正在连接到 (DESCRIPTION=(ADDRESS=(PROTOCOL=IPC)(KEY=EXTPROC1521)))
LISTENER 的 STATUS
------------------------
别名 LISTENER
版本 TNSLSNR for 32-bit Windows: Version 11.2.0.1.0 - Production
启动日期 09-11月-2017 10:55:31
正常运行时间 0 天 0 小时 0 分 3 秒
跟踪级别 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)))
(DESCRIPTION=(ADDRESS=(PROTOCOL=tcp)(HOST=127.0.0.1)(PORT=1521)))
服务摘要..
服务 "CLRExtProc" 包含 1 个实例。
实例 "CLRExtProc", 状态 UNKNOWN, 包含此服务的 1 个处理程序...
服务 "Example_1" 包含 1 个实例。
实例 "sales", 状态 UNKNOWN, 包含此服务的 1 个处理程序...
命令执行成功
c,reload
功能:重新加载配置文件,类似于重启监听器
lsnrctl提供了reload命令,可以在listener启动的情况下,重新加载参数文件和SID信息。
reload命令执行结果如下
LSNRCTL> reload
正在连接到 (DESCRIPTION=(ADDRESS=(PROTOCOL=IPC)(KEY=EXTPROC1521)))
命令执行成功
d,其他命令
通过help可以看到lsnrctl提供的其他功能命令
LSNRCTL> help
以下操作可用
星号 (*) 表示修改符或扩展命令:
start stop status
services version reload
save_config trace change_password
quit exit set*
show*
各个命令的功能简述如下:
start - Start the Oracle listener
stop - Stop the Oracle listener
status - Display the current status of the Oracle listener
services - Retrieve the listener services information
version - Display the oracle listener version information
reload - This will reload the oracle listener SID and parameter files. This is equivalent to lsnrctl stop and lsnrctl start.
save_config - This will save the current settings to the listener.ora file and also take a backup of the listener.ora file before overwriting it. If there are no changes, it will display the message “No changes to save for LISTENER”
trace - Enable the tracing at the listener level. The available options are ‘trace OFF’, ‘trace USER’, ‘trace ADMIN’ or ‘trace SUPPORT’
spawn - Spawns a new with the program with the spawn_alias mentioned in the listener.ora file
change_password - Set the new password to the oracle listener (or) change the existing listener password.
show - Display log files and other relevant listener information.
set选项
LSNRCTL> set
set之后提供了以下操作
星号 (*) 表示修改符或扩展命令:
password rawmode
displaymode trc_file
trc_directory trc_level
log_file log_directory
log_status current_listener
inbound_connect_timeout startup_waittime
save_config_on_stop dynamic_registration
enable_global_dynamic_endpoint
show选项
LSNRCTL> show
show之后提供了以下操作
星号 (*) 表示修改符或扩展命令:
rawmode displaymode
rules trc_file
trc_directory trc_level
log_file log_directory
log_status current_listener
inbound_connect_timeout startup_waittime
snmp_visible save_config_on_stop
dynamic_registration enable_global_dynamic_endpoint
oracle_home pid
2,监听器工作过程
一般监听器作为一个独立process在操作系统中运行,监听在特定网络端口(默认为:1521),等待客户端请求的到来。注意:我们在客户端配置命名服务的时候,输入的1521也就是为了与监听器程序建立连接。
当一个请求“如期而至”,监听器对照已经注册的服务列表,查找对应的数据库实例信息,获取到指定实例的ORACLE_HOME路径。相当于表明可以进行连接。
客户端与实例的交互不是直接的,是通过Server Process作为代理中介来实现的。所有指令SQL都是客户端通过Server Process发送到实例中,这种体系结构是Oracle对于实例和数据库文件一种保护机制。
当监听器获得请求之后,要从Oracle实例中分配一个Server Process与之对应。这里不同的Oracle连接方式存在一些差别。
如果是专用连接模式,也就是一个客户端连接对应一个Server Process。监听器就会向OS请求fork(创造)出一个Server Process,与监听器尝试交互。
如果是共享连接模式,也就是多个客户端共享一个Server Process(注意:这里还不是连接池)。监听器就会向Dispatcher进程(管理共享模式连接的进程)请求一个Server Process与之交互。
Server Process与监听器的连接,实际上就是相互信息的交换。Server Process将自身在OS中的进程编号、连接地址信息发给监听器。监听器将客户端信息传递给Server Process。
监听器获取到Server Process的信息之后,将其返回给客户端连接程序。客户端获取到信息之后,进行重连接,根据返回的信息与Server Process在制定的服务器端口进行联系。
直到这个时候,客户端程序才将连接用户名、密码等信息发给Server Process,进行登录验证等操作。监听器的工作也就到此结束。
这里面有一个技术细节,就是Server Process与客户端连接的时候,是允许不使用1521端口的。具体连接的端口,是带有随机因素的。在9i版本Windows平台下,如果安装了防火墙并设置只允许1521端口通信,会带来一些连接问题。好在在其他平台上和之后的版本中,实现了一种端口共享技术,连接可以和监听器一起使用1521端口。