oracle监听 动态注册与静态注册  

一、什么是注册

注册就是将数据库作为一个服务注册到监听程序中。客户端不需要知道数据库名和实例名,只需要知道该数据库对外提供的服务名就可以申请链接到数据库。这个服务名可以与数据库名一样,也有可能不一样。

在数据库服务启动的过程中,数据库服务器会像监听程序注册相应的服务,无论何时启动数据库,默认的都有两条信息注册到监听器中,数据库服务器对应的实例和服务,客户端和服务器之间的链接,只需要提供一个服务名就可以了。

二、区分动态注册和静态注册

(1)使用listener.ora文件判断

动态注册

SID_LIST_LISTENER =
  (SID_LIST =
    (SID_DESC =
      (PROGRAM = extproc)
      (SID_NAME = PLSExtProc)
      (ORACLE_HOME = D:\oradata\orcl)
    )
  )

静态注册

SID_LIST_LISTENER =
  (SID_LIST =
    (SID_DESC =
      (PROGRAM = extproc)
      (SID_NAME = PLSExtProc)
      (ORACLE_HOME = D:\oradata\orcl)
    )
    (SID_DESC =
      (GLOBAL_DBNAME = orcl)
      (ORACLE_HOME = D:\oradata\orcl)
      (SID_NAME = ORCL)
    )
    (SID_DESC =
      (GLOBAL_DBNAME = orcl1)
      (ORACLE_HOME = D:\oradata\orcl)
      (SID_NAME = ORCL)
    )
  )

通过查看虽然可以大致看出,但是这种方法并不能和明确的现实数据库在运行时的实际情况

(2)使用lsnrctl status命令

 

三、动态注

动态注册是在instance启动的时候PMON(Process Monitor进程监视器)进程根据INIT.ORA中的instance_name,service_name两个参数将实例和服务注册到监听器中.

动态注册时的listener.ora的文件内容如下

SID_LIST_LISTENER =
  (SID_LIST =
    (SID_DESC =
      (PROGRAM = extproc)
      (SID_NAME = PLSExtProc)
      (ORACLE_HOME = D:\oradata\orcl)
    )
  )

由于动态注册需要pmon进程,所以监听必须在数据库启动之前启动,否则动态注册将失败;在数据库运行的过程中,如果重启监听也会造成动态注册失败

动态注册只是注册默认的监听器上(名称是listener、端口是1521、协议时TCP),如果需要向非默认的监听注册,则需要改变local_listener参数

将监听的信息添加到tnsnames.ora  文件中。 注意,是tnsnames.ora 文件, 因为pmon在动态注册监听时要从tnsnames.ora中读取相关信息。

LISTENER =

(DESCRIPTION =

(ADDRESS = (PROTOCOL = TCP)(HOST = DaveDai)(PORT = 1522))

)

 然后以sys用戶运行:

SQL> alter system set local_listener=listener;

SQL> alter system register;

或者:

SQL> alter system set LOCAL_LISTENER='(ADDRESS = (PROTOCOL = TCP)(HOST = DaveDai)(PORT = 1522))';

SQL> alter system register;

动态注册的好处是简单方便,但是容易发生注册失败

四、静态注册

静态注册就是实例启动时读取listener.ora文件的配置,将实例和服务注册到监听程序中

静态注册时的listener.ora中的内容如下

SID_LIST_LISTENER =
  (SID_LIST =
    (SID_DESC =
      (PROGRAM = extproc)
      (SID_NAME = PLSExtProc)
      (ORACLE_HOME = D:\oradata\orcl)
    )
    (SID_DESC =
      (GLOBAL_DBNAME = orcl)
      (ORACLE_HOME = D:\oradata\orcl)
      (SID_NAME = ORCL)
    )
    (SID_DESC =
      (GLOBAL_DBNAME = orcl1)
      (ORACLE_HOME = D:\oradata\orcl)
      (SID_NAME = ORCL)
    )
  )

golbal_dbname是数据库对外提供的服务名,sid_name是实例名,该文件说明数据库是单实例数据库,实例名为orcl,向外提供了两个服务orcl和orcl1.

静态注册的好处可以总结为

1、监听不是最早启动

2、数据库运行期间,监听发成重启

3、oracle实例还没有open

当发生上述三种情况时,不会发生监听注册失败。