Oracle监听器:动态注册
本文大部分为转载。
原文作者1:realkid4,原文:链接
原文作者2:chyinzi,原文:链接
1,动态注册
动态注册是Oracle上一个不能关闭的功能,注册的动作是监听器所在主机上数据库实例的后台进程PMON完成的。
实例的background process PMON,每隔一段时间(1~2分钟)就会将实例的参数信息注册到监听器上,实现动态注册。
注册的信息是数据库参数service_name和instance_name。可以通过Show Parameter命令查看。
SYS@sales>show parameter instance_name
NAME TYPE VALUE
------------------------------------ ---------------------- ------------------------------
instance_name string sales
SYS@sales>show parameter service_name
NAME TYPE VALUE
------------------------------------ ---------------------- ------------------------------
service_names string a,b
SYS@sales>show parameter domain
NAME TYPE VALUE
------------------------------------ ---------------------- ------------------------------
db_domain string
一般数据库在建立的时候,这两个参数都是已经设置好的,不会轻易的发生变化。
如果instance_name参数没有设置,则系统会选取参数db_name作为实例名称返回。如果service_names没有设置,则会将db_name和db_domain两个参数组合成服务名实现注册。
值得注意的一个问题是,service_names参数是一个可以指定多个服务名称的参数,以逗号分隔。也就是说,一个Oracle实例时可以同时作为多个服务名向外提供服务的。Service_name是Oracle在新近版本中提出,替代SID_NAME的概念。使用Service的指定方式,多个Oracle实例就可以统一提供一致的数据访问服务(也就是RAC)。
通常,对instance_name和service_name两个参数,还是建议设置上。因为会在一定程度上影响到动态注册的效果。
如果没有显示的指定这两个参数,那么只有在数据库实例启动在监听器实例之后的时候,才会一次动态注册。一旦之后监听器重新启动,动态注册的信息就不会存在,而且很难再次注册上。所以,我们是推荐将这两个参数设置上的。
只有显式设置两个值的情况下,PMON才会周期性的将注册信息加以注册。
此外,也可以通过register强制PMON立即执行一次注册操作。
SYS@sales>alter system register;
系统已更改。
最后,我们聊一聊动态注册的作用:支持错误转移failover。
注册操作的发动方是PMON后台进程,PMON是Oracle实例最重要的后台进程,很多资料和DBA都是以该进程的状态确定数据库实例的状态。PMON负责动态注册,如果不能进行动态注册,说明PMON已经失去了工作能力,也就意味着监听程序所服务的实例已经不能工作。
通过动态注册的机制,监听程序是可以知道所服务的服务器实例已经崩溃,对于客户端的请求,可以实现错误转移。
当然,这里谈到的崩溃是实例的崩溃。如果监听器程序崩溃了,情况又是另一种样子了。
2,动态注册的方式
2.1、缺省的动态注册
pmon在数据库启动到mount或open时,动态从参数文件中读取service_names值(service_names可以为多个值)。
service_names缺省为dbca建立数据库时的全局数据库名。
设置参数service_names为'a,b,c',命令如下:
alter system set service_names='a,b';
lsnrctl反馈状态如下:
服务 "Example_1" 包含 1 个实例。 实例 "sales", 状态 UNKNOWN, 包含此服务的 1 个处理程序... 服务 "a" 包含 1 个实例。 实例 "sales", 状态 READY, 包含此服务的 1 个处理程序... 服务 "b" 包含 1 个实例。 实例 "sales", 状态 READY, 包含此服务的 1 个处理程序... 服务 "sales" 包含 1 个实例。 实例 "sales", 状态 READY, 包含此服务的 1 个处理程序...
以上服务名a, b, 都为READY,为动态注册。
这里多了最后一条"sales",是PMON缺省动态注册到监听器内的。注意:不管参数service_names为何值,pmon都会自动以全局数据库名(这里为sales)为服务名,动态注册一个监听。
缺省情况下,若启用动态注册监听,端口号必须为1521。若启用其他端口的动态监听注册,必须要做相关配置。
通过查看vUSERS的连接为通过静态注册监听连接到服务器。
2.2、自定义端口的动态监听注册
若要启用非默认端口1521的动态监听注册,缺省状态,Oracle不会进行动态注册。要启用动态注册,必须设置local_listener参数。并在服务端配置tnsnames.ora指定监听参数,或者直接通过修改local_listener指定监听参数。步骤如下:
1)服务端
netmgr,配置监听程序,监听端口为1525(非默认端口)
image保存配置
2)、指定监听参数
(1)方法1:直接通过修改local_listener参数指定
SQL>alter system set LOCAL_LISTENER='(ADDRESS=(PROTOCOL=TCP)(HOST=192.168.1.23)(PORT=1525))';
System altered
SQL>alter system register
System altered
(2)方法2:
在Oracle服务器端建立$ORACLE_HOME/network/admin/tnsnames.ora。
解析文件,位置并填入如下内容
mytest =
(DESCRIPTION =
(ADDRESS_LIST =
(ADDRESS=(PROTOCOL=TCP)(HOST = 192.168.1.23)(PORT = 1525))
)
)
这里的mytest也可以根据自己需要,修改为其他字符串,如a或b等。
设置参数,指定通过tnsnames.ora内的信息指定监听参数
SQL>alter system set local_listener=mytest;
System altered
SQL>alter system register;
2.3、查看监听器状态
LSNRCTL> status
Connecting to (DESCRIPTION=(ADDRESS=(PROTOCOL=TCP)(HOST=192.168.1.23)(PORT=1525)))
STATUS of the LISTENER
------------------------
Alias LISTENER
Version TNSLSNR for Linux: Version 10.2.0.1.0 - Production
Start Date 15-MAR-2011 10:43:47
Uptime 0 days 0 hr. 0 min. 56 sec
Trace Level off
Security ON: Local OS Authentication
SNMP OFF
Listener Parameter File /orahome/oracle/product/10.2.0/db_1/network/admin/listener.ora
Listener Log File /orahome/oracle/product/10.2.0/db_1/network/log/listener.log
Listening Endpoints Summary...
(DESCRIPTION=(ADDRESS=(PROTOCOL=tcp)(HOST=oraserver)(PORT=1525)))
Services Summary...
Service "a" has 1 instance(s).
Instance "mydata", status READY, has 1 handler(s) for this service...
Service "b" has 1 instance(s).
Instance "mydata", status READY, has 1 handler(s) for this service...
Service "c" has 1 instance(s).
Instance "mydata", status READY, has 1 handler(s) for this service...
Service "mydata" has 1 instance(s).
Instance "mydata", status READY, has 1 handler(s) for this service...
Service "mydataXDB" has 1 instance(s).
Instance "mydata", status READY, has 1 handler(s) for this service...
Service "mydata_XPT" has 1 instance(s).
Instance "mydata", status READY, has 1 handler(s) for this service...
The command completed successfully