监听就像人的耳朵,数据库装好后开启监听,客户段才能访问。

数据库软件11g安装之后默认是安装了监听,如没有安装,用netca进入到图形方式去安装。

这里面设计到几个概念, DB_NAME,INSTANCE_NAME,ORACLE_SID,GLOBAL_DBNAME,SERVICE_NAME
一、DB_NAME:数据库标识符,存在于控制文件,数据文件,参数文件,日志文件等
二、INSTANCE_NAME:实例唯一标识符,如RAC环境,存在多实例情况下,用instance_name区别每个实例,
三、ORACLE_SID:实例标识符,以环境变量形式存在,同时用于对应共享内存段,与NSTANCE_NAME的区别在于ORACLE_SID标示进程,ORACLE_SID容易更改,不像DB_NAME更改涉及到控制文件等,比如一个库里面建立了二个实例,在进入某一个具体实例之前,先export ORACLE_SID=实例名。通过ps -ef | grep oracle 也能看该SID的实例的各个进程

四global_name 是由db_name.db_domain构成的,这里在一个库中设置为SID一样,有多个数据库中这个就设置不一样了,具体的我也不遇到过,这个是在listener.ora设置的,这里设置的global_name要和listen.ora里面的service_name是一样的。

这里顺便提一下,客户端如何与数据库连接的,首先在客户端中装oracle客户端,配置里面的tnaname.ora,如

test =
  (DESCRIPTION =
    (ADDRESS_LIST =
      (ADDRESS = (PROTOCOL = TCP)(HOST = 172.22.8.200)(PORT = 1521))
    )
    (CONNECT_DATA =
      (SERVICE_NAME = orcl)
    )
  )

 

这里的service_name要与global_name一样,这个在用DBCA建库的时候会让我们输入的。

oracle 监听器概念_第1张图片

 

 

当你用PLSQL去连接数据库时,客户端根据tnsname.ora中的SERVICE_NAME和地址(ADDRESS = (PROTOCOL = TCP)(HOST = 172.22.8.200))(PORT = 1521)),到这个地址去访问监听器。然后监听器根据文件lisnter.ora文件中的GLOBAL_NAME来判断是否有一个GLOBAL_DBNAME 和 SERVICE_NAME 相等。如果相等,则建立客户端到SID标识的服务端实例的连接。

五 service name 这个在第四个已经讲了。

 

接下来讲讲动态注册与静态注册,所谓动态监听,就是在listener.ora文件中,不需要定义实例Instance具体名称和位置。Oracle实例会在运行之后,由后台进程pmon会周期性的(1-3分钟)到指定端口1521进行状态信息通知。Listener就会自动的进行更新Service情况。

静态注册简单的说,就是监听器的实例注册信息是直接写在listener.ora文件里的。当监听器启动之后,Oracle会根据配置的listener.ora定义的服务去进行连接匹配。

 

这个过程中,一个重点在于:Oracle的注册信息是写死在文件里面的。监听器并不能像动态注册那样切实知道Oracle实例的情况,所以静态注册的状态取值通常是UNKNOW。

通过以上信息可以发现静态监听在listener.ora多配置一些信息,主要是配置指向oracle home相关信息。

同时当数据库中

1、一个监听在一个IP一个端口上监听多个实例
2
、一个监听在不同IP不同端口上监听多个实例
3
、多个监听监听多个实例

如何配置这些监听,网上有人分分享过的。

注明一下:

orcl222 =
  (DESCRIPTION =
    (ADDRESS = (PROTOCOL = TCP)(HOST = 172.22.8.150)(PORT = 1521))
    (CONNECT_DATA =
      (SERVER = DEDICATED)
      (SERVICE_NAME = orcl)

 

这里的service_name 和HOST,对于RAC,host 的IP可以写任意一个节点的IP,但最下面的service_name要改成sid,

如果你把HOST里面的IP 写成scan Ip,最下面你就写成service_name。