动态监听和静态监听的区别

动态监听和静态监听主要区别是实例向监听注册的方式。注册,就是让监听能够找到数据库实例。

一、动态监听
1.动态注册不需要显示的配置listener.ora文件,实例启动的时候,
PMON进程根据instance_name,service_name参数将实例和服务动态注册到listerer中。
如果没有设定instance_name,将使用db_name初始化参数值。
如果没有设定service_names,将拼接db_name和db_domain参数值来注册监听。
注意:Oracle_SID从ORACLE 10G开始,参数文件不再记录INSTANCE_NAME,此时INSTANCE_NAME动态从系统ORACLE_SID获得来保持一致。

优点:
1)lsnrctl start后不需要人工干预,会自动注册数据库的instance_name,service_name,然后tns不论使用SID和SERVICE_NAME均可以连接上来
2)修改了SERVICE_NAME或者SID不用修改listener.ora文件
3)动态注册的数据库通过状态信息中的状态READY或状态BLOCKED(对于一个备用数据库)来指明。
缺点:
1)动态监听是数据库启动时注册到监听的,一旦数据库关闭,用户无法连接

二、静态监听

1.静态注册指实例启动时读取listener.ora配置文件,将实例和服务注册到监听程序。
静态监是一种硬编码,静态监听硬编码的部份是ORACLE_HOME以及ORACLE_SID

lsnrctl status 中显示如下:
服务摘要...
服务“docarejt”包含1个实例
   实例“docare”,状态UNKOWN,包含此服务的一个处理程序
注释:docarejt即从监听配置文件中GLOBAL_DBNAME读到的值,docare则从SID_NAME读到的值

三、两种监听的对比

如果说看完这幅图还不清楚GLOBAL_DBNAME是什么意思,那我也无语了,有些人说GLOBAL_DBNAME是我们在dbca时让我们输入的GLOBAL DABASE NAME,那完全是不对的,这里的GLOBAL_DBNAME只是一个服务名而已,说到这里我想大家都明白了,还不明白可以给我回贴,我用实验演示给给你看。

 

 四、示例

说明:1521、1524端口静态监听,1522、1523端口动态监听

listener.ora配置

复制代码
SID_LIST_LISTENER =
  (SID_LIST =
    (SID_DESC =
      (GLOBAL_DBNAME = test01)
      (ORACLE_HOME = D:\Oracle\product\11.2.0\dbhome_1)
      (SID_NAME = DOCARE)
    )
  )

SID_LIST_LISTENER1524 =
  (SID_LIST =
    (SID_DESC =
      (GLOBAL_DBNAME = test04)
      (ORACLE_HOME = D:\Oracle\product\11.2.0\dbhome_1)
      (SID_NAME = DOCARE)
    )
  )

LISTENER =
  (DESCRIPTION_LIST =
    (DESCRIPTION =
      (ADDRESS_LIST = 
        (ADDRESS = (PROTOCOL = TCP)(HOST = HISDB)(PORT = 1521))
      )
    )
  )

LISTENER1522 =
  (DESCRIPTION_LIST =
    (DESCRIPTION =
      (ADDRESS_LIST = 
        (ADDRESS = (PROTOCOL = TCP)(HOST = HISDB)(PORT = 1522))
      )
    )
  )

LISTENER1523 =
  (DESCRIPTION_LIST =
    (DESCRIPTION =
      (ADDRESS_LIST = 
        (ADDRESS = (PROTOCOL = TCP)(HOST = HISDB)(PORT = 1523))
      )
    )
  )

LISTENER1524 =
  (DESCRIPTION_LIST =
    (DESCRIPTION =
      (ADDRESS_LIST = 
        (ADDRESS = (PROTOCOL = TCP)(HOST = HISDB)(PORT = 1524))
      )
    )
  )
复制代码

tnsnames.ora 配置

复制代码
test01 =
  (DESCRIPTION_LIST =
    (DESCRIPTION =
      (ADDRESS_LIST = 
        (ADDRESS = (PROTOCOL = TCP)(HOST = HISDB)(PORT = 1521))
      )
    )
  )

test02 =
  (DESCRIPTION_LIST =
    (DESCRIPTION =
      (ADDRESS_LIST = 
        (ADDRESS = (PROTOCOL = TCP)(HOST = HISDB)(PORT = 1522))
      )
    )
  )

test03 =
  (DESCRIPTION_LIST =
    (DESCRIPTION =
      (ADDRESS_LIST = 
        (ADDRESS = (PROTOCOL = TCP)(HOST = HISDB)(PORT = 1523))
      )
    )
  )

test04 =
  (DESCRIPTION_LIST =
    (DESCRIPTION =
      (ADDRESS_LIST = 
        (ADDRESS = (PROTOCOL = TCP)(HOST = HISDB)(PORT = 1524))
      )
    )
  )
复制代码

注释:tnsname.ora的名称需要跟listener.ora的global_name要相对应,tnsname.ora文件中test01 、test04在listener.ora中的静态监听已经声明了(GLOBAL_DBNAME的值),

          而test02、test03则在动态监听service_name参数(或local_listener参数)定义了,所以tnsname.ora声明的连接符都可以使用(如在service_name没有声明,有可能用不了)。

 

posted @   江曹  阅读(804)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· 单线程的Redis速度为什么快?
· SQL Server 2025 AI相关能力初探
· AI编程工具终极对决:字节Trae VS Cursor,谁才是开发者新宠?
· 展开说说关于C#中ORM框架的用法!
点击右上角即可分享
微信分享提示