关于Oracle动态注册和静态注册的一些实验:
实验平台:oracle 10.2.0.1
据目前所知Oracle 8i(含)以后都推荐使用service_name而不是sid来连接数据库了。
通过service_name连接有几个好处:
1、同个实例可通过多个不同的service_name来连接。而不是像sid一样只能唯一的指定了。
2、可以最大指定255个字符的名称,而不是sid的8个字符限制。
首先说下标准配置下的动态注册过程:
1、Oracle启动实例;
2、监听器启动(lsnrctl start);
3、由pmon进程向监听器进行注册。
注册的名称从service_names从取出来,然后注册到监听器的hostname:1521上面。
注册的结果就是我们在不用对listener.ora做任何设置的情况下就可以直接登录数据库了。
实验:
显示service_names列表:
> show parameter service_names;
NAME TYPE VALUE
------------------------------------ ----------- ------------------------------
service_names string orcl,dyndb
> host lsnrctl service
LSNRCTL for 32-bit Windows: Version 10.2.0.1.0 - Production on 02-9月 -2009 14:58:07
Copyright (c) 1991, 2005, Oracle. All rights reserved.
正在连接到 (DESCRIPTION=(ADDRESS=(PROTOCOL=IPC)(KEY=EXTPROC1)))
服务摘要..
服务 "PLSExtProc" 包含 1 个例程。
例程 "PLSExtProc", 状态 UNKNOWN, 包含此服务的 1 个处理程序...
处理程序:
"DEDICATED" 已建立:0 已被拒绝:0
LOCAL SERVER
服务 "dyndb" 包含 1 个例程。
例程 "orcl", 状态 READY, 包含此服务的 1 个处理程序...
处理程序:
"DEDICATED" 已建立:10 已拒绝:0 状态:ready
LOCAL SERVER
服务 "orcl" 包含 1 个例程。
例程 "orcl", 状态 READY, 包含此服务的 1 个处理程序...
处理程序:
"DEDICATED" 已建立:10 已拒绝:0 状态:ready
LOCAL SERVER
....
命令执行成功
以上服务列表中列出了所有已经注册的服务。
可以看到其中有dyndb和orcl列个服务,目前状态是ready的。
由于动态注册是由数据库主动发起到监听器的注册,因此其状态是可以的,所以显示的状态是ready的。
而静态注册是直接配置到listener.ora中的,实际上并不知道此时数据库的状态,所以监听器对该服务器的状态显示是unknown的。
服务在监听器端注册好后,客户端即可通过tnsname.ora到监听器中取对应的service name
以上注册的两个service name可同时使用:
ORCL =
(DESCRIPTION =
(ADDRESS_LIST =
(ADDRESS = (PROTOCOL = TCP)(HOST = localhost)(PORT = 1521))
)
(CONNECT_DATA =
(SERVER = DEDICATED)
(SERVICE_NAME = dyndb)
)
)
或者
HSCUSTOMER =
(DESCRIPTION =
(ADDRESS_LIST =
(ADDRESS = (PROTOCOL = TCP)(HOST = localhost)(PORT = 1521))
)
(CONNECT_DATA =
(SERVICE_NAME = orcl)
)
)
现在如果要新增一个service name,则使用如下命令即可:
alter system set service_names='orcl,dyndb,testdb' scope=memory;
配置完成后,即可用lsnrctl service或lsnrctl status检查状态:
> host lsnrctl status
........
服务 "testdb" 包含 1 个例程。
例程 "orcl", 状态 READY, 包含此服务的 1 个处理程序...
命令执行成功
但是,如果监听器的监听端口不是默认的,数据库就不能注册。
> host lsnrctl service
LSNRCTL for 32-bit Windows: Version 10.2.0.1.0 - Production on 02-9月 -2009 15:37:45
Copyright (c) 1991, 2005, Oracle. All rights reserved.
正在连接到 (DESCRIPTION=(ADDRESS=(PROTOCOL=IPC)(KEY=EXTPROC1)))
服务摘要..
服务 "PLSExtProc" 包含 1 个例程。
例程 "PLSExtProc", 状态 UNKNOWN, 包含此服务的 1 个处理程序...
处理程序:
"DEDICATED" 已建立:0 已被拒绝:0
LOCAL SERVER
命令执行成功
没有出现前面配置好的监听服务。
所以就要显式的注册了,这次需要用到local_listenter参数。
alter system set local_listenter = '(DESCRIPTION=(ADDRESS=(PROTOCOL=TCP)(HOST=localhost)(PORT=8888)))';
然后手动处罚pmon到监听器去注册:
alter system register;
再次查看,发现注册成功:
> host lsnrctl status
LSNRCTL for 32-bit Windows: Version 10.2.0.1.0 - Production on 02-9月 -2009 15:39:17
Copyright (c) 1991, 2005, Oracle. All rights reserved.
正在连接到 (DESCRIPTION=(ADDRESS=(PROTOCOL=IPC)(KEY=EXTPROC1)))
LISTENER 的 STATUS
------------------------
别名 LISTENER
版本 TNSLSNR for 32-bit Windows: Version 10.2.0.1.0 - Production
启动日期 02-9月 -2009 15:33:31
正常运行时间 0 天 0 小时 5 分 46 秒
跟踪级别 off
安全性 ON: Local OS Authentication
SNMP OFF
监听程序参数文件 e:\oracle\product\10.2.0\db_1\network\admin\listener.ora
监听程序日志文件 e:\oracle\product\10.2.0\db_1\network\log\listener.log
监听端点概要...
(DESCRIPTION=(ADDRESS=(PROTOCOL=ipc)(PIPENAME=\\.\pipe\EXTPROC1ipc)))
(DESCRIPTION=(ADDRESS=(PROTOCOL=tcp)(HOST=127.0.0.1)(PORT=8888)))
服务摘要..
服务 "PLSExtProc" 包含 1 个例程。
例程 "PLSExtProc", 状态 UNKNOWN, 包含此服务的 1 个处理程序...
服务 "dyndb" 包含 1 个例程。
例程 "orcl", 状态 READY, 包含此服务的 1 个处理程序...
服务 "orcl" 包含 1 个例程。
例程 "orcl", 状态 READY, 包含此服务的 1 个处理程序...
服务 "orclXDB" 包含 1 个例程。
例程 "orcl", 状态 READY, 包含此服务的 1 个处理程序...
服务 "orcl_XPT" 包含 1 个例程。
例程 "orcl", 状态 READY, 包含此服务的 1 个处理程序...
服务 "testdb" 包含 1 个例程。
例程 "orcl", 状态 READY, 包含此服务的 1 个处理程序...
命令执行成功
参考文章: