Oracle动态注册与静态注册

  1. Oracle动态注册与静态注册
    1. 动态注册
    2. 静态注册
    3. 查询某服务是静态注册还是动态注册

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