记录下刚刚做的一个为一个数据库(t02)配置多个监听(listener)的实验,过程有点小曲折。


(1)新增两个测试的监听,listener.ora的配置内容(可纯手动编辑该文件或使用netca)如下:

(LISTENER为系统原有;L1、L2为测试用新增的监听

# listener.ora Network Configuration File: D:\oracle\product\10.2.0\db_1\network\admin\listener.ora
# Generated by Oracle configuration tools.

L2 =
(DESCRIPTION_LIST =
(DESCRIPTION =
(ADDRESS = (PROTOCOL = TCP)(HOST = PC1255-20110528)(PORT = 1523))
)
)

L1 =
(DESCRIPTION_LIST =
(DESCRIPTION =
(ADDRESS = (PROTOCOL = TCP)(HOST = PC1255-20110528)(PORT = 1522))
)
)

SID_LIST_LISTENER =
(SID_LIST =
(SID_DESC =
(SID_NAME = PLSExtProc)
(ORACLE_HOME = D:\oracle\product\10.2.0\db_1)
(PROGRAM = extproc)
)
)

LISTENER =
(DESCRIPTION_LIST =
(DESCRIPTION =
(ADDRESS = (PROTOCOL = IPC)(KEY = EXTPROC1))
(ADDRESS = (PROTOCOL = TCP)(HOST = PC1255-20110528)(PORT = 1521))
)
)

(2)配置tnsnames.ora,使数据库(t02)可同时使用以上3个监听

# tnsnames.ora Network Configuration File: D:\oracle\product\10.2.0\db_1\network\admin\tnsnames.ora
# Generated by Oracle configuration tools.

T01 =
(DESCRIPTION =
(ADDRESS = (PROTOCOL = TCP)(HOST = PC1255-20110528)(PORT = 1521))
(CONNECT_DATA =
(SERVER = DEDICATED)
(SERVICE_NAME = t01)
)
)

T02 =
(DESCRIPTION =
(ADDRESS = (PROTOCOL = TCP)(HOST = PC1255-20110528)(PORT = 1521))
(ADDRESS = (PROTOCOL = TCP)(HOST = PC1255-20110528)(PORT = 1522))
(ADDRESS = (PROTOCOL = TCP)(HOST = PC1255-20110528)(PORT = 1523))
(CONNECT_DATA =
(SERVER = DEDICATED)
(SERVICE_NAME = t02)
)
)

EXTPROC_CONNECTION_DATA =
(DESCRIPTION =
(ADDRESS_LIST =
(ADDRESS = (PROTOCOL = IPC)(KEY = EXTPROC1))
)
(CONNECT_DATA =
(SID = PLSExtProc)
(PRESENTATION = RO)
)
)

(3)检查及测试,发现问题:

检查的时候发现除了默认的LISTENER监听外,L1和L2始终不能注册服务:

C:\>lsnrctl

LSNRCTL for 32-bit Windows: Version 10.2.0.1.0 - Production on 24-7月 -2011 22:19:24

Copyright (c) 1991, 2005, Oracle. All rights reserved.

欢迎来到LSNRCTL, 请键入"help"以获得信息。

LSNRCTL> status
正在连接到 (DESCRIPTION=(ADDRESS=(PROTOCOL=IPC)(KEY=EXTPROC1)))
LISTENER 的 STATUS
------------------------
别名 LISTENER
版本 TNSLSNR for 32-bit Windows: Version 10.2.0.1.0 - Production
启动日期 24-7月 -2011 22:14:18
正常运行时间 0 天 0 小时 5 分 13 秒
跟踪级别 off
安全性 ON: Local OS Authentication
SNMP OFF
程序参数文件 D:\oracle\product\10.2.0\db_1\network\admin\listener.ora
程序日志文件 D:\oracle\product\10.2.0\db_1\network\log\listener.log
端点概要...
(DESCRIPTION=(ADDRESS=(PROTOCOL=ipc)(PIPENAME=\\.\pipe\EXTPROC1ipc)))
(DESCRIPTION=(ADDRESS=(PROTOCOL=tcp)(HOST=PC1255-20110528)(PORT=1521)))
服务摘要..
服务 "+ASM_XPT" 包含 1 个例程。
例程 "+asm", 状态 BLOCKED, 包含此服务的 1 个处理程序...
服务 "+asm" 包含 1 个例程。
例程 "+asm", 状态 BLOCKED, 包含此服务的 1 个处理程序...
服务 "PLSExtProc" 包含 1 个例程。
例程 "PLSExtProc", 状态 UNKNOWN, 包含此服务的 1 个处理程序...
服务 "t01" 包含 1 个例程。
例程 "t01", 状态 READY, 包含此服务的 1 个处理程序...
服务 "t01XDB" 包含 1 个例程。
例程 "t01", 状态 READY, 包含此服务的 1 个处理程序...
服务 "t01_XPT" 包含 1 个例程。
例程 "t01", 状态 READY, 包含此服务的 1 个处理程序...
命令执行成功
LSNRCTL> stop
正在连接到 (DESCRIPTION=(ADDRESS=(PROTOCOL=IPC)(KEY=EXTPROC1)))
命令执行成功
LSNRCTL> set curr L1
目前的程序为 L1
LSNRCTL> status
正在连接到 (DESCRIPTION=(ADDRESS=(PROTOCOL=TCP)(HOST=PC1255-20110528)(PORT=1522)))
LISTENER 的 STATUS
------------------------
别名 L1
版本 TNSLSNR for 32-bit Windows: Version 10.2.0.1.0 - Production
启动日期 24-7月 -2011 22:14:19
正常运行时间 0 天 0 小时 5 分 26 秒
跟踪级别 off
安全性 ON: Local OS Authentication
SNMP OFF
程序参数文件 D:\oracle\product\10.2.0\db_1\network\admin\listener.ora
程序日志文件 D:\oracle\product\10.2.0\db_1\network\log\l1.log
端点概要...
(DESCRIPTION=(ADDRESS=(PROTOCOL=tcp)(HOST=PC1255-20110528)(PORT=1522)))
程序不支持服务
命令执行成功
LSNRCTL> set curr L2
目前的程序为 L2
LSNRCTL> status
正在连接到 (DESCRIPTION=(ADDRESS=(PROTOCOL=TCP)(HOST=PC1255-20110528)(PORT=1523)))
LISTENER 的 STATUS
------------------------
别名 L2
版本 TNSLSNR for 32-bit Windows: Version 10.2.0.1.0 - Production
启动日期 24-7月 -2011 22:14:19
正常运行时间 0 天 0 小时 5 分 38 秒
跟踪级别 off
安全性 ON: Local OS Authentication
SNMP OFF
程序参数文件 D:\oracle\product\10.2.0\db_1\network\admin\listener.ora
程序日志文件 D:\oracle\product\10.2.0\db_1\network\log\l2.log
端点概要...
(DESCRIPTION=(ADDRESS=(PROTOCOL=tcp)(HOST=PC1255-20110528)(PORT=1523)))
程序不支持服务
命令执行成功

停止了默认的LISTENER监听后,使用tns进行连接测试的时候报错(ORA-12514):

C:\Documents and Settings\Administrator>sqlplus scott/tiger@t02

SQL*Plus: Release 10.2.0.1.0 - Production on 星期日 7月 24 22:20:06 2011

Copyright (c) 1982, 2005, Oracle. All rights reserved.

ERROR:
ORA-12514: TNS: 程序当前无法识别连接描述符中请求的服务

(4)分析问题:

一阵google之后发现,如果默认端口不是1521,则需要设置LOCAL_LISTENER来手动指定监听别名:

When configuring the listener to listen on TCP/IP, you should enter the default port of 1521. If you do not, you must configure the LOCAL_LISTENER parameter in the intialization parameter file and resolve the listener name through a naming method.

http://download.oracle.com/docs/cd/B13789_01/network.101/b10775/listenercfg.htm">​​http://download.oracle.com/docs/cd/B13789_01/network.101/b10775/listenercfg.htm​​​

(5)解决问题(此处的T02为step 2的tnsnames.ora里面的T02):


C:\Documents and Settings\Administrator>set oracle_sid=t02

C:\Documents and Settings\Administrator>sqlplus / as sysdba

SQL*Plus: Release 10.2.0.1.0 - Production on 星期日 7月 24 22:21:55 2011

Copyright (c) 1982, 2005, Oracle. All rights reserved.

已连接到空闲例程。

SQL> select status,instance_name v$instance;

STATUS INSTANCE_NAME
------------------------ --------------------------------
OPEN t02

SQL> alter system set local_listener="T02";

系统已更改。

SQL>

(6)验证,再测试:

验证,发现L1、L2已能正常注册服务:

LSNRCTL> set curr L1
目前的程序为 L1
LSNRCTL> status
正在连接到 (DESCRIPTION=(ADDRESS=(PROTOCOL=TCP)(HOST=PC1255-20110528)(PORT=1522)))
LISTENER 的 STATUS
------------------------
别名 L1
版本 TNSLSNR for 32-bit Windows: Version 10.2.0.1.0 - Production
启动日期 24-7月 -2011 22:14:19
正常运行时间 0 天 0 小时 32 分 54 秒
跟踪级别 off
安全性 ON: Local OS Authentication
SNMP OFF
程序参数文件 D:\oracle\product\10.2.0\db_1\network\admin\listener.ora
程序日志文件 D:\oracle\product\10.2.0\db_1\network\log\l1.log
端点概要...
(DESCRIPTION=(ADDRESS=(PROTOCOL=tcp)(HOST=PC1255-20110528)(PORT=1522)))
服务摘要..
服务 "t02" 包含 1 个例程。
例程 "t02", 状态 READY, 包含此服务的 1 个处理程序...
服务 "t02XDB" 包含 1 个例程。
例程 "t02", 状态 READY, 包含此服务的 1 个处理程序...
服务 "t02_XPT" 包含 1 个例程。
例程 "t02", 状态 READY, 包含此服务的 1 个处理程序...
命令执行成功
LSNRCTL> set curr L2
目前的程序为 L2
LSNRCTL> status
正在连接到 (DESCRIPTION=(ADDRESS=(PROTOCOL=TCP)(HOST=PC1255-20110528)(PORT=1523)))
LISTENER 的 STATUS
------------------------
别名 L2
版本 TNSLSNR for 32-bit Windows: Version 10.2.0.1.0 - Production
启动日期 24-7月 -2011 22:14:19
正常运行时间 0 天 0 小时 33 分 6 秒
跟踪级别 off
安全性 ON: Local OS Authentication
SNMP OFF
程序参数文件 D:\oracle\product\10.2.0\db_1\network\admin\listener.ora
程序日志文件 D:\oracle\product\10.2.0\db_1\network\log\l2.log
端点概要...
(DESCRIPTION=(ADDRESS=(PROTOCOL=tcp)(HOST=PC1255-20110528)(PORT=1523)))
服务摘要..
服务 "t02" 包含 1 个例程。
例程 "t02", 状态 READY, 包含此服务的 1 个处理程序...
服务 "t02XDB" 包含 1 个例程。
例程 "t02", 状态 READY, 包含此服务的 1 个处理程序...
服务 "t02_XPT" 包含 1 个例程。
例程 "t02", 状态 READY, 包含此服务的 1 个处理程序...
命令执行成功
LSNRCTL>

再测试,发现scott用户能够正常登录:

C:\Documents and Settings\Administrator>sqlplus scott/tiger@t02

SQL*Plus: Release 10.2.0.1.0 - Production on 星期日 7月 24 22:24:43 2011

Copyright (c) 1982, 2005, Oracle. All rights reserved.


连接到:
Oracle Database 10g Enterprise Edition Release 10.2.0.1.0 - Production
With the Partitioning, OLAP and Data Mining options

SQL>

(7)总结

监听的端口是默认的1521时,PMON会动态注册该监听(listener);

监听的端口不是默认的1521时,需要使用alter system set local_listener="T02";来手动注册监听。


Ref: ​http://warehouse.itpub.net/post/777/472788">​http://warehouse.itpub.net/post/777/472788​