oracle listener注册方式两种:动态注册和静态注册。
1、静态注册:即实例启动时读取listener.ora文件的配置, 将实例和服务注册到监听程序。无论何时启动一个数据库,默认地都有两条信息注册到监听器中:数据库服务器对应的实例和对外服务。
如在listener.ora文件中:
在客户端的tnsnames.ora文件中就可以添加:
py =
动态非默认注册(即端口非1521):
Listener.ora中添加:
LSNR2 =
(DESCRIPTION =
(ADDRESS = (PROTOCOL = TCP)(HOST = paynefu)(PORT = 1522))
)
再配置local_listener参数:
alter system set local_listener='(ADDRESS = (PROTOCOL = TCP)(HOST = paynefu)(PORT = 1522))';
C:\Documents and Settings\Administrator>lsnrctl status lsnr2
LSNRCTL for 32-bit Windows: Version 10.2.0.1.0 - Production on 31-5月 -2013 09:
5:35
Copyright (c) 1991, 2005, Oracle. All rights reserved.
正在连接到 (DESCRIPTION=(ADDRESS=(PROTOCOL=TCP)(HOST=paynefu)(PORT=1522)))
LISTENER 的 STATUS
------------------------
别名 lsnr2
版本 TNSLSNR for 32-bit Windows: Version 10.2.0.1.0 - Prod
ction
启动日期 31-5月 -2013 09:03:57
正常运行时间 0 天 0 小时 1 分 42 秒
跟踪级别 off
安全性 ON: Local OS Authentication
SNMP OFF
监听程序参数文件 D:\oracle\product\10.2.0\db_1\network\admin\listener.
ra
监听程序日志文件 D:\oracle\product\10.2.0\db_1\network\log\lsnr2.log
监听端点概要...
(DESCRIPTION=(ADDRESS=(PROTOCOL=tcp)(HOST=paynefu)(PORT=1522)))
服务摘要..
服务 "fb" 包含 1 个例程。 ——————该服务名就是数据库中的service_names.db_domain,如下:
SQL> show parameter db_domain
NAME TYPE VALUE
------------------------------------ ----------- ------------------------------
db_domain string
SQL> show parameter service_name
NAME TYPE VALUE
------------------------------------ ----------- ------------------------------
service_names string fb (这个service_names可以为多个,就如静态注册中的global_dbname,对外提供服务)
例程 "fb", 状态 READY, 包含此服务的 1 个处理程序... ——————实例名
服务 "fbXDB" 包含 1 个例程。
例程 "fb", 状态 READY, 包含此服务的 1 个处理程序...
服务 "fb_XPT" 包含 1 个例程。
例程 "fb", 状态 READY, 包含此服务的 1 个处理程序...
命令执行成功
建议:一个对外的服务名对应一个客户端,这样有利于网络资源监控、问题的判断
3、如何区分是动态注册还是静态注册?
lsnrctl status一下:
Alias LISTENER
1、静态注册:即实例启动时读取listener.ora文件的配置, 将实例和服务注册到监听程序。无论何时启动一个数据库,默认地都有两条信息注册到监听器中:数据库服务器对应的实例和对外服务。
如在listener.ora文件中:
SID_LIST_LISTENER =
(SID_LIST =
(SID_DESC =
(SID_NAME = PLSExtProc)
(ORACLE_HOME = /db/oracle/product/11.2.0/db_1)
(PROGRAM = extproc)
)
(SID_DESC =
(GLOBAL_DBNAME = paynepm)
#paynepm为对外服务
(ORACLE_HOME = /db/oracle/product/11.2.0/db_1)
(SID_NAME = payne)
#payne为实例名
)
(SID_DESC =
(GLOBAL_DBNAME = paynefu)
#paynefu为对外服务
(ORACLE_HOME = /db/oracle/product/11.2.0/db_1)
(SID_NAME = payne)
#payne为实例名
)
)
LISTENER =
(DESCRIPTION_LIST =
(DESCRIPTION =
(ADDRESS = (PROTOCOL = TCP)(HOST = 192.169.0.200)(PORT = 1521))
(ADDRESS = (PROTOCOL = IPC)(KEY = EXTPROC0))
)
)
在客户端的tnsnames.ora文件中就可以添加:
py =
(DESCRIPTION =
(ADDRESS_LIST =
(ADDRESS = (PROTOCOL = TCP)(HOST = 192.169.0.200)(PORT = 1521))
)
(CONNECT_DATA =
(SERVICE_NAME = paynepm)
)
)
或
在客户端测试
SQL> conn ff/ff@py
或
py =
(DESCRIPTION =
(ADDRESS_LIST =
(ADDRESS = (PROTOCOL = TCP)(HOST = 192.169.0.200)(PORT = 1521))
)
(CONNECT_DATA =
(SERVICE_NAME = paynefu)
)
)
在客户端测试
SQL> conn ff/ff@py
已连接。
2、动态注册: 在 instance 启动的时候 PMON 进程根据 init.ora 中的 instance_name,service_names 两个参数将实例和服务动态注册到 listener 中。 采取动态注册方法时, listener.ora 中的内容如下:
默认动态注册:
2、动态注册: 在 instance 启动的时候 PMON 进程根据 init.ora 中的 instance_name,service_names 两个参数将实例和服务动态注册到 listener 中。 采取动态注册方法时, listener.ora 中的内容如下:
默认动态注册:
LSNR1 =
(DESCRIPTION_LIST =
(DESCRIPTION =
(ADDRESS = (PROTOCOL = TCP)(HOST = paynefu)(PORT= 1521))
)
)
动态注册默认只注册到默认的监听器上(端口是1521、协议是TCP), 因为 pmon只会动态注册port等于1521的监听,否则pmon不能动态注册listener,如果需要向非默认监听注册,则需要配置local_listener参数!动态默认注册与非默认注册都是通过local_listener参数来判断的,如果值为空,则是默认注册,若为非空,则是非默认注册。如下:动态非默认注册(即端口非1521):
Listener.ora中添加:
LSNR2 =
(DESCRIPTION =
(ADDRESS = (PROTOCOL = TCP)(HOST = paynefu)(PORT = 1522))
)
再配置local_listener参数:
alter system set local_listener='(ADDRESS = (PROTOCOL = TCP)(HOST = paynefu)(PORT = 1522))';
C:\Documents and Settings\Administrator>lsnrctl status lsnr2
LSNRCTL for 32-bit Windows: Version 10.2.0.1.0 - Production on 31-5月 -2013 09:
5:35
Copyright (c) 1991, 2005, Oracle. All rights reserved.
正在连接到 (DESCRIPTION=(ADDRESS=(PROTOCOL=TCP)(HOST=paynefu)(PORT=1522)))
LISTENER 的 STATUS
------------------------
别名 lsnr2
版本 TNSLSNR for 32-bit Windows: Version 10.2.0.1.0 - Prod
ction
启动日期 31-5月 -2013 09:03:57
正常运行时间 0 天 0 小时 1 分 42 秒
跟踪级别 off
安全性 ON: Local OS Authentication
SNMP OFF
监听程序参数文件 D:\oracle\product\10.2.0\db_1\network\admin\listener.
ra
监听程序日志文件 D:\oracle\product\10.2.0\db_1\network\log\lsnr2.log
监听端点概要...
(DESCRIPTION=(ADDRESS=(PROTOCOL=tcp)(HOST=paynefu)(PORT=1522)))
服务摘要..
服务 "fb" 包含 1 个例程。 ——————该服务名就是数据库中的service_names.db_domain,如下:
SQL> show parameter db_domain
NAME TYPE VALUE
------------------------------------ ----------- ------------------------------
db_domain string
SQL> show parameter service_name
NAME TYPE VALUE
------------------------------------ ----------- ------------------------------
service_names string fb (这个service_names可以为多个,就如静态注册中的global_dbname,对外提供服务)
例程 "fb", 状态 READY, 包含此服务的 1 个处理程序... ——————实例名
服务 "fbXDB" 包含 1 个例程。
例程 "fb", 状态 READY, 包含此服务的 1 个处理程序...
服务 "fb_XPT" 包含 1 个例程。
例程 "fb", 状态 READY, 包含此服务的 1 个处理程序...
命令执行成功
建议:一个对外的服务名对应一个客户端,这样有利于网络资源监控、问题的判断
3、如何区分是动态注册还是静态注册?
lsnrctl status一下:
Alias LISTENER
Version TNSLSNR for Linux: Version 11.2.0.1.0 - Production
Start Date 03-MAY-2013 15:33:22
Uptime 0 days 0 hr. 16 min. 14 sec
Trace Level off
Security ON: Local OS Authentication
SNMP OFF
Listener Parameter File /db/oracle/product/11.2.0/db_1/network/admin/listener.ora
Listener Log File /db/oracle/diag/tnslsnr/for11g/listener/alert/log.xml
Listening Endpoints Summary...
(DESCRIPTION=(ADDRESS=(PROTOCOL=tcp)(HOST=192.169.0.200)(PORT=1521)))
(DESCRIPTION=(ADDRESS=(PROTOCOL=ipc)(KEY=EXTPROC0)))
Services Summary...
Service "PLSExtProc" has 1 instance(s).
Instance "PLSExtProc", status
UNKNOWN, has 1 handler(s) for this service...
Service "paynefu" has 1 instance(s).
Instance "payne", status
UNKNOWN, has 1 handler(s) for this service...
Service "paynepm" has 1 instance(s).
Instance "payne", status
UNKNOWN, has 1 handler(s) for this service...
The command completed successfully
看到上面的UNKNOWN没? 表示静态注册 的设置, 这时监听器用来表明它不知道关于该实例的任何信息,只有当客户发出连接请求时,它才检查该实例是否存在。
动态注册的数据库通过状态信息中的状态 READY 或状态 BLOCKED (对于一个备用数据库)来指明。 不管关闭何时数据库,动态注册的数据库都会动态地从 监听器注销,而与之相关的信息将从状态列表中消失。这样,不管数据库是在运行还是已经关闭,监听器总是知道它的状态。该信息将被用于连接请求的回退 和负载平衡。
看到上面的UNKNOWN没? 表示静态注册 的设置, 这时监听器用来表明它不知道关于该实例的任何信息,只有当客户发出连接请求时,它才检查该实例是否存在。
动态注册的数据库通过状态信息中的状态 READY 或状态 BLOCKED (对于一个备用数据库)来指明。 不管关闭何时数据库,动态注册的数据库都会动态地从 监听器注销,而与之相关的信息将从状态列表中消失。这样,不管数据库是在运行还是已经关闭,监听器总是知道它的状态。该信息将被用于连接请求的回退 和负载平衡。
来自 “ ITPUB博客 ” ,链接:http://blog.itpub.net/27135177/viewspace-765105/,如需转载,请注明出处,否则将追究法律责任。
转载于:http://blog.itpub.net/27135177/viewspace-765105/