Oracle动态注册与静态注册
动态注册
动态注册是指在instance启动的时候,pmon进程根据init.ora中的instance_name,service_names两个参数将实例和服务动态注册到listener中。
注册到监听器中的实例名从init.ora文件中的instance_name参数取得。如果该参数没有设定值,那么它将取db_name的值。如果在RAC中配置,您必须将集群中每个实例的instance_name参数设置为一个唯一的值。
注册到监听器中的服务名从init.ora文件中的参数service_names取得。如果该参数没有设定值,数据库将拼接db_name和db_domain的值来注册自己。如果没有设定,数据库将拼接init.ora中的db_name和db_domain的值来注册自己。
[oracle@oracle dbs]$ cat initorcl.ora
orcl.__db_cache_size=88080384
orcl.__java_pool_size=12582912
orcl.__large_pool_size=4194304
orcl.__oracle_base='/oracle/11g'#ORACLE_BASE set from environment
orcl.__pga_aggregate_target=142606336
orcl.__sga_target=268435456
orcl.__shared_io_pool_size=0
orcl.__shared_pool_size=155189248
orcl.__streams_pool_size=0
*.audit_file_dest='/oracle/11g/admin/oracle/adump'
*.audit_trail='db'
*.compatible='11.2.0.0.0'
*.control_files='/oracle/11g/oradata/oracle/control01.ctl','/oracle/11g/flash_recovery_area/oracle/control02.ctl'
*.db_block_size=8192
*.db_domain='orcl'
*.db_name='oracle'
*.db_recovery_file_dest='/oracle/11g/flash_recovery_area'
*.db_recovery_file_dest_size=4070572032
*.diagnostic_dest='/oracle/11g'
*.dispatchers='(PROTOCOL=TCP) (SERVICE=orclXDB)'
*.memory_target=408944640
*.open_cursors=300
*.processes=150
*.remote_login_passwordfile='EXCLUSIVE'
*.undo_tablespace='UNDOTBS1'
SQL> show parameter db_name
NAME TYPE VALUE
------------------------------------ ----------- ------------------------------
db_name string oracle
SQL> show parameter db_domain
NAME TYPE VALUE
------------------------------------ ----------- ------------------------------
db_domain string orcl
由于init.ora中没有设置instance_name的值,那么将使用db_name来作为instance_name,我们这里就是oracle
由于init.ora中没有设置service_name的值,那么将拼接db_name和db_domain来作为service_name,我们这里就是orcl
可以使用以下方法查看service_name和instance_name
SQL> show parameter service_names;
NAME TYPE VALUE
------------------------------------ ----------- ------------------------------
service_names string oracle.orcl
SQL> show parameter instance_name;
NAME TYPE VALUE
------------------------------------ ----------- ------------------------------
instance_name string orcl
动态注册的结果
[oracle@oracle admin]$ lsnrctl status
LSNRCTL for Linux: Version 11.2.0.1.0 - Production on 05-MAY-2018 09:27:33
Copyright (c) 1991, 2009, Oracle. All rights reserved.
Connecting to (DESCRIPTION=(ADDRESS=(PROTOCOL=IPC)(KEY=EXTPROC1521)))
STATUS of the LISTENER
------------------------
Alias LISTENER
Version TNSLSNR for Linux: Version 11.2.0.1.0 - Production
Start Date 05-MAY-2018 09:04:52
Uptime 0 days 0 hr. 22 min. 40 sec
Trace Level off
Security ON: Local OS Authentication
SNMP OFF
Listener Parameter File /oracle/11g/product/11.2.0/dbhome_1/network/admin/listener.ora
Listener Log File /oracle/11g/diag/tnslsnr/oracle/listener/alert/log.xml
Listening Endpoints Summary...
(DESCRIPTION=(ADDRESS=(PROTOCOL=ipc)(KEY=EXTPROC1521)))
(DESCRIPTION=(ADDRESS=(PROTOCOL=tcp)(HOST=10.10.10.101)(PORT=1521)))
Services Summary...
Service "oracle.orcl" has 1 instance(s).
Instance "orcl", status READY, has 1 handler(s) for this service...
Service "orclXDB.orcl" has 1 instance(s).
Instance "orcl", status READY, has 1 handler(s) for this service...
The command completed successfully
动态注册的listener.ora配置文件如下,其实LISTENER段和SID段(下面标黄的段)都可以不写,动态注册会自动注册在1521端口,也就是说,listener.ora文件是空的,也会进行动态注册;
LISTENER段如果要写的话,只能按照下面的方式写,因为动态注册默认只注册到默认的监听器上(名称是LISTENER、端口是1521、协议是TCP),pmon只会动态注册port等于1521的监听,否则pmon不能动态注册listener
# listener.ora Network Configuration File: /oracle/11g/product/11.2.0/dbhome_1/network/admin/listener.ora
# Generated by Oracle configuration tools.
LISTENER =
(DESCRIPTION_LIST =
(DESCRIPTION =
(ADDRESS = (PROTOCOL = IPC)(KEY = EXTPROC1521))
(ADDRESS = (PROTOCOL = TCP)(HOST = 10.10.10.101)(PORT = 1521))
)
)
ADR_BASE_LISTENER = /oracle/11g
SID_LIST_LISTENER =
(SID_LIST =
(SID_DESC =
(SID_NAME = PLSExtProc) ##这里是用来第三方调用的,可以不写,并且有安全隐患,建议不写
(ORACLE_HOME = /oracle/11g/product/11.2.0/dbhome_1)
(PROGRAM = extproc)
)
)
静态注册
静态注册时,listener.ora中的GLOBAL_DBNAME向外提供服务名,GLOBAL_DBNAME可以不写,那么将使用SID_NAME作为服务名,listener.ora中的SID_NAME提供注册的实例名。
oracle实例运行后,监听程序启动时,根据listener.ora的配置注册相应的服务。
静态注册配置文件示例
[oracle@oracle admin]$ cat listener.ora
# listener.ora Network Configuration File: /oracle/11g/product/11.2.0/dbhome_1/network/admin/listener.ora
# Generated by Oracle configuration tools.
LISTENER =
(DESCRIPTION_LIST =
(DESCRIPTION =
(ADDRESS = (PROTOCOL = IPC)(KEY = EXTPROC1521))
(ADDRESS = (PROTOCOL = TCP)(HOST = 10.10.10.101)(PORT = 1521))
)
)
ADR_BASE_LISTENER = /oracle/11g
SID_LIST_LISTENER =
(SID_LIST =
(SID_DESC =
(GLOBAL_DBNAME = orcl1) ##对外的服务名,如果这里不写的话,将使用实例名作为服务名
(ORACLE_HOME = /oracle/11g/product/11.2.0/dbhome_1)
(SID_NAME =orcl) ##实例名
)
)
查看监听状态
[oracle@oracle admin]$ lsnrctl status
LSNRCTL for Linux: Version 11.2.0.1.0 - Production on 06-MAY-2018 15:08:35
Copyright (c) 1991, 2009, Oracle. All rights reserved.
Connecting to (ADDRESS=(PROTOCOL=tcp)(HOST=)(PORT=1521))
STATUS of the LISTENER
------------------------
Alias LISTENER
Version TNSLSNR for Linux: Version 11.2.0.1.0 - Production
Start Date 06-MAY-2018 15:07:08
Uptime 0 days 0 hr. 1 min. 26 sec
Trace Level off
Security ON: Local OS Authentication
SNMP OFF
Listener Parameter File /oracle/11g/product/11.2.0/dbhome_1/network/admin/listener.ora
Listener Log File /oracle/11g/diag/tnslsnr/oracle/listener/alert/log.xml
Listening Endpoints Summary...
(DESCRIPTION=(ADDRESS=(PROTOCOL=tcp)(HOST=oracle)(PORT=1521)))
Services Summary...
Service "oracle.orcl" has 1 instance(s).
Instance "orcl", status READY, has 1 handler(s) for this service...
Service "orcl1" has 1 instance(s). ##这里的就是静态监听配置,状态为unknown
Instance "orcl", status UNKNOWN, has 1 handler(s) for this service...
Service "orclXDB.orcl" has 1 instance(s).
Instance "orcl", status READY, has 1 handler(s) for this service...
The command completed successfully
查询某服务是静态注册还是动态注册
可以使用命令lsnrctl status来查看某服务是静态注册还是动态注册。
实例状态为UNKNOWN值时表明此服务是静态注册的设置。这时监听器用来表明它不知道关于该实例的任何信息,只有当客户发出连接请求时,它才检查该实例是否存在。
动态注册的数据库通过状态信息中的状态READY或状态BLOCKED(对于一个备用数据库)来指明。不管关闭何时数据库,动态注册的数据库都会动态地从 监听器注销,而与之相关的信息将从状态列表中消失。这样,不管数据库是在运行还是已经关闭,监听器总是知道它的状态。该信息将被用于连接请求的回退(fallback)和负载平衡。
转载请注明来源,欢迎对文章中的引用来源进行考证,欢迎指出任何有错误或不够清晰的表达。可以在下面评论区评论,也可以邮件至 289211569@qq.com