最近在做HACMP双机互备切换测试的时候,发现一个问题:
A节点的listener端口为1521 ,B节点的listener端口为1522,为什么两个节点的监听要用不同的端口号?
当时AB机使用不同端口是基于如下考虑:
HACMP的切换数据库的过程中,希望同时控制监听的启动和停止,如果两个数据库使用同一个监听,考虑如下情况
监听在A机和B都正常运行在1521
A机故障,db1切换到B机,先关闭A机的监听,文件系统切换到B机,db1在B机启动,启动监听,提示端口已被占用,可以忽略,因为A的实例会动态注册到可用的listener中去。
A机修复,db1会优先切换回A机,如果脚本中这时关闭B机监听,虽然不会影响B机已经连接的客户端,但是如果B机有新客户端连接,将不能连接到B机的数据库。
问题:为什么在一个节点上不能同时起两个同一端口的listener呢?(这个问题困惑我好久了,就连做梦都在问为什么?)
回答:其实不光是不能同时起动端口相同的listener,在listener.ora文件中,同一个KEY值的listener也是不可以同时启动的,就类似于是listener的唯一标识。即IPC addresses(KEY) or TCP port numbers are not duplicated.
在考虑这个问题的过程中,做了一些有关listener的实验,在这里与大家分享
1. 一个端口的listener可以注册多个实例
(备注:这个当然了,比如我们在一个节点上安装多个实例)
e.g.
LSNRCTL> status
正在连接到 (DESCRIPTION=(ADDRESS=(PROTOCOL=TCP)(HOST=172.16.15.99)(PORT=1521)))
LISTENER 的 STATUS
------------------------
别名 LISTENER
版本 TNSLSNR for 32-bit Windows: Version 9.2.0.1.0 - Produc
tion
启动日期 08-6月 -2009 09:17:22
正常运行时间 4 天 0 小时 25 分 6 秒
跟踪级别 off
安全性 OFF
SNMP OFF
监听器参数文件 d:\oracle\network\admin\listener.ora
监听器日志文件 d:\oracle\network\log\listener.log
监听端点概要...
(DESCRIPTION=(ADDRESS=(PROTOCOL=tcp)(HOST=172.16.15.99)(PORT=1521)))
(DESCRIPTION=(ADDRESS=(PROTOCOL=ipc)(PIPENAME=\\.\pipe\EXTPROC0ipc)))
(DESCRIPTION=(ADDRESS=(PROTOCOL=tcp)(HOST=leiz)(PORT=8080))(Presentation=HTTP)
(Session=RAW))
(DESCRIPTION=(ADDRESS=(PROTOCOL=tcp)(HOST=leiz)(PORT=2100))(Presentation=FTP)(
Session=RAW))
(DESCRIPTION=(ADDRESS=(PROTOCOL=tcp)(HOST=leiz)(PORT=8080))(Presentation=HTTP)
(Session=RAW))
(DESCRIPTION=(ADDRESS=(PROTOCOL=tcp)(HOST=leiz)(PORT=2100))(Presentation=FTP)(
Session=RAW))
服务摘要..
服务 "PLSExtProc" 包含 1 个例程。
例程 "PLSExtProc", 状态 UNKNOWN, 包含此服务的 1 个处理程序...
服务 "leiz" 包含 2 个例程。/*实例LEIZ*/
例程 "leiz", 状态 UNKNOWN, 包含此服务的 1 个处理程序.../*静态注册*/
例程 "leiz", 状态 READY, 包含此服务的 1 个处理程序.../*动态注册*/
服务 "leiz2" 包含 2 个例程。/*实例LEIZ2*/
例程 "leiz2", 状态 UNKNOWN, 包含此服务的 1 个处理程序.../*静态注册*/
例程 "leiz2", 状态 READY, 包含此服务的 1 个处理程序.../*动态注册*/ 服务 "leiz2XDB" 包含 1 个例程。
例程 "leiz2", 状态 READY, 包含此服务的 1 个处理程序...
服务 "leizXDB" 包含 1 个例程。
例程 "leiz", 状态 READY, 包含此服务的 1 个处理程序...
命令执行成功
2. 一个实例可以同时注册到多个不同端口的listener去
(备注:这个也没问题,比如一个实例注册到多个不同端口的listener中)
e.g.
LSNRCTL> status listener 正在连接到 (DESCRIPTION=(ADDRESS=(PROTOCOL=TCP)(HOST=172.16.15.99)(PORT=1521)))
LISTENER 的 STATUS
------------------------
别名 LISTENER 版本 TNSLSNR for 32-bit Windows: Version 9.2.0.1.0 - Produc
tion
启动日期 08-6月 -2009 09:17:22
正常运行时间 4 天 0 小时 13 分 14 秒