改 listener.ora 中的 port 不等于端口变更,必须同步修改 local_listener 参数、重启监听、验证服务注册,否则客户端报 ora-12541;需先用 lsnrctl status 和 show config 确认真实端口与配置路径,再更新 tcp/ipc 地址、adr 日志路径、tnsnames.ora、jdbc url 及防火墙规则。

改 listener.ora 里的 PORT 不等于端口就变了——必须同步改 local_listener 参数、重启监听、验证服务注册,否则客户端连不上,报 ORA-12541: TNS:no listener。
确认当前监听真实端口和配置文件路径
别凭印象改文件,先看监听实际在用什么:
- 运行
lsnrctl status,重点看 “Listening Endpoints Summary” 行,它显示当前真正监听的地址和端口(比如(PORT = 1521)) - 再运行
lsnrctl show config,它会输出正在加载的listener.ora路径;如果显示No listener.ora file found,说明监听是纯动态启动的,你得先建一个标准配置文件,否则后续所有修改都无效 - 注意:
lsnrctl edit+save_config在多数版本中不可靠,尤其 12c+,不推荐依赖它写入文件
修改 listener.ora 中三处关键位置
只改一处 (PORT = 1521) 是最常见的失败原因。以改成 1522 为例,必须检查并更新:
-
(ADDRESS = (PROTOCOL = TCP)(HOST = your-hostname)(PORT = 1521))→ 改为1522 -
(ADDRESS = (PROTOCOL = IPC)(KEY = EXTPROC1521))→ KEY 名建议同步改为EXTPROC1522,避免排查时混淆(IPC 本身不影响网络连接,但语义一致更安全) - 如果存在
ADR_BASE_LISTENER或自定义日志路径含端口号(如/log/1521/),也一并更新,否则日志可能写错位置或报权限错误
必须同步修改数据库的 local_listener 参数
这是单实例最容易漏的一步:PMON 进程默认只向端口为 1521 的监听器动态注册服务。你把监听端口改成 1522 后,如果不告诉数据库“该往哪注册”,它仍会尝试注册到老端口,导致 lsnrctl services 里看不到你的实例。
- 用
sqlplus / as sysdba登录,执行:alter system set local_listener='(address=(protocol=tcp)(host=your-hostname)(port=1522))' scope=both; - 立即执行
alter system register;强制触发一次服务注册(比等 60 秒自动注册快) - 再跑
lsnrctl services,确认输出里出现新端口(如1522)且对应实例状态为READY
客户端配置和防火墙不能忘
监听器和数据库端口改了,客户端照样连老端口,自然失败:
-
tnsnames.ora里每个对应的服务名,其(PORT = ...)必须同步更新(比如从1521改成1522) - JDBC URL 中的端口也要改,例如:
jdbc:oracle:thin:@host:1522:orcl - Linux 上检查防火墙:
firewall-cmd --list-ports或iptables -L | grep 1522,没开就加规则;Windows 防火墙同样要放行新端口 - RAC 环境额外注意:
remote_listener和 SCAN 监听端口(用srvctl modify scan_listener -p 1522)也得一起改,否则跨节点连接异常
最常被跳过的其实是 local_listener 参数更新——很多人以为改完 listener.ora 并 lsnrctl start 就完事了,结果 lsnrctl status 显示监听起来了,lsnrctl services 却空空如也,根本原因就在这儿。











