天天看点

Oracle Listener的静态注册和动态注册

关于静态注册和动态注册的各种Blog看了n多遍,结果发现其实每次都是看看而已,没当回事。就知道listener.ora很重要,里面的内容向来是拿现成的Copy过来。

今天总算是搞明白自己通常做的是静态注册:

静态注册的监听实例状态为unknow,只有客户端请求连接到实例时候才会去检查实例是否存在。

动态注册的监听实例为ready或者blocked状态,不管数据库何时关闭和启动这时候的监听都能时时动态刷新正确的数据库信息,不管数据库是什么状态,监听都能知道。

# listener.ora Network Configuration File: C:\Oracle\product\11.1.0\db_1\network\admin\listener.ora

# Generated by Oracle configuration tools.

SID_LIST_LISTENER =

(SID_LIST =

   (SID_DESC =

      (SID_NAME = PLSExtProc)

      (ORACLE_HOME = C:\Oracle\product\11.1.0\db_1)

      (PROGRAM = extproc)

    )    

    (SID_DESC =

      (GLOBAL_DBNAME =MYTESTDB)

      (SID_NAME = ORACLE)

      (ORACLE_HOME = C:\Oracle\product\11.1.0\db_1)

     )

)

>lsnrtcl stauts:

Services Summary...

Service "MYTESTDB" has 1 instance(s).

  Instance "ORACLE", status UNKNOWN, has 1 handler(s) for this service...

Service "PLSExtProc" has 1 instance(s).

  Instance "PLSExtProc", status UNKNOWN, has 1 handler(s) for this service...

The command completed successfully

GLOBAL_DBNAME =MYTESTDB就是Service,当然没有GLOBAL_DBNAME =MYTESTDB这一行也可以,这样的话SID_NAME = ORACLE就是Service。

==================================================================================================================

尝试了一下动态注册,动态注册就是在listener.ora啥也没写。。。

动态注册是在instance启动的时候PMON进程根据init.ora中的instance_name,service_names两个参数将实例和服务动态注册到listener中。

首先,确认init.ora中没有指定instance_name,service_names两个参数。

修改listener.ora

# listener.ora Network Configuration File: C:\Oracle\product\11.1.0\db_1\network\admin\listener.ora

# Generated by Oracle configuration tools.

SID_LIST_LISTENER =

(SID_LIST =

   (SID_DESC =

      (SID_NAME = PLSExtProc)

      (ORACLE_HOME = C:\Oracle\product\11.1.0\db_1)

      (PROGRAM = extproc)

    )    

)

>lsnrtcl stauts:

Services Summary...

Service "PLSExtProc" has 1 instance(s).

  Instance "PLSExtProc", status UNKNOWN, has 1 handler(s) for this service...

The command completed successfully

>sqlplus / as sysdba

SQL>startup;

>lsnrctl status:

Service "ORACLE" has 1 instance(s).

  Instance "oracle", status READY, has 1 handler(s) for this service...

Service "ORACLE_XPT" has 1 instance(s).

  Instance "oracle", status READY, has 1 handler(s) for this service...

Service "PLSExtProc" has 1 instance(s).

  Instance "PLSExtProc", status UNKNOWN, has 1 handler(s) for this service...

The command completed successfully

>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>

Service "ORACLE_XPT" 是神马?

Google一下,这个Service(DBNAME_XPT)是用于Data Guard环境,可以设置动态隐含参数“__dg_broker_service_names”为空,可以禁用改service注册。

SQL> alter system set "__dg_broker_service_names" = '';

System altered.

SQL>

重启lister

>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>

SQL> show parameter service_names

NAME                                 TYPE

------------------------------------ ----------------------

VALUE

------------------------------

service_names                        string

ORACLE

SQL> show parameter instance_name

NAME                                 TYPE

------------------------------------ ----------------------

VALUE

------------------------------

instance_name                        string

oracle

SQL>

原来如果没有指定instance_name,service_names,Oracle会找到db_name,db_domain值来注册。而DB_name对数据库来说却是必须的,也就是说动态注册是默认进行的。当然,建议使用显示指定instance_name,service_names参数,因为不显示设置情况下,只有当数据库在监听器运行之后启动时,动态注册才会发生;而且如果监听器重启,动态注册信息将会丢失。

或者可以在数据库open后执行:

SQL>alter system  register;--手动注册,保证注册信息不丢失

****************************************************************************************************************************

顺便了解下什么是instance_name,service_names,db_name,db_domain,ORACLE_SID?

ORACLE_SID是系统环境变量,其值必须和instance_name保持一致

instance_name ORACLE数据库的参数,show parameter instance_name,一个数据库可以有多个实例名;

          RAC环境中,必须将集群中每个实例的instance_name参数设置为一个唯一的值。

service_names ORACLE数据库的参数,show parameter service_names,对应一个数据库而不是实例,一个数据库可以有多个服务名(逗号隔开即可)

db_name是数据库的唯一标识(db_domain帮助db_name唯一标识数据库)