Oracle多监听器需确保端口唯一、名称独立、listener.ora配置完整,且必须设置LOCAL_LISTENER参数并执行ALTER SYSTEM REGISTER;Windows下还需为每个监听器创建独立Windows服务。
监听器端口冲突导致 lsnrctl start 失败
oracle 默认只启一个监听器(listener),若想加第二个,不能直接复制配置再 start——系统会报 tns-12546: tns:permission denied 或更常见的 tns-12545: connect failed because target host or object does not exist,本质是端口被占或 listener.ora 语法不合法。
实操要点:
- 每个监听器必须有唯一名称,如
LISTENER和LISTENER2,不能都叫LISTENER - 端口不能重复,且避开系统保留端口(
1024以下需 root 权限,生产环境建议用1522、1523等) -
listener.ora中每个监听器块必须完整独立,含DESCRIPTION_LIST、ADDRESS、PROTOCOL、HOST、PORT - 改完后必须运行
lsnrctl reload(不是stop/start),否则新配置不生效
tnsnames.ora 需为每个监听器配独立连接别名
客户端连哪个端口,取决于 tnsnames.ora 里写的 PORT 和 SERVICE_NAME,不是监听器名字。如果只改了 listener.ora 却没同步更新 tnsnames.ora,sqlplus user/pass@alias 会一直连老端口。
常见错误现象:新增的 LISTENER2 能 lsnrctl status LISTENER2 看到,但客户端死活连不上。
实操要点:
- 每个监听器对应至少一个
tnsnames.ora别名,例如ORCL_1522和ORCL_1523 -
HOST值要和监听器实际绑定的网卡一致(localhost≠127.0.0.1在某些 Oracle 版本有差异) -
SERVICE_NAME必须和数据库实际注册的服务名一致(查SELECT value FROM v$parameter WHERE name = 'service_names';) - 别名中
PORT必须和listener.ora里该监听器的PORT完全匹配
动态服务注册失败:数据库没向新监听器“报到”
即使两个监听器都 status 显示正常,也可能只有默认监听器(LISTENER)看到数据库实例。新监听器里 Services Summary 下空空如也,说明数据库没主动注册过去。
根本原因:Oracle 数据库默认只向 LOCAL_LISTENER 参数指定的监听器注册;不设就只认 LISTENER。
实操要点:
- 登录数据库执行:
ALTER SYSTEM SET LOCAL_LISTENER='(DESCRIPTION=(ADDRESS=(PROTOCOL=TCP)(HOST=localhost)(PORT=1522)))' SCOPE=BOTH; - 若要同时注册到多个监听器,得用
REMOTE_LISTENER配合tnsnames.ora别名(例如REMOTE_LISTENER = "LISTENERS_ORCL",并在tnsnames.ora定义该别名指向多个地址) - 执行后必须运行
ALTER SYSTEM REGISTER;强制立即注册,否则等 60 秒默认间隔 - 检查是否成功:
lsnrctl services LISTENER2应出现你的SERVICE_NAME和INSTANCE_NAME
Windows 下服务名冲突:多个监听器不能共用同一个 Windows 服务
在 Windows 平台,每个监听器必须对应一个独立的 Windows 服务(如 OracleOraDB21Home1TNSListener),否则 net start 只能启一个,第二个报 服务名无效 或直接静默失败。
这是 Linux/Unix 下没有的问题,但 Windows 用户极易踩坑。
实操要点:
- 用
lsnrctl启动监听器只是进程级,要开机自启必须注册为 Windows 服务 - 新增监听器前,先用
oradim -new -sid ORCL -intpwd xxx -startmode manual创建基础服务(可跳过) - 真正关键命令是:
ORADIM -NEW -SID LISTENER2 -STARTMODE auto -SRVC OracleOraDB21Home1TNSListener2(SRVC名必须全局唯一) - 注册完再用
lsnrctl start LISTENER2,此时它才真正绑定到 Windows 服务 -
services.msc里应能看到两个不同名称的 OracleTNSListener 服务
多监听器不是堆配置就能跑通的事——端口、服务名、注册路径、客户端路由,四者错一个,连不上就是连不上。最常被忽略的是 LOCAL_LISTENER 没设,以及 Windows 下忘了建第二服务。










