一个oracle实例可同时向多个监听器注册,但必须显式配置local_listener或remote_listener,否则pmon仅默认注册到listener(1521端口);监听器名称与端口须唯一,host不能写localhost/127.0.0.1,tnsnames.ora需为每个监听器配独立别名且port严格匹配,注册后须执行alter system register强制生效。

一个 Oracle 实例可以同时向多个监听器注册,但必须显式配置 LOCAL_LISTENER 或 REMOTE_LISTENER,否则 PMON 只会默认注册到 LISTENER(端口 1521)。直接复制 listener.ora 块、改个端口就 start,90% 情况下客户端连不上。
listener.ora 中监听器名称和端口必须唯一且显式声明
每个监听器块必须有独立名称(如 LISTENER、LISTENER2),不能都叫 LISTENER;端口不能重复,也别用 1–1023(Linux/Unix 需 root,Windows 需管理员权限)。
-
LISTENER和LISTENER2是两个完全独立的监听器进程,启动命令也不同:lsnrctl start只启前者,lsnrctl start LISTENER2才启后者 - 每个监听器块必须含完整
DESCRIPTION_LIST和至少一个ADDRESS,HOST不能写localhost或127.0.0.1——否则只监听回环地址,远程连不上;得填服务器真实 IP 或可解析主机名 - 改完后执行
lsnrctl reload仅对已运行的监听器生效;若新增监听器,必须lsnrctl start LISTENER2,不是 reload - 验证是否绑定正确:Linux 下跑
netstat -an | grep :1522,看输出里有没有你的 IP + 端口;Windows 用netstat -ano | findstr :1522
tnsnames.ora 必须为每个监听器配独立别名,且 PORT 要严格匹配
客户端连哪个监听器,完全取决于 tnsnames.ora 里写的 PORT 和 SERVICE_NAME,跟监听器名字无关。只改 listener.ora 却不改 tnsnames.ora,sqlplus 一定连错端口。
- 别名名随意(如
ORCL_1522),但内容里PORT=1522必须和 listener.ora 中LISTENER2的PORT完全一致 -
SERVICE_NAME必须和数据库实际服务名一致,查法:SELECT value FROM v$parameter WHERE name = 'service_names'; - 如果监听器绑的是
0.0.0.0,tnsnames.ora 里HOST可写任意能路由到该服务器的地址;但如果 listener.ora 写了具体 IP(如192.168.56.109),tnsnames.ora 的HOST就得填这个 IP 或其 DNS 名 - 别名中不要混用
ADDRESS_LIST和多个ADDRESS——那是给REMOTE_LISTENER用的,tnsnames.ora 单别名只应有一个ADDRESS
数据库实例必须主动注册到新监听器,靠 ALTER SYSTEM REGISTER 强制触发
即使 lsnrctl status LISTENER2 显示 “status: ready”,Services Summary 为空,说明实例根本没注册过去。根本原因是 Oracle 默认只向 LOCAL_LISTENER 指定的监听器注册,不设就只认 LISTENER。
- 登录数据库执行:
ALTER SYSTEM SET LOCAL_LISTENER='(DESCRIPTION=(ADDRESS=(PROTOCOL=TCP)(HOST=192.168.56.109)(PORT=1522)))' SCOPE=BOTH; - 立刻执行:
ALTER SYSTEM REGISTER;—— 不要等 PMON 自动重试(默认 60 秒),生产环境必须手动触发 - 若要同时注册到多个监听器(如 1521 和 1522),把地址写成列表:
ALTER SYSTEM SET LOCAL_LISTENER='(DESCRIPTION_LIST=(DESCRIPTION=(ADDRESS=(PROTOCOL=TCP)(HOST=...)(PORT=1521)))(DESCRIPTION=(ADDRESS=(PROTOCOL=TCP)(HOST=...)(PORT=1522))))' SCOPE=BOTH; - 注册失败时先查监听日志:
$ORACLE_HOME/network/log/listener.log,常见错误是TNS-12545(目标不可达)或TNS-00515(主机名无法解析)
Windows 下多监听器需额外创建 Windows 服务
Linux/Unix 下靠 lsnrctl start LISTENER2 就行,Windows 下必须为每个自定义监听器单独注册 Windows 服务,否则系统重启后监听器不会自动拉起。
- 以管理员身份运行命令提示符,执行:
oradim -NEW -SID LISTENER2 -INTPWD password -STARTMODE manual -SRVC LISTENER2 - 再用
sc query LISTENER2确认服务存在,然后net start LISTENER2启动 - 服务名(
LISTENER2)必须和 listener.ora 中监听器名称完全一致,大小写敏感 - 监听器服务依赖 OracleService
,确保数据库服务已启动,否则监听器可能报 TNS-12545
最容易被忽略的是:监听器名、tnsnames.ora 别名、LOCAL_LISTENER 地址三者中的端口号必须严格一致;HOST 值在 listener.ora 和 tnsnames.ora 中语义不同——前者决定监听绑定哪张网卡,后者决定客户端往哪发包。差一个字符,连接就超时。











