暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

运维日记|Oracle监听的静态注册和动态注册

新运维新数据 2020-09-16
5356

点击蓝字 关注我们


监听器listener,全名叫做Oracle Net Listener,它是一个服务器端进程,用来监听来自客户端的连接请求和管理到数据库的通信。Oracle有一个默认的监听器叫做LISTENER,端口是1521,用过netca创建监听器的话肯定会知道,利用它就可以不通过listener.ora配置文件,就是说就算删除掉listener.ora的情况下,监听也可以正常启动。


服务注册就是将数据库作为一个服务注册到监听器中,有2种注册方式:动态注册静态注册


01

动态注册


在实例启动时,PMON进程会每分钟根据service_namesdb_unique_name这2个参数将实例和服务注册到监听器中,也可以通过alter system register命令手工注册。


动态注册默认只注册到默认的监听器上(端口为1521),这是因为PMON进程只会动态注册端口为1521的监听,如果想创建新监听,则需要在listener.ora中配置参数,格式为:


LISTENER_NAME =

  (DESCRIPTION_LIST =

    (DESCRIPTION =

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

    )

  )


同时修改参数local_listener,格式为:(ADDRESS=(PROTOCOL=tcp)(HOST= ...)(PORT=...)),多个参数以逗号隔开。


新增监听端口


在监听端口1521的基础上,新增监听端口1522,下面来举例说明:


1.配置listener.ora参数,新增LISTENER2,监听端口为1522


2.修改local_listener参数,配置监听地址


alter system set local_listener='(ADDRESS=(PROTOCOL=tcp)(HOST=192.168.211.106)(PORT=1522))','(ADDRESS=(PROTOCOL=tcp)(HOST=192.168.211.106)(PORT=1521))';



3.查看LISTENER和LISTENER2监听状态,成功注册


02

静态注册


静态注册就是实例启动时读取listener.ora文件的配置,将实例和服务名注册到监听器中。静态注册时,listener.ora中的GLOBAL_DBNAME提供服务名,listener.ora中的SID_NAME提供注册的实例名。


listener.ora的静态监听格式为:

SID_LIST_LISTENER =

  (SID_LIST =

    (SID_DESC =

      (GLOBAL_DBNAME = <db_name>)

      (ORACLE_HOME = <oracle_home>)

      (SID_NAME = <oracle_sid>)

    )

  )


配置静态注册监听


1.listener.ora文件中配置静态注册


2.重启监听,查看监听状态,可以发现静态注册的默认端口是1521,状态和动态注册不同,是UNKNOWN



03

动态注册和静态注册的区别


1.静态注册,在实例没有启动时就可以连接(sys用户),可以用于远程启动实例,而动态注册必须在mount阶段才可以连接。


2.静态注册的实例,状态是UNKNOWN,而动态注册的实例,在数据库处于nomout阶段,状态是BLOCKED,mounth和open阶段是ready。


3.静态注册无法配置端口,默认是1521,不需要修改local_listener参数。动态注册可以修改端口,需要修改local_listener参数。


04

举例说明在工作中遇到的监听问题


通过duplicate方式搭建DG,用rman连接主备库的时候,会遇到ORA-12528:  TNS:listener: all appropriate instances are blocking new connections。



出现这个错误的原因是备库的实例处于nomount阶段,所以没有被注册在监听里,当处于mount阶段时,PMON进程才会注册实例到监听,因此,从监听状态来看,实例为blocked状态。



结合MOS上的文章419440.1,下面给出常用的2个方案:


1. 在备库的listener.ora中注册静态监听

格式为:

SID_LIST_LISTENER =

  (SID_LIST =

    (SID_DESC =

      (GLOBAL_DBNAME = <db_name>)

      (ORACLE_HOME = <oracle_home>)

      (SID_NAME = <oracle_sid>)

    )

  )



重启监听后,查看监听状态。


2. 使用Oracle10G的特性,在tnsname文件中,在备库的连接串中加入(UR=A),但此方法不适用于ACTIVE DUPLICATE

格式为:

<auxiliary service> =

  (DESCRIPTION =

    (ADDRESS = (PROTOCOL = TCP)(HOST = <host_name>)(PORT = 1521))

    (CONNECT_DATA =

      (SERVER = DEDICATED)

      (SERVICE_NAME = <service_name>)(UR=A)

    )

  )


测试连接方法:

1. sqlplus sys/<password>@<auxiliary service> as sysdba

2. startup nomount

3. shutdown immediate;

4. exit

5. sqlplus sys/<password>@<auxiliary service> as sysdba

6. startup nomount;


美创运维中心数据库服务团队拥有Oracle ACE 1人、OCM 10余人、数十名Oracle OCP、MySQL OCP、红帽RHCA、中间件weblogic、tuxedo认证、达梦工程师 ,著有《Oracle DBA实战攻略》,《Oracle数据库性能优化方法和最佳实践》,《Oracle内核技术揭秘》等多本数据运维优化书籍。目前运维各类数据库合计2000余套,精通Oracle、MySQL、SQLServer、DB2、PostgreSQL、达梦等主流商业和开源数据库。并成为首批国内达梦战略合作伙伴之一,拥有海量经验和完善的人员培养体系。并同时提供超融合,私有云整体解决方案。



文章转载自新运维新数据,如果涉嫌侵权,请发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

评论