首页 > 数据库 > Oracle > 动态和静态监听注册-小鱼的理解
关于网络上的动态和静态监听注册,自己也是迷糊的,如果判断动态和静态相信大家都清楚,监听程序自己也一直是停留在能用就行的地步,对于其中的原理也很难以理解透彻。
结合自己的测试谈谈自己的理解:
注册:其实可以简单的理解为把数据库的服务注册到监听程序中,因为客户端连接数据库需要通过定位主机,然后查看主机的监听程序上的端口上面是否存在数据库服务,然后核对用户名和密码,这个才是一次完整连接所要经历的步奏。
那么注册正是把服务注册到监听程序中,让其可以通过监听程序去对客户端和服务器端做一个相对中介的事情,而如果不注册监听程序中没有所谓的数据库服务,客户端也无法去定位连接。
静态监听:也就是实例启动时通过listener.ora文件把相应的数据库实例和服务注册到监听程序中,监听如果重启也会去listen.ora文件的信息.
[oracle@localhost admin]$ less listener.ora
#listener.ora Network Configuration File:
/db/oracle10g/product/10.2.0/db/network/admin/listener.ora
# Generated by Oracle configuration tools.
SID_LIST_LISTENER =
(SID_LIST =
(SID_DESC =
(SID_NAME =
PLSExtProc)
(ORACLE_HOME =
/u01/app/oracle/10.2.0/db_1)
(PROGRAM =
extproc)
)
(SID_DESC =
(GLOBAL_DBNAME
= benguo)
(ORACLE_HOME = /u01/app/oracle/10.2.0/db_1)
(SID_NAME =
benguo)
)
)
# 下面的sid_desc这一段表示把静态监听程序已经把数据库服务注册到监听程序中去了,而且是静态注册。
LISTENER =
(DESCRIPTION_LIST =
(DESCRIPTION =
(ADDRESS =
(PROTOCOL = IPC)(KEY = EXTPROC1))
(ADDRESS =
(PROTOCOL = TCP)(HOST = 0.0.0.0)(PORT = 1521))
)
)
上述是公司同事配置的listener.ora文件
[oracle@localhost admin]$ lsnrctl status
……
Service "benguo" has 2 instance(s).
Instance
"benguo", status UNKNOWN, has 1 handler(s) for this service...
Instance
"benguo", status READY, has 1 handler(s) for this service...
…….
通过上述的Service "benguo" has 2 instance(s).其中的一个是unknown表示有个静态监听已经被注册了,观察上面listener.ora文件,发现了正是手动添加listener.ora文件中的最后的sid_destyi引起的静态注册,如果删除最后的一段后如下形式:(静态监听的注册已经消失,全部是read的动态监听注册)
listener.ora Network Configuration File:
/db/oracle10g/product/10.2.0/db/network/admin/listener.ora
# Generated by Oracle configuration tools.
SID_LIST_LISTENER =
(SID_LIST =
(SID_DESC =
(SID_NAME =
PLSExtProc)
(ORACLE_HOME =
/u01/app/oracle/10.2.0/db_1)
(PROGRAM =
extproc)
)
)
LISTENER =
(DESCRIPTION_LIST =
(DESCRIPTION =
(ADDRESS =
(PROTOCOL = IPC)(KEY = EXTPROC1))
(ADDRESS =
(PROTOCOL = TCP)(HOST = 0.0.0.0)(PORT = 1521))
)
)
————修改listener.ora文件手动register让pmon迅速动态注册服务到监听程序中,然后查看status
[oracle@localhost admin]$ lsnrctl status
…
Service "benguo" has 1 instance(s).
Instance
"benguo", status READY, has 1 handler(s) for this service.
动态监听:也就是实例启动时pmon进程把数据库服务信息直接注册到监听程序中(pmon会读取初始化参数文件的services_name和instance_name注册到监听程序中),默认的不予以配置netca下就启用了默认的监听程序,当然netca配置也是可以完成动态监听注册的,而要分析是动态监听下,如果监听程序在实例启动后再启动,由于pmon的信息的不是即时注册的,或者说监听在实例正常在线时重启过,那么监听会丢失数据库的服务信息,可能就会出现下面的测试的例子:
[oracle@localhost admin]$ lsnrctl status
LSNRCTL for Linux: Version 10.2.0.4.0 - Production on
18-JUL-2012 21:54:26
Copyright (c) 1991, 2007, Oracle. All rights reserved.
Connecting to (ADDRESS=(PROTOCOL=tcp)(HOST=)(PORT=1521))
STATUS of the LISTENER
------------------------
Alias
LISTENER
Version TNSLSNR for Linux: Version
10.2.0.4.0 - Production
Start Date
18-JUL-2012 21:39:49
Uptime
0 days 0 hr. 14 min. 37 sec
Trace Level
off
Security
ON: Local OS Authentication
SNMP ON
Listener Parameter File
/usr/oracle/10.2/network/admin/listener.ora
Listener Log File
/usr/oracle/10.2/network/log/listener.log
Listening Endpoints Summary...
(DESCRIPTION=(ADDRESS=(PROTOCOL=tcp)(HOST=localhost.localdomain)(PORT=1521)))
Services Summary...
Service "JHQL" has 1 instance(s).
Instance
"JHQL", status READY, has 1 handler(s) for this service...
Service "jhqlXDB" has 1 instance(s).
Instance
"JHQL", status READY, has 1 handler(s) for this service...
Service "jhql_XPT" has 1 instance(s).
Instance
"JHQL", status READY, has 1 handler(s) for this service...
The command completed successfully --可以看出都是动态注册的
[oracle@localhost admin]$ lsnrctl stop
LSNRCTL for Linux: Version 10.2.0.4.0 - Production on
18-JUL-2012 21:54:32
Copyright (c) 1991, 2007, Oracle. All rights reserved.
Connecting to (ADDRESS=(PROTOCOL=tcp)(HOST=)(PORT=1521))
The command completed successfully
[oracle@localhost admin]$ lsnrctl start
LSNRCTL for Linux: Version 10.2.0.4.0 - Production on 18-JUL-2012
21:54:40
Copyright (c) 1991, 2007, Oracle. All rights reserved.
Starting /usr/oracle/10.2/bin/tnslsnr: please wait...
TNSLSNR for Linux: Version 10.2.0.4.0 - Production
System parameter file is
/usr/oracle/10.2/network/admin/listener.ora
Log messages written to
/usr/oracle/10.2/network/log/listener.log
Listening on:
(DESCRIPTION=(ADDRESS=(PROTOCOL=tcp)(HOST=localhost.localdomain)(PORT=1521)))
Connecting to (ADDRESS=(PROTOCOL=tcp)(HOST=)(PORT=1521))
STATUS of the LISTENER
------------------------
Alias
LISTENER
Version
TNSLSNR for Linux: Version 10.2.0.4.0 - Production
Start Date
18-JUL-2012 21:54:40
Uptime
0 days 0 hr. 0 min. 0 sec
Trace Level
off
Security
ON: Local OS Authentication
SNMP
ON
Listener Parameter File
/usr/oracle/10.2/network/admin/listener.ora
Listener Log File
/usr/oracle/10.2/network/log/listener.log
Listening Endpoints Summary...
(DESCRIPTION=(ADDRESS=(PROTOCOL=tcp)(HOST=localhost.localdomain)(PORT=1521)))
The listener supports no services
The command completed successfully
--重启监听后并pmon并不会马上去注册服务到监听程序中
不过这里可以采取alter system
register手动注册信息到监听程序中,而监听程序马上就能提供数据库服务了
[oracle@localhost admin]$ lsnrctl status
LSNRCTL for Linux: Version 10.2.0.4.0 - Production on
18-JUL-2012 21:54:45
Copyright (c) 1991, 2007, Oracle. All rights reserved.
Connecting to (ADDRESS=(PROTOCOL=tcp)(HOST=)(PORT=1521))
STATUS of the LISTENER
------------------------
Alias
LISTENER
Version
TNSLSNR for Linux: Version 10.2.0.4.0 - Production
Start Date
18-JUL-2012 21:54:40
Uptime
0 days 0 hr. 0 min. 4 sec
Trace Level
off
Security ON: Local OS Authentication
SNMP
ON
Listener Parameter File
/usr/oracle/10.2/network/admin/listener.ora
Listener Log File
/usr/oracle/10.2/network/log/listener.log
Listening Endpoints Summary...
(DESCRIPTION=(ADDRESS=(PROTOCOL=tcp)(HOST=localhost.localdomain)(PORT=1521)))
The listener supports no services
The command completed successfully
--过一段时间后服务已经被注册到监听程序中。
而如果此时监听程序正常启动,服务也被注册到监听程序中,如果关闭数据库然后重启,这个时候pmon进程在instance启动后就会马上把实例的服务注册到监听中,这个过程没有延迟。这里就不列出测试的例子了,大家可以自己查看下!
静态监听表明监听程序不知道实例的运行情况,只有客户发出连接时才会去检查实例是否还在运行,这个也跟静态监听程序unknown字面意思相符,而动态监听不管何时关闭数据库,都会在监听中注销这个服务,而启动时数据库pmon也会马上注册服务到监听中。Pmon还会定期的收集系统的负载到监听中,最能体现的就是rac的负载均衡。
关于监听自己也是反复理解,反复查看资源结合自己实践得出的,大家可以参考下,重要还是自己测试、理解!
[@more@]
来自 “ ITPUB博客 ” ,链接:https://blog.itpub.net/25362835/viewspace-1058846/ ,如需转载,请注明出处,否则将追究法律责任。