Heim  >  Artikel  >  Datenbank  >  Oracle监听器(listener)配置心得

Oracle监听器(listener)配置心得

WBOY
WBOYOriginal
2016-06-07 17:05:26941Durchsuche

Oracle虽然用了多年,但是一直仅仅是用而已,没有深入看过oracle的东东。第一次,自己在服务器上完整创建并且配置一个oracle服务

一、配置初衷

Oracle虽然用了多年,但是一直仅仅是用而已,没有深入看过oracle的东东。第一次,自己在服务器上完整创建并且配置一个oracle服务器,问题马上就出现了:

严重: 监听程序未启动或数据库服务未注册到该监听程序。启动该监听程序并注册数据库服务, 然后重新运行 EM Configuration Assistant。

有关详细资料, 请参阅 D:\Oracle\cfgtoollogs\dbca\orcl\emConfig.log 中的日志文件。

参考:

但是始终没有解决。(ps:也可能是我自身问题)

所以,决定拎起袖子,跨界学习一下oracle中的监听器吧。

二、监听器的原理理解

关于监听器的理解,不妨可以参考这篇文章:

以下,就谈谈我自己的浅薄的理解吧:

首先,我觉得监听器的设计使用了代理模式,而监听器正正是代理模式中所描述的代理。当客户端对数据库发生请求的时候,监听器就作为这个客户端的代理,发出对数据库实例的请求。当数据库实例的server 进程收到监听器转发过来的请求时候,会做出响应。而这个响应也是通过监听器转发给客户端。不难发现,客户端与数据库实例之间的交互是间接完成的,在他们中间就存在着一个中间人-监听器。

但是,有一点我们需要注意的,客户端永远不知道他请求的数据库实例是什么,唯一知道的只是数据库所在的服务器的某个服务的名字以及这个数据库分配给他的用户名和密码。这就好比我们去买苹果产品,我们买的时候去的只是代理商的店面,只知道产品是苹果公司卖的,但产品到底是由哪家代工公司生产的,作为消费者的我们一无所知。

但是,归根到底,总该有那么一个机制,负责维护“服务”,“监听器”,“数据库实例”三者之间的关系吧。答案是有的,请看下面的内容。

三、相应的三个配置文件:sqlnet.ora,tnsnames.ora,listener.ora(路径:$oracle_home\NETWORK\ADMIN;默认情况下安装的话,大概如此:D:\app\Administrator\product\11.2.0\dbhome_2\NETWORK\ADMIN)

考虑一下,以下的一种情况:

假如,我们需要连接到一个数据库上的名字为mzoa的实例并且这个数据库实例里面有一个密码为:a,用户名为:sysman的账号。但是,我们不知道这个数据库实例的名字,只知道这个数据库服务器向外提供了一个名为“mzoa”的“服务”,至于我们需要请求的数据库的实例的名字是什么,我们一无所知。但是,尽管如此,我们还是能够连接上我们需要找到的数据库实例-mzoa。(ps:实例名字“mzoa”与服务名字“mzoa”不是必然相同的,可以在创建实例的时候加以修改的!)

不信?可以看看下面……

我们可以在cmd里面完成以下的连接操作:

C

Copyright (c) 19822010, Oracle.  All rights reserved.


连接到:
Oracle Database 11g Enterprise Edition Release 11.2.0.1.0- Production
With the Partitioning, OLAP, Data Mining and Real Application Testing options

SQL>

 至于为什么能这样子?我想上面的三个配置文件:sqlnet.ora,tnsnames.ora,listener.ora足以说明问题。

我们先将这三个配置文件分分类。sqlnet.ora,tnsnames.ora属于客户端,listener.ora属于服务器端。

第一类,客户端文件:sqlnet.ora,tnsnames.ora

 在我们上面的操作过程中,我们使用了以下的语句:

sqlplus sysman/a@I_AM_SERIVCE

“I_AM_SERIVCE”不是一个“服务”的名字,但是至于这个名字有什么内涵。我们需要oracle客户端做出解释。(注意:这里的oracle客户端指的是oracle客户端软件对应的进程集)

oracle客户端是这样子完成对“I_AM_SERIVCE”这一个名字作出解释的:

步骤一:

查看sqlnet.ora配置文件,内容如下:

SQLNET.AUTHENTICATION_SERVICES= (NTS)

NAMES.DIRECTORY_PATH= (TNSNAMES,HOSTNAME,EZCONNECT)

其中第二个条目NAMES.DIRECTORY_PATH,从左至右,指示首先由哪些文件来解释名字。

如上面的例子,就是指示,先由TNSNAMES.ora文件,然后是客户端所在系统的hosts文件……解释名字

步骤二:

因为,sqlnet.ora文件指出先由TNSNAMES.ora文件解释。

我们查看TNSNAMES.ora文件,里面关于“I_AM_SERIVCE”有以下的内容:

I_AM_SERIVCE=          
  (DESCRIPTION =
    (ADDRESS = (PROTOCOL = TCP)(HOST =127.0.0.1)(PORT = 1521))
    (CONNECT_DATA =
      (SERVER = DEDICATED)
      (SERVICE_NAME = mzoa)
    )
  )

 

在这里我们可以清晰看到关于这个“I_AM_SERIVCE”的名字的详细信息了。通过这个名字,我们可以请求数据库服务器所在地址:127.0.0.1,“服务”的名字是“mzoa”。

而端口号:1521正是我们这篇文章的主人公监听器(listener)正在监听的端口号。

通过以上信息,我们可以知道客户端的请求可以通过访问服务器“服务”的形式发送到监听器(listener)上。

 

第二类,服务器端:listener.ora。

内容以及解释如下:

Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn