on只会动态注册port等于1521的监听,否则pmon不能动态注册listener,要想让pmon动态注册listener,需要设置local_listener参数。
listener.ora内容如下:
SID_LIST_LISTENER =
(SID_LIST =
(SID_DESC =
(GLOBAL_DBNAME = orcl)
(ORACLE_HOME = E:oracleproduct10.2.0db_1)
(SID_NAME = orcl)
)
(SID_DESC =
(GLOBAL_DBNAME = test)
(ORACLE_HOME = E:oracleproduct10.2.0db_1)
(SID_NAME = test)
)
)
LISTENER2=
(DESCRIPTION =
(ADDRESS = (PROTOCOL = TCP)(HOST = xys)(PORT = 1522))
)
LSNRCTL2> start
启动tnslsnr: 请稍候...
TNSLSNR for 32-bit Windows: Version 10.2.0.1.0 - Production
系统参数文件为e:oracleproduct10.2.0db_1networkadminlistener.ora
写入e:oracleproduct10.2.0db_1networkloglistener.log的日志信息
监听: (DESCRIPTION=(ADDRESS=(PROTOCOL=tcp)(HOST=xys)(PORT=1522)))
正在连接到(DESCRIPTION=(ADDRESS=(PROTOCOL=TCP)(HOST=xys)(PORT=1522)))
LISTENER2 的STATUS
------------------------
别名 LISTENER2
版本 TNSLSNR for 32-bit Windows: Version 10.2.0.1.0 - Production
启动日期 25-10月-2008 20:39:07
正常运行时间 0 天 0 小时 0 分 3 秒
跟踪级别 off
安全性 ON: Password or Local OS Authentication SNMP OFF
监听程序参数文件e:oracleproduct10.2.0db_1networkadminlistener.ora
监听程序日志文件e:oracleproduct10.2.0db_1networkloglistener.log
监听端点概要...
(DESCRIPTION=(ADDRESS=(PROTOCOL=tcp)(HOST=xys)(PORT=1522)))
服务摘要..
服务"orcl" 包含1 个例程。
例程"orcl", 状态 UNKNOWN, 包含此服务的 1 个处理程序...
服务"test" 包含1 个例程。
例程"test", 状态 UNKNOWN, 包含此服务的 1 个处理程序...
命令执行成功
--因为listener.ora中port是1522而非默认的1521,因此此时pmon不会动态注册监听
SQL> alter system register; //就算手动强制注册,下面还是没有动态注册
系统已更改。
LSNRCTL2> status
正在连接到(DESCRIPTION=(ADDRESS=(PROTOCOL=TCP)(HOST=xys)(PORT=1522)))
LISTENER2 的 STATUS
------------------------
别名 LISTENER2
版本 TNSLSNR for 32-bit Windows: Version 10.2.0.1.0 - Production
启动日期 25-10月-2008 20:22:50
正常运行时间 0 天 0 小时 0 分 7 秒
跟踪级别 off
安全性 ON: Password or Local OS Authentication
SNMP OFF
监听程序参数文件e:oracleproduct10.2.0db_1networkadminlistener.o
ra
监听程序日志文件 e:oracleproduct10.2.0db_1networkloglistener.log
监听端点概要...
(DESCRIPTION=(ADDRESS=(PROTOCOL= TCP)(HOST=xys)(PORT=1522)))
服务摘要..
服务 "orcl" 包含 1 个例程。
例程 "orcl", 状态 UNKNOWN, 包含此服务的 1 个处理程序...
服务 "test" 包含 1 个例程。
例程 "test", 状态 UNKNOWN, 包含此服务的 1 个处理程序...
命令执行成功
没有注册的原因是pmon 缺省只会注册port=1521的listener。如果想让pmon动态注册prot=1521以外的监听,此时需要设置参数local_listener。
Local_listener有两种设置:
方法一、如果我们设置
Alter system set local_listener=’ (ADDRESS = (PROTOCOL = TCP)(HOST = xys)(PORT = 1522))’
那么,我们只要alter system register;强制PMON注册,就可以实现动态注册了。
方法二、接下来,来讨论另外一个local_listener的设置:
Alter system set local_listener= LISTENER2;
那么,PMON能识别出来吗?
答案是不能的,因为PMON不知道去哪里解析这个LISTENER2。
此时如果我们重启动数据库,则会出现:
SQL> startup
ORA-00119: invalid specification for system parameter LOCAL_LISTENER
ORA-00132: syntax error or unresolved network name 'LISTENER2'
这是因为:启动时它会去服务端的tnsnames.ora里探寻LISTENER2的含义,找不到,解析不了,则会报ora-00132的错误。
那服务端的tnsnames.ora要怎么设置呢?
LISTENER2=(ADDRESS = (PROTOCOL = TCP)(HOST = xys)(PORT = 1525))
加上这个就OK了。
另外说明:LISTENER2注册的实例和服务器默认的监听一样,那只要我们设置了alter system set local_listener=……
这时,我们listener status,也就是默认的监听状态,我们发现,动态监听没有了,剩下的静态监听。
可以知道,默认的监听就只有静态监听了,动态监听都在等待local_listener所对应的监听了。PMON真是见风使舵啊。
更进一步,我们发现,只要我们成功设置了local_listener的值,包括实例和服务名不和默认监听一样,PMON都会在等待local_listener对应的监听。