比如如下环境:
说明/etc/hosts
#public
10.233.56.200 node1
10.233.56.210 node2
#vip
10.233.56.201 node1-vip
10.233.56.211 node2-vip
#private
192.168.56.200 node1-priv
192.168.56.210 node2-priv
[[email protected] admin]$ vi listener.ora
# listener.ora.node1 Network Configuration File:/oracle/app/oracle/product/10.2.0/db_1/network/admin/listener.ora.node1
# Generated by Oracle configuration tools.
SID_LIST_LISTENER_NODE1 =
(SID_LIST =
(SID_DESC =
(SID_NAME= PLSExtProc)
(ORACLE_HOME = /oracle/app/oracle/product/10.2.0/db_1)
(PROGRAM =extproc)
)
)
LISTENER_NODE1 =
(DESCRIPTION_LIST =
(DESCRIPTION=
(ADDRESS =(PROTOCOL = TCP)(HOST = node1-vip)(PORT = 1521)(IP = FIRST)) ##vip
(ADDRESS =(PROTOCOL = TCP)(HOST = 10.233.56.200)(PORT = 1521)(IP = FIRST)) ##public
)
)
如果使用srvctl启动监听那么,其实相当于
Lsnrctl start 监听名(注册到集群里的)
如: lsnrctl start LISTENER_NODE1
可以使用srvctl config listener –n node1查看
假设有$ORACLE_HOME/network/admin/listener.Ora文件,那么使用启动监听都会去读取这个文件,当然没有参数文件监听器也是可以启动,那时监听器依据默认的行为操作。如果不指定监听名称启动那么就会按照listener.Ora里记录的名称启动:如上面的LISTENER_NODE1,我做实验期间(SID_LIST_LISTENER_NODE1把后面的NODE1改成别的不受影响,所以暂且认为他不影响监听,或者说他只是所有监听的列表集名称),如果我没有指定名称直接lsnrctl
start 那么默认去监听文件里找listener而不会找LISTENER_NODE1,不同的监听名称会产生不同的log日志。(个人认为不管有没有指定名称,都是先找listener.ora再根据默认的启动(默认的配置监听名称是LISTENER),所以当指定的名称不是LISTENER同时在Listener.ora里也找不到,那么就会报错,但是如果没指定LISTENER,也没指定其他的,虽然在lisener.ora里找不到,但是默认的监听配置是可以启动的)
说下上面的服务注册问题,这些服务有静态的有动态注册的,
这里的SID_DESC就是静态注册的标识,status是unknow,特点是如果对一个真正的数据库静态注册,那么数据库重启的时候不会重新注册(因为不会去重新读取listener.ora除非监听也重启),所谓动态的就是不写这些(这是瞎扯)。
还有之前认为是tnsnames.ora影响监听器监听到的服务,但是其实跟tnsnames.ora没半毛钱关系。
这里的原理是如:本节点的pmon负责把服务注册到监听器上,但是这个监听器不一定是本地的,也可以是远程的.
Pmon进程在没有local_listener和remote_listener的情况下,默认是找本机1521端口的服务注册,如果找不到那么就不注册.
如果配置了local_listener,那么pmon就会接着按照这个参数值把对应的服务注册到监听中去,这个结束之后pmon还会找remote_listener的参数值,把本地的数据库注册到remote_listener指定的远程服务器监听上(remote_listener的值可以是tns的netservice或者和local_listener一样直接写)
端口的意思我是这样理解的:
1.在listener.ora中这里写的端口号,两个意思,第一是oracle服务器的端口就是这个,多个数据库可以直接在这里配置多个listener_si类似的文件,第二是说监听器需要找这个端口的服务注册--如监听文件设置的端口是11521,那么监听必须找11521端口的数据库服务,而pmon默认只找1521的数据库服务给监听注册,所以就需要依赖参数local_listener.
2.在数据库参数里的端口:如local_listener.ora的参数值,就是pmon读取它,然后注册到监听里去,避免端口不是1521,pmon注册不了。参数remote_listener和local的作用差不多,主要是pmon读取它,然后注册到remote指定的远程服务器数据库实例的监听器上。
还有说明的一点:如果平常监听正常,但是可能有了改动,导致监听器监听不到服务,查看这些文件和参数发现没什么问题后,建议重启监听,如果参数改了的话有可能没生效之类的,建议把参数改回去然后再改回来。
10grac的remote可以不需要配置remote,但是11g racedremote_listener就基本都需要配置,因为scan_listener只会在一个节点上,应用通过连接scan,然后scan自动转发给各个节点,当转发的节点不是本节点,那么因为remote_listener相互注册,所以本节点监听到了其他节点的服务,所以可以把客户端转到其他节点上去。
11g rac如:
[[email protected] admin]$ crs_stat |grep -i lis
NAME=ora.LISTENER.lsnr
TYPE=ora.listener.type
NAME=ora.LISTENER_SCAN1.lsnr
TYPE=ora.scan_listener.type
NAME=ora.rac1.LISTENER_RAC1.lsnr
NAME=ora.rac2.LISTENER_RAC2.lsnr
SQL> show parameter lis
NAME TYPE VALUE
------------------------------------ ----------- ------------------------------
listener_networks string
local_listener string (ADDRESS=(PROTOCOL=TCP)(HOST=
10.233.56.103)(PORT=11521))
recovery_parallelism integer 0
remote_listener string racscan:11521
local_listener的值里面的ip 是vip
10g中
SQL> show parameter lis
NAME TYPE VALUE
------------------------------------ -----------------------------------------
local_listener string (ADDRESS=(PROTOCOL=TCP)(HOST=1
0.233.56.201)(PORT=11521))
recovery_parallelism integer 0
remote_listener string TEST2
改监听的不需要改集群里的东西
当一个请求“如期而至”,监听器对照已经注册的服务列表,查找对应的数据库实例信息,获取到指定实例的ORACLE_HOME路径。相当于表明可以进行连接。
客户端与实例的交互不是直接的,是通过Server Process作为代理中介来实现的。所有指令SQL都是客户端通过Server Process发送到实例中,这种体系结构是Oracle对于实例和数据库文件一种保护机制。
当监听器获得请求之后,要从Oracle实例中分配一个Server Process与之对应。这里不同的Oracle连接方式存在一些差别。
如果是专用连接模式,也就是一个客户端连接对应一个Server Process。监听器就会向OS请求fork(创造)出一个Server Process,与监听器尝试交互。
如果是共享连接模式,也就是多个客户端共享一个Server Process(注意:这里还不是连接池)。监听器就会向Dispatcher进程(管理共享模式连接的进程)请求一个Server Process与之交互。
Server Process与监听器的连接,实际上就是相互信息的交换。Server Process将自身在OS中的进程编号、连接地址信息发给监听器。监听器将客户端信息传递给Server Process。
监听器获取到Server Process的信息之后,将其返回给客户端连接程序。客户端获取到信息之后,进行重连接,根据返回的信息与Server Process在制定的服务器端口进行联系。
直到这个时候,客户端程序才将连接用户名、密码等信息发给Server Process,进行登录验证等操作。监听器的工作也就到此结束。
这里面有一个技术细节,就是Server Process与客户端连接的时候,是允许不使用1521端口的。具体连接的端口,是带有随机因素的。在9i版本Windows平台下,如果安装了防火墙,只允许1521端口通信,是会带来一些连接问题。好在在其他平台上和之后的版本中,实现了一种端口共享技术,连接可以和监听器一起使用1521端口。