首先声明,我是一个菜鸟。一下文章中出现技术误导情况盖不负责
在lsnrctl命令的status时,常会看到如下返回值:
Service "elvis" has 2 instance(s). Instance "elvis", statusUNKNOWN, has 1 handler(s) for this service... Instance "elvis", statusREADY, has 1 handler(s) for this service...Service "elvisXDB" has 1 instance(s). Instance "elvis", statusREADY, has 1 handler(s) for this service...The command completed successfully
这里的,状态UNKOWN即表明为静态注册(手动填写参数);
状态为READY的记载,表明为动态注册(listener.ora参数由PMON进程自动从参数文件获取);你可能会奇异,可能我这个与你的有点不同,elvis下面有两个实例,原因是elvis是我的实例名,系统自带了一个,而服务名默许的话是与数据库名分歧(如果没有域名的话),可能对于实例名,域名,服务名有点绕,这个观点可以看我的另一篇帖子:
而unknown那个是我手动创建的监听(静态监听),而创建的我也用了elvis,也就是与系统的重复了,所以合并到了一同,如果你手动创建一般的名字,比如a(在创建监听的时候指定的全局数据库名,这个可以随意起,SID一定要保持分歧啦!!!),那就会如下:
Service "a" has 2 instance(s). Instance "elvis", statusUNKNOWN, has 1 handler(s) for this service... Instance "elvis", statusREADY, has 1 handler(s) for this service...Service "elvisXDB" has 1 instance(s). Instance "elvis", statusREADY, has 1 handler(s) for this service...The command completed successfully
1 认识下注册
注册就是将数据库作为一个服务注册到监听程序。客户端不需要知道数据库名和实例名,只需要知道该数据库对外提供的服务名就能够申请连接到数据库。这个服务名可能与实例名一样,也有可能不一样。
在数据库服务器启动过程中,数据库服务器会向监听程序注册响应的服务(无论何时启动一个数据库,默许地都有两条信息注册到监听器中:数据库服务器对应的实例和服务。)
相当于是这样:在数据库服务器和客户端之间有一监听程序(Listener),在监听程序中,会记载响应数据库对应的服务名(一个数据库可能对应有多个服务名),当客户端需要连接数据库时,只需要提供服务名,就能够建立客户端和服务器之间的连接。
2 静态监听
监听配置中,数据库服务中的全局数据库名,可以写恣意内容,与数据库无关,只要保障SID正确便可连上数据库。
由于静态注册,参数是手动静态添加,与数据库无关。数据库无法确认监听是不是正确配置。因此,lsnrctl中的status表现状态为unkown。即不保障能连通数据库。
注意:静态注册监听,客户端在配置tnsnames.ora服务命名时,“(Oracle 8i或更高版本)服务名”里填写内容要与服务端静态注册监听器时的全局数据库名分歧。否则,无法连通。
lsnrctl中表现如下:
Service"a" has 1 instance(s). Instance "elvis", status UNKNOWN,has 1 handler(s) for this service...
elvis即从监听配置过程,数据库服务中的“全局数据库名”读到的值(即配置文件中GLOBAL_DBNAME的值),“elvis”是从监听配置中,数据库服务中的SID读到的值(SID_NAME的值)
SID_LIST_LISTENER = (SID_LIST = (SID_DESC = (GLOBAL_DBNAME = elvis) (ORACLE_HOME =/u01/oracle/product/11.2.0/dbhome_1) (SID_NAME = elvis) ) )
客户端在配置tnsname时,服务名(SERVICE_NAME)即为test。否则,连接不到数据库。
ABC = (DESCRIPTION = (ADDRESS_LIST = (ADDRESS = (PROTOCOL = TCP)(HOST =192.168.201.128)(PORT = 1521)) ) (CONNECT_DATA = (SERVICE_NAME = elvis) ) )
这里的ABC,为服务命名。可认为恣意值,在客户端连接服务器时,填写的主机字符串,即为此服务名ABC。
3 动态注册
3.1 缺省的动态注册
pmon在数据库启动到mount或open时,动态从参数文件中读取service_names值。service_names可认为多值(可以有64个,其中包括两个系统的)。
service_names缺省为建立数据库时的全局数据库名。
设置参数service_names为’b,c,d’,命令如下:
alter system set service_names=b,c,d;
lsnrctl状态如下:
Service "B" has 1 instance(s). Instance "elvis", status READY, has1 handler(s) for this service...Service "C" has1 instance(s). Instance "elvis", status READY, has1 handler(s) for this service...Service "D" has1 instance(s). Instance "elvis", status READY, has1 handler(s) for this service...Service "a" has1 instance(s). Instance "elvis", status UNKNOWN,has 1 handler(s) for this service...Service "elvis"has 1 instance(s). Instance "elvis", status READY, has1 handler(s) for this service...Service"elvisXDB" has 1 instance(s). Instance "elvis", status READY, has1 handler(s) for this service...The command completedsuccessfully
以上服务名b,c,d,elvis都为READY,为动态注册。
注意:不管参数service_names为何值,pmon都会自动以全局数据库名(这里为elvis)为服务名,动态注册一个监听。
缺省情况下,若启用动态注册监听,端口号必须为1521.若启用其他端口的动态监听注册,必须要做相干配置。
3.2 自定义端口的动态注册监听
若要启用非默许端口1521的动态监听注册,缺省状态,Oracle不会停止动态注册。要启用动态注册,必须设置local_listener参数。并在服务端配置tnsnames.ora指定监听参数,或者直接通过修改local_listener指定监听参数。步骤如下:
1)服务端
netmgr,配置监听程序,监听端口为1525(非默许端口)
2)指定监听参数
(1)方法1:直接通过修改local_listener参数指定
SQL>alter system set LOCAL_LISTENER=’(ADDRESS=(PROTOCOL=TCP)(HOST=192.168.201.128)(PORT=1525))’;SQL>alter system register
(2)方法2:
在Oracle服务器建立$ORACLE_HOME/network/admin/tnsnames.ora。解析文件,位置并填入如下内容
mytest= (DESCRIPTION = (ADDRESS_LIST = (ADDRESS = (PROTOCOL = TCP)(HOST = 192.168.201.128)(PORT = 1522)) )
这里的mytest也可以根据自己的需要,修改成其他字符串。如a或b等。
设置参数,指定通过tnsnames.ora内的信息指定监听参数
SQL>alter system setlocal_listener=mytest;SQL>alter system register;
文章结束给大家分享下程序员的一些笑话语录: 腾讯总舵主马化腾,有人曾经戏称如果在Z国选举总统,马化腾一定当选,因为只要QQ来一个弹窗”投马总,送Q币”即可。
--------------------------------- 原创文章 By
监听和数据库---------------------------------