
点击蓝字 关注我们

监听器listener,全名叫做Oracle Net Listener,它是一个服务器端进程,用来监听来自客户端的连接请求和管理到数据库的通信。Oracle有一个默认的监听器叫做LISTENER,端口是1521,用过netca创建监听器的话肯定会知道,利用它就可以不通过listener.ora配置文件,就是说就算删除掉listener.ora的情况下,监听也可以正常启动。
服务注册就是将数据库作为一个服务注册到监听器中,有2种注册方式:动态注册和静态注册。
01
动态注册
在实例启动时,PMON进程会每分钟根据service_names和db_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、达梦等主流商业和开源数据库。并成为首批国内达梦战略合作伙伴之一,拥有海量经验和完善的人员培养体系。并同时提供超融合,私有云整体解决方案。





