一、什么是注册?
注册就是将数据库作为一个服务注册到监听程序。客户端不需要知道数据库名和实例名,只需要知道该数据库对外提供的服务名就可以申请连接到数据库。这个服务名可能与实例名一样,也有可能不一样。 在数据库服务器启动过程中,数据库服务器会向监听程序注册相应的服务(无论何时启动一个数据库,默认地都有两条信息注册到监听器中:数据库服务器对应的实例和服务)。相当与是这样:在数据库服务器和客户端之间有一监听程序(Listener),在监听程序中,会记录相应数据库对应的服务名(一个数据库可能对应有多个服务名),当客户端需要连接数据库时,只需要提供服务名,就可以建立客户端和服务器之间的连接。
二、 静态注册
静态注册指实例启动时读取listener.ora配置文件,将实例和服务注册到监听程序。其中global_dbname对应的是oracle对外的服务名,即初始化参数里的service_names,而sid_name对应的是oralce实例的名称,即初始化参数里的instance_name。 无论何时启动一个数据库,默认都有两条信息注册到监听器中:实例和服务。如:
SID_LIST_LISTENER =
(SID_LIST =
(SID_DESC =
(SID_NAME = PLSExtProc)
(ORACLE_HOME = D:\oracle\product\10.2.0\db_1)
(PROGRAM = extproc)
)
(SID_DESC =
(GLOBAL_DBNAME =orcl)
(ORACLE_HOME = D:\oracle\product\10.2.0\db_1)
(SID_NAME =orcl)
)
(SID_DESC =
(GLOBAL_DBNAME =orcl1)
(ORACLE_HOME = D:\oracle\product\10.2.0\db_1)
(SID_NAME =orcl)
)
)
该文件表明数据库是单实例的,实例名为orcl,向外提供了两个服务:orcl和orcl1。
LISTENER = ( DESCRIPTION = (ADDRESS = (HOST = 192.168.0.88)(PROTOCOL = TCP)(PORT = 1521)) )
这是一个最简单的静态监听配置文件,SID_LIST_LISTENER部分的GLOBAL_DBNAME表示向外提供的服务名,SID_NAME是提供注册的实例。在tnsnames.ora文件中的CONNECT_DATA部分,可分别选择SERVICE_NAME=Ora8或SID=test为客户端提供连接。
对于配置非1521监听端口,只能选择静态注册方式。
三、 动态注册
动态注册不需要显示的配置listener.ora文件,oracle实例在open时,PMON进程根据instance_name,service_name参数将实 例和服务动态注册到listerer中。如果没有设定instance_name,将使用db_name初始化参数值。如果没有设定 service_names,将拼接db_name和db_domain(db_name.db_domain)参数值来注册监听。
SQL> show parameter service_nameI
NAME TYPE VALUE
------------------------------------ ----------- ------------------------------ service_names string test
SQL> show parameter instance_name
NAME TYPE VALUE
------------------------------------ ----------- ------------------------------ instance_name string test
LSNRCTL> status
Connecting to (ADDRESS=(PROTOCOL=tcp)(HOST=)(PORT=1521))
STATUS of the LISTENER
------------------------
LISTENER Version
TNSLSNR for Linux: Version 10.2.0.1.0 - Production
Start Date 24-SEP-2008 16:50:01
Uptime 0 days 0 hr. 0 min. 33 sec
Trace Level off
Security ON: Local OS Authentication
SNMP OFF
Listener Log File /u01/app/oracle/product/10.2.0/db_1/network/log/listener.log
Listening Endpoints Summary...
(DESCRIPTION=(ADDRESS=(PROTOCOL=tcp)(HOST=test1)(PORT=1521)))
Services Summary... Service "test" has 1 instance(s). Instance "test", status READY, has 1 handler(s) for this service... Service "test_XPT" has 1 instance(s). Instance "test", status READY, has 1 handler(s) for this service... The command completed successfully SQL> alter system set service_names='oratest' scope=both;
System altered.
SQL> alter system set instance_name='instest' scope=spfile;
System altered.
SQL> shutdown immediate
Database closed.
Database dismounted.
ORACLE instance shut down.
SQL> startup
ORACLE instance started.
Total System Global Area 96468992 bytes
Fixed Size 1217884 bytes
Variable Size 88083108 bytes
Database Buffers 4194304 bytes
Redo Buffers 2973696 bytes
Database mounted.
Database opened.
LSNRCTL> status
Connecting to (ADDRESS=(PROTOCOL=tcp)(HOST=)(PORT=1521))
STATUS of the LISTENER
LISTENER Version
TNSLSNR for Linux: Version 10.2.0.1.0 - Production
Start Date 24-SEP-2008 16:52:44
Uptime 0 days 0 hr. 1 min. 52 sec
Trace Level off
Security ON: Local OS Authentication
SNMP OFF
Listener Log File /u01/app/oracle/product/10.2.0/db_1/network/log/listener.log
Listening Endpoints Summary...
(DESCRIPTION=(ADDRESS=(PROTOCOL=tcp)(HOST=test1)(PORT=1521)))ITPUB个人空间5r4I9yeg uy [6g Services Summary... Service "oratest" has 1 instance(s). Instance "instest", status READY, has 1 handler(s) for this service... Service "test" has 1 instance(s). Instance "instest", status READY, has 1 handler(s) for this service... Service "test_XPT" has 1 instance(s). Instance "instest", status READY, has 1 handler(s) for this service... The command completed successfully
可以看到,监听注册的服务和实例已发生了相应的变化。同静态监听,这里也可以分别使用SERVICE_NAME=oratest或SID=instest来进行客户端的连接。 可选择的是,您可以在service_names参数中指定多个服务值,值之间用逗号格开,这对于共享服务器配置是很有用的。
动态注册默认只注册到默认的监听器上(名称是LISTENER、端口是1521、协议是TCP),如果需要向非默认监听注册,则需要配置local_listener参数!
四、查询某服务是静态注册还是动态注册
可以使用命令lsnrctl status来查看某服务是静态注册还是动态注册。 实例状态为UNKNOWN值时表明此服务是静态注册的设置。这时监听器用来表明它不知道关于该实例的任何信息,只有当客户发出连接请求时,它才检查该实例是否存在。 动态注册的数据库通过状态信息中的状态READY或状态BLOCKED(对于一个备用数据库)来指明。不管关闭何时数据库,动态注册的数据库都会动态地从监听器注销,而与之相关的信息将从状态列表中消失。这样,不管数据库是在运行还是已经关闭,监听器总是知道它的状态。 该信息将被用于连接请求的回退(fallback)和负载平衡。 因此,由于Listener动态监听,实例虽然启动,但没有注册到监听。实例是通过PMON进程注册到监听上的,而PMON进程需要在MOUNT状态下才会启动。所以造成了上面的错误,为了方便,只能将其改为静态监听 修改NETWORK\ADMIN下的listner.ora,改为
SID_LIST_LISTENER =
(SID_LIST =
(SID_DESC =
(SID_NAME = PLSExtProc)
(ORACLE_HOME = e:\oracle10g)
(PROGRAM = extproc)
)
(SID_DESC =
(GLOBAL_DBNAME = oracle)
(ORACLE_HOME = e:\oracle10g)
(SID_NAME = oracle)
)
)
要注意的是=号左右两边的空格,否则会出错,然后再用lsnrctl start等来启动,这次的话,可以很顺利地解决shutdown后再startup mount的问题了 。
既然有动态监听为什么还要静态监听呢?原因如下:
1.监听器不是最早启动,oracle实例先启动
2.监听器重启
3.oracle实例没有open
一台机上即装有9i,又装有10g,此时可以只启动10g的监听器,9i的数据库可以自动注册进来,反之不行,因为10g的监听器可以监听9i的数据库,但9i的监听器不能监听10g的数据库。
来自 “ ITPUB博客 ” ,链接:http://blog.itpub.net/15011739/viewspace-604562/,如需转载,请注明出处,否则将追究法律责任。