多个监听器必须使用不同端口或不同ip,仅改名称无效;实例需通过local_listener参数向各监听器动态注册,且注册地址须为客户端可达的业务ip,否则出现“监听器运行但服务不可见”。

多个监听器必须用不同端口或不同IP,不能只改名字
监听器名称(如 LISTENER、LISTENER2)只是配置标识,真正起作用的是 ADDRESS 中的 PORT 和 HOST。如果两个监听器都写 (PORT = 1521) 且绑定到同一 IP,启动时第二个会报 TNS-01106: Listener using listener name LISTENER2 has already been started 或直接失败。
常见错误现象:修改了 listener.ora 加了 LISTENER2,lsnrctl start LISTENER2 成功,但 lsnrctl status LISTENER2 显示 “The listener supports no services”——本质是没注册上,不是监听器没起来。
- 端口必须不冲突:比如
LISTENER用1521,LISTENER2就得用1522、2000等未被占用端口 - IP 绑定要明确:避免用
HOST = localhost或主机名,优先写具体 IP(如192.168.10.100),否则可能绑到127.0.0.1导致外部连不上 - 每个监听器需独立
DESCRIPTION_LIST块,不能共用一个LISTENER = ...定义
单实例想被多个监听器服务,必须用 dynamic registration + local_listener
静态注册(SID_LIST_LISTENERx)只能让一个监听器“知道”这个实例;若希望同一个实例(如 orcl)同时响应 1521 和 1522 两个端口的连接请求,必须靠 PMON 动态注册,且显式指定注册目标。
关键点在于数据库实例要知道“往哪几个地址上报自己”。这由 local_listener 参数控制,它指向 tnsnames.ora 中的一个网络别名(或内联描述),该别名必须包含所有目标监听器的 ADDRESS。
Linux 性能分析与调优专家,覆盖 CPU、内存、磁盘 I/O、网络、内核参数、编译优化、容器/K8s。适用场景:系统卡顿/高负载、内存不足/OOM/Swap 高、CPU 异常/iowait 高。
- 在
$ORACLE_HOME/network/admin/tnsnames.ora中定义一个别名,例如:ALL_LSNR = (DESCRIPTION_LIST =<br> (DESCRIPTION = (ADDRESS = (PROTOCOL = TCP)(HOST = 192.168.10.100)(PORT = 1521)))<br> (DESCRIPTION = (ADDRESS = (PROTOCOL = TCP)(HOST = 192.168.10.100)(PORT = 1522)))<br>)
- 在 SQL*Plus 中执行:
ALTER SYSTEM SET local_listener='ALL_LSNR' SCOPE=BOTH;ALTER SYSTEM REGISTER; - 验证:运行
lsnrctl services LISTENER和lsnrctl services LISTENER2,两者都应列出orcl实例的READY状态条目
tnsnames.ora 客户端连接串必须匹配监听器实际绑定的 IP 和端口
客户端能否连上,不取决于监听器叫什么,而取决于 tnsnames.ora 里写的 HOST 和 PORT 是否可达、是否和监听器实际监听的地址一致。
典型翻车场景:服务器上 LISTENER2 绑定在 192.168.10.100:1522,但客户端 tnsnames.ora 写的是 HOST = db-server,而该主机名在客户端 /etc/hosts 解析为 10.0.2.15(VirtualBox 默认网卡)——结果 tnsping 通但 sqlplus 报 ORA-12541: TNS:no listener。
- 最稳妥做法:客户端
tnsnames.ora的HOST直接写监听器实际绑定的 IP(如192.168.10.100),不写主机名 - 如果必须用主机名,确保客户端
/etc/hosts中该主机名**只映射一个 IP**,且是监听器所绑定的那个业务 IP - 检查防火墙:
iptables -L -n | grep 1522或firewall-cmd --list-ports,确认新端口已放行
LOCAL_LISTENER 参数设错会导致服务“存在但不可见”
即使监听器进程跑着、端口也开着,只要数据库实例没成功注册进监听器的服务列表,客户端就查不到服务名,lsnrctl services 里看不到 INSTANCE_NAME 条目,这是最常见的“监听器配了但连不上”的原因。
LOCAL_LISTENER 必须指向一个客户端能访问的地址——不是数据库服务器本地的 127.0.0.1,也不是仅内网可达的私有 IP,而是客户端网络能路由到的那个 IP(通常是业务网卡 IP 或 VIP)。
- 错误示例:
ALTER SYSTEM SET local_listener='(DESCRIPTION=(ADDRESS=(PROTOCOL=TCP)(HOST=127.0.0.1)(PORT=1522)))';→ 注册到了回环地址,外部连不上 - 正确做法:用
ip addr show查出业务网卡 IP(如ens192: <...> inet 192.168.10.100/24</...>),然后设为该 IP - 设完立即执行
ALTER SYSTEM REGISTER;,不要等 PMON 默认 60 秒周期 - 验证注册是否生效:
lsnrctl services LISTENER2输出中要有类似Service "orcl" has 1 instance(s). Instance "orcl", status READY










