listener静态注册与动态注册

一、       什么是注册

在数据库服务器和客户端之间有一监听程序(listener),当数据库服务器启动过程中,数据库服务器默认的会将两条信息注册到监听器中:数据库服务器对应的实例名和服务名。当客户端需要连接数据库时,客户端不需要知道数据库名和实例名,只需要知道该数据库对外提供的服务名就可以申请连接到数据库。服务名可能与实例名一样,也有可能不一样。

二、       静态注册

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

静态注册时listener.ora中的global_dbname(即init.ora中的servive_names)向外提供服务名,sid_name(即init.ora中的instance_name)提供注册的实例名

1、          默认静态注册

l  配置listener.ora

SID_LIST_LISTENER =  //名字要用默认的监听器的名字“LISTENER”
  (SID_LIST =
     (SID_DESC =
        (SID_NAME = PLSExtProc)
        (ORACLE_HOME = d:\oracle)
        (PROGRAM = extproc)
     ) //用于plsql调用外部程序,如c、java程序等,可根据需要配置,非必须项
     (SID_DESC =
        (SID_NAME = chenl)
        (ORACLE_HOME = d:\oracle)

(global_dbname=chenl)

//global_dbname为非必须项,若不指定则默认为db_name+db_domain
    )
  )

 

l  lsnrctl  start(或者lsnrctl  start  listener)//静态注册到默认的监听器“listener”上

2、          非默认静态注册

l  配置listener.ora

  SID_LIST_CHENL =
  (SID_LIST =
     (SID_DESC =
       (SID_NAME = PLSExtProc)
       (ORACLE_HOME = d:\oracle)
       (PROGRAM = extproc)
     )
     (SID_DESC =
       (SID_NAME = chenl)
       (ORACLE_HOME = d:\oracle)

(global_dbname=chenl)   //非必须项,默认为db_name+db_domain
      )
)

 

CHENL =
  (DESCRIPTION_LIST =
     (DESCRIPTION =
        (ADDRESS_LIST =
           (ADDRESS = (PROTOCOL = TCP)(HOST = 172.16.15.99)(PORT

=1522))
        )
     )
  )

l  lsnrctl  start  chenl (静态注册到非默认的监听器“chenl”上)

注意:此时如果使用 lsnrctl start 将动态注册到默认的监听器“listener”上

三、动态注册

动态注册是在实例启动时PMON进程根据init.ora中的service_names和instance_name将服务和实例动态注册到监听中。           如果instance_name没有设定值,它将取init.ora中的db_name的值,在只有单个实例运行的情况下,您可以不必设置该参数,但如果在RAC中,您必须保证每个实例的instance_name参数值唯一;如果service_names没有设定值,将拼接init.ora中的db_name和db_domain参数来注册。

可以在sqlplus下通过show parameter service_names 和show parameter instance_name 查看这两个参数的值。

如果没有显示设置service_names和instance_name的值,那么数据库仅在监听器运行之后启动时,动态注册才会发生。如果监听器在数据库运行过程中重启,动态注册信息将会丢失。

 如果显示设置了service_names和instance_name的值,如果监听器在数据库运行过程中重启,数据库的PMON进程将在很短时间内完成动态注册。

1、          默认动态注册

动态注册默认会注册到默认的监听器上(名称是LISTENER,端口是1521,协议是TCP),无需配置listener.ora文件即可完成注册。

l  lsnrctl star或lsnrctl start listener //可启动默认动态注册;

l  SQL>alter system register;(手动注册加快lsnrctl start 之后的注册速度,不然需要等待一分钟的时间)。

2、          非默认动态注册

需要手动在配置文件中指定端口号。即在服务器端需配置listener.ora与tnsnames.ora(根据loca_listener的设置方式不同来看是否需要配置此项)、在数据库中设置loca_listener参数

 

l  配置服务器端的listener.ora

CHENL =
  (DESCRIPTION_LIST =
     (DESCRIPTION =
        (ADDRESS_LIST =
           (ADDRESS = (PROTOCOL = TCP)(HOST = 172.16.15.99)(PORT  

=1522))
        )
     )
  )

l  配置服务器端的tnsnames.ora

CHENL=  //注意服务名必须与listener.ora中的监听名一致

  (DESCRIPTION =

     (ADDRESS_LIST =

(ADDRESS = (PROTOCOL = TCP)(HOST = 172.16.8.25)(PORT =

1522))

                )

    (CONNECT_DATA =

      (SERVER = DEDICATED)

      (SERVICE_NAME = chenl)

    )

  )

注:客户端tnsnames.ora中的服务名可以与服务器的监听名不一致

l  配置local_listener参数

SQL>alter system set local_listener = 'chenl';

// 监听名必须与服务器端tnsnames.ora文件的网络服务名一致

 

  如果使用下面方式设置local_listener参数,则不需要在服务器端tnsnames.ora中配置对应的服务名,只需要配置listener.ora这一步,然后执行下面参数:

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

l  lsnrctl  start  chenl

四、   查询某服务是静态注册还是动态注册

可以用lsnrctl  status来查看某服务是静态注册还是动态注册:

l  实例状态为UNKNOWN时表明此服务是静态注册的,这时监听器不知道关于该实例的任何信息,只有当客户发出连接请求时,它才检查该实例是否存在。

l  实例状态为READY或状为BLOCKED时表明此服务为动态注册。

posted on 2012-10-12 15:27  ourstory is on the road  阅读(457)  评论(0编辑  收藏  举报