♣ 思考
在Oracle中,什么是动态注册和静态注册,它们之间有什么区别?
♣ 答案
Oracle的注册就是将数据库作为一个服务注册到监听程序,而客户端不需要知道数据库名和实例名,只需要知道该数据库对外提供的服务名就可以申请连接到数据库。这个服务名可能与实例名一样,也有可能不一样。在数据库服务器启动过程中,数据库服务器会向监听程序注册相应的服务,根据注册方式的不同,目前Oracle支持动态注册和静态注册这两种注册方式。
动态注册是实例启动的时候PMON进程根据参数文件中的INSTANCE_NAME,SERVICE_NAMES两个参数将实例和服务动态注册到LISTENER中。动态注册默认只注册到默认的监听器上(名称为LISTENER、端口为1521),如果要向非默认监听器动态注册,那么需要配置LOCAL_LISTENER参数。需要注意的是,动态注册默认端口在数据库启动后大约1分钟之后才可以查询(lsnrct status),但可以在数据库中使用SQL语句“ALTER SYSTEM REGISTER;”立即注册数据库。
当使用动态注册时,若数据库处于NOMOUNT状态,则监听器中的状态为BLOCKED,此时,即使使用SYS用户也不能远程通过监听器连接到数据库。若将数据库启动到MOUNT状态,则监听器中的状态为READY,此时,只能使用SYS用户远程通过监听器连接到数据库。
有两种使用LOCAL_LISTENER的方式,下面分别介绍。
第一种方式,在Oracle用户下的$ORACLE_HOME/network/admin/tnsnames.ora文件中配置监听器的名称,然后配置LOCAL_LISTENER参数的值,如下所示:
1LISTENER_LHR =
2 (DESCRIPTION =
3 (ADDRESS = (PROTOCOL = TCP)(HOST = 192.168.59.130)(PORT = 1522))
4 )
其中,LISTENER_LHR可以是任意名称,即使该名称的监听器不存在,依然可以动态注册数据库,但是需要保证HOST的值是正确的,另外需要保证PORT端口号是一个已经存在的监听器的端口号。
接下来以SYS用户设置LOCAL_LISTENER参数的值:
1ALTER SYSTEM SET LOCAL_LISTENER=LISTENER_LHR;
2ALTER SYSTEM REGISTER;
第二种方式,直接配置LOCAL_LISTENER参数的值,如下所示:
1ALTER SYSTEM SET LOCAL_LISTENER='(ADDRESS=(PROTOCOL=TCP)(HOST=192.168.59.130)(PORT=1522))';--配置1个端口
2ALTER SYSTEM SET LOCAL_LISTENER='(ADDRESS=(PROTOCOL=TCP)(HOST=192.168.59.130)(PORT=1522))','(ADDRESS=(PROTOCOL=TCP)(HOST=192.168.59.130)(PORT=1523))';--配置多个端口
3ALTER SYSTEM REGISTER;
这里的LOCAL_LISTENER参数后的值可以直接从命令lsnrctl status中获取,如下所示:
1[oracle@OCPLHR admin]$ lsnrctl status
2
3LSNRCTL for Linux: Version 11.2.0.3.0 - Production on 07-MAR-2018 22:16:52
4
5Copyright (c) 1991, 2011, Oracle. All rights reserved.
6
7Connecting to (DESCRIPTION=(ADDRESS=(PROTOCOL=TCP)(HOST=192.168.59.155)(PORT=1521)))
8STATUS of the LISTENER
9------------------------
10Alias LISTENER
11Version TNSLSNR for Linux: Version 11.2.0.3.0 - Production
12Start Date 07-MAR-2018 22:10:21
13Uptime 0 days 0 hr. 6 min. 31 sec
14Trace Level off
15Security ON: Local OS Authentication
16SNMP OFF
17Listener Parameter File /u01/app/oracle/product/11.2.0/dbhome_1/network/admin/listener.ora
18Listener Log File /u01/app/oracle/diag/tnslsnr/OCPLHR/listener/alert/log.xml
19Listening Endpoints Summary...
20 (DESCRIPTION=(ADDRESS=(PROTOCOL=tcp)(HOST=192.168.59.155)(PORT=1521)))
21Services Summary...
22Service "+ASM" has 1 instance(s).
23 Instance "+ASM", status READY, has 1 handler(s) for this service...
24Service "OCPLHR1" has 1 instance(s).
25 Instance "OCPLHR1", status UNKNOWN, has 1 handler(s) for this service...
26The command completed successfully
需要注意的是,若将LOCAL_LISTENER设置为空,则在下一次数据库启动的时候会自动配置该参数的值。若LOCAL_LISTENER的值为空,则Oracle会默认动态注册默认监听器。若修改了LOCAL_LISTENER的值,且LOCAL_LISTENER的值中不包含默认监听器的配置,则Oracle不会再将当前数据库动态注册到默认监听器中。
静态注册就是在监听启动的时候,不管实例启动了没有,实例的名字都已经注册到监听中了,主要用于DBA远程启动数据库实例。在DG的搭建过程中也必须配置静态监听。静态注册主要在$ORACLE_HOME/network/admin/listener.ora文件中配置,静态注册的示例如下所示:
1LISTENER =
2 (DESCRIPTION_LIST =
3 (DESCRIPTION =
4 (ADDRESS = (PROTOCOL = TCP)(HOST = 192.168.59.130)(PORT = 1522))
5 )
6 )
7
8SID_LIST_LISTENER =
9 (SID_LIST =
10 (SID_DESC =
11 (GLOBAL_DBNAME = orcl.lhr.com)
12 (SID_NAME = orcl)
13 (ORACLE_HOME = /u01/app/oracle/product/11.2.0/dbhome_1)
14 )
15 (SID_DESC =
16 (GLOBAL_DBNAME = rman.lhr.com)
17 (SID_NAME = rman)
18 (ORACLE_HOME = /u01/app/oracle/product/11.2.0/dbhome_1)
19 )
20 )
其中,SID_LIST_XXX,这里的XXX必须是某一个已经存在的监听器的名称。
那么,如何查询某服务是静态注册还是动态注册呢?可以使用命令lsnrctl status来查看某服务是静态注册还是动态注册。实例状态为UNKNOWN时表明此服务是静态注册。这时监听器用来表明它不知道关于该实例的任何信息,只有当客户发出连接请求时,它才检查该实例是否存在。动态注册的数据库通过状态信息中的状态READY或状态BLOCKED(动态监听在NOMOUNT状态下为BLOCKED)来指明。不管何时关闭数据库,动态注册的数据库都会动态地从监听器注销,而与之相关的信息将从状态列表中消失。所以,不管数据库是在运行还是已经关闭,监听器总是知道它的状态。该信息将被用于连接请求的回退和负载平衡。
例如,数据库名为lhrdb,其LOCAL_LISTENER的配置如下所示:
1SYS@lhrdb> ALTER SYSTEM SET LOCAL_LISTENER='(ADDRESS=(PROTOCOL=TCP)(HOST=192.168.59.13)(PORT=1530))';
2System altered.
3SYS@lhrdb> ALTER SYSTEM REGISTER;
4System altered.
5SYS@lhrdb> show parameter LOCAL_LISTENER
6NAME TYPE VALUE
7------------------------------------ ----------- ---------------------------------------------------------
8local_listener string (ADDRESS=(PROTOCOL=TCP)(HOST=192.168.59.13)(PORT=1530))
其LISTENER.ORA的配置如下所示:
1LISTENER_LHRTEST =
2 (DESCRIPTION_LIST =
3 (DESCRIPTION =
4 (ADDRESS = (PROTOCOL = TCP)(HOST = 192.168.59.13)(PORT = 1530))
5 )
6 )
7
8SID_LIST_LISTENER_LHRTEST =
9(SID_LIST =
10 (SID_DESC =
11 (GLOBAL_DBNAME = lhrdb)
12 (ORACLE_HOME = /oracle/app/oracle/product/11.2.0/db)
13 (SID_NAME = lhrdb)
14 )
15 )
需要说明的是,该库既配置了动态监听,也配置了静态监听,执行lsnrctl status LISTENER_LHRTEST后可以看到:
1[ZFZHLHRDB1:grid]:/home/grid>lsnrctl status LISTENER_LHRTEST
2
3LSNRCTL for IBM/AIX RISC System/6000: Version 11.2.0.4.0 - Production on 12-OCT-2016 17:35:35
4
5Copyright (c) 1991, 2013, Oracle. All rights reserved.
6
7Connecting to (DESCRIPTION=(ADDRESS=(PROTOCOL=TCP)(HOST=192.168.59.13)(PORT=1530)))
8STATUS of the LISTENER
9------------------------
10Alias LISTENER_LHRTEST
11Version TNSLSNR for IBM/AIX RISC System/6000: Version 11.2.0.4.0 - Production
12Start Date 12-OCT-2016 17:26:44
13Uptime 0 days 0 hr. 8 min. 51 sec
14Trace Level off
15Security ON: Local OS Authentication
16SNMP OFF
17Listener Parameter File /oracle/app/11.2.0/grid/network/admin/listener.ora
18Listener Log File /oracle/app/grid/diag/tnslsnr/ZFZHLHRDB1/listener_lhrtest/alert/log.xml
19Listening Endpoints Summary...
20 (DESCRIPTION=(ADDRESS=(PROTOCOL=tcp)(HOST=192.168.59.13)(PORT=1530)))
21Services Summary...
22Service "lhrdb" has 2 instance(s).
23 Instance "lhrdb", status UNKNOWN, has 1 handler(s) for this service...
24 Instance "lhrdb", status READY, has 1 handler(s) for this service...
25Service "lhrdbXDB" has 1 instance(s).
26 Instance "lhrdb", status READY, has 1 handler(s) for this service...
27The command completed successfully
28[ZFZHLHRDB1:grid]:/home/grid>lsnrctl
29
30LSNRCTL for IBM/AIX RISC System/6000: Version 11.2.0.4.0 - Production on 12-OCT-2016 17:38:48
31
32Copyright (c) 1991, 2013, Oracle. All rights reserved.
33
34Welcome to LSNRCTL, type "help" for information.
35
36LSNRCTL> services LISTENER_LHRTEST
37Connecting to (DESCRIPTION=(ADDRESS=(PROTOCOL=TCP)(HOST=192.168.59.13)(PORT=1530)))
38Services Summary...
39Service "lhrdb" has 2 instance(s).
40 Instance "lhrdb", status UNKNOWN, has 1 handler(s) for this service...
41 Handler(s):
42 "DEDICATED" established:0 refused:0
43 LOCAL SERVER
44 Instance "lhrdb", status READY, has 1 handler(s) for this service...
45 Handler(s):
46 "DEDICATED" established:0 refused:0 state:ready
47 LOCAL SERVER
48Service "lhrdbXDB" has 1 instance(s).
49 Instance "lhrdb", status READY, has 1 handler(s) for this service...
50 Handler(s):
51 "D000" established:0 refused:0 current:0 max:1022 state:ready
52 DISPATCHER <machine: ZFZHLHRDB1, pid: 7012814>
53 (ADDRESS=(PROTOCOL=tcp)(HOST=ZFZHLHRDB1)(PORT=41041))
54The command completed successfully
从上面的内容可以看出,监听器中既有UNKNOWN也有READY,UNKNOWN表示静态监听,READY表示动态监听,establicshed表示累计的连接总数,而不是当前连接数。
& 说明:
有关监听更多的内容可以参考我的BLOG:http://blog.itpub.net/26736162/viewspace-1423799/
本文选自《Oracle程序员面试笔试宝典》,作者:小麦苗
DB宝分享的IT资料:https://mp.weixin.qq.com/s/Iwsy-zkzwgs8nYkcMz29ag
● 本文作者:小麦苗,只专注于数据库的技术,更注重技术的运用
● 作者博客地址:http://blog.itpub.net/26736162/abstract/1/
● 本系列题目来源于作者的学习笔记,部分整理自网络,若有侵权或不当之处还请谅解
● 版权所有,欢迎分享本文,转载请保留出处
● QQ:646634621 QQ群:230161599、618766405
● 微信:lhrbestxh
● 微信公众号:DB宝
● 提供Oracle OCP、OCM、高可用(rac+dg+ogg)和MySQL最实用的技能培训
● 题目解答若有不当之处,还望各位朋友批评指正,共同进步
长按下图识别二维码或微信扫描下图二维码来关注小麦苗的微信公众号:DB宝,学习最实用的数据库技术。
本文分享自微信公众号 - DB宝(lhrdba)。
如有侵权,请联系 support@oschina.cn 删除。
本文参与“OSC源创计划”,欢迎正在阅读的你也加入,一起分享。