现象:
客户端连接报错ora-12505,查询集群资源发现一个listener节点报错,not all endpoints registered。这个错误一般是oracle用户启动监听导致,一般是grid来启动,但是排查发现不是这种情况。


1.oracle用户查看监听发现是mgmtlsnr的监听,而不是listener
lsnrctl status

2.查看日志
tail -100f /u01/app/grid/diag/tnslsnr/bgqdb01/listener/trace/listener.log
报错信息:可以看出应该是启动listener但是和已经存在的进程导致的地址冲突。
Error listening on: (ADDRESS=(PROTOCOL=TCP)(RATE_LIMIT=YES)(HOST=x.x.104.42)(PORT=1521)(IP=FIRST))
Dynamic address is already listened on (DESCRIPTION=(ADDRESS=(PROTOCOL=tcp)(HOST=192.168.101.86)(PORT=1521)))
02-SEP-2025 12:55:09 * service_register * LsnrAgt * 12542
TNS-12542: TNS:address already in use
TNS-12560: TNS:protocol adapter error
TNS-00512: Address already in use
Linux Error: 98: Address already in use3.重启监听和重启crs分别观察
srvctl stop listener
srvctl stop scan_listener
srvctl start listener
srvctl start scan_listener
/u01/app/12.1.0/grid/bin/crsctl stop crs
/u01/app/12.1.0/grid/bin/crsctl start crs
重启后还是报错,错误信息,intermediate,not all endpoints registered

4.停止监听后查看grid和oracle用户的监听状态
srvctl stop listener
su - grid
lsnrctl status grid用户的监听停止

su - oracle
lsnrctl status oracle用户发现还是有监听存在,并且监听的别名是MGMTLSNR

正常的状态应该是如下,提示没有监听,但是现在注册到了mgmtlsnr监听

5.核对监听配置文件 两个监听的都是1521端口
srvctl config listener -l MGMTLSNR
srvctl config listener -l LISTENER

6.重新配置监听
su - grid
export DISPLAY=x.x.9.219:0.0
netca
reconfiguration的时候会出现端口被占用。但是这上面就一个数据库实例,初步怀疑是mgmtlsnr导致的。
Use another port number.Pont 1521 provided for this listener is already in use on nodes of Oracle clusterware.Re-enter different information.

7.mgmtlsnr介绍
oracle12c及之后的版本,是一个引入的管理监听器,专门用于oracle集群组件之间的通信,通常运行在1521端口。处理集群管理相关的连接,不用于常规数据库连接。
用于业务的数据库连接的监听器是lsnrctl,也是运行在1521端口,但是绑定的ip地址不同。
mgmtlsnr:私有网络ip,运行在grid下,只在一个节点上运行。
listener:公有网络ip,运行在grid下,在rac两个节点上运行。
8.问题剖析
数据库监听器listener在一个节点上无法启动,因为要绑定公网的ip104.42的1521端口被占用。占用的就是mgmtlsnr管理监听器。
问题的节点分别用grid和oracle用户执行,发现104.42业务ip出现在了mgmtlsnr里面,同时这个地址应该也要在listener中启动,但是同一个地址不可能绑定两个监听,所以导致了地址冲突。


9.查看1521端口
netstat -tulnp | grep 1521 发现104.42已经被mgmtlsnr监听进程占用,listener监听无法绑定到104.42的1521端口。

10.查看集群网络
oifcfg getif 发现有2个私网地址

11.最终处理
修改listener文件,之前没有具体的host地址;手动指定监听的ip地址,排除掉104.42。
MGMTLSNR =
(DESCRIPTION =
(ADDRESS_LIST =
(ADDRESS = (PROTOCOL = IPC)(KEY = MGMTLSNR))
(ADDRESS = (PROTOCOL = TCP)(HOST = 192.168.0.7)(PORT = 1521))
(ADDRESS = (PROTOCOL = TCP)(HOST = xx.254.17.31)(PORT = 1521))
)
)srvctl stop listener
ps -ef|grep tns
kill -9 xx 杀掉mgmtlsnr进程

srvctl start listener重启
发现两个监听都正常了。





