Oracle监听端口被占用导致TNS-12541错误,需检查并更换端口(如1522),同步更新listener.ora、tnsnames.ora及JDBC连接串,重启监听;EM Express需单独配置HTTP端口;Windows下还需手动开放防火墙新端口。
Oracle监听端口被占用,lsnrctl start 报 TNS-12541: TNS:no listener
这不是监听没启动,而是端口根本 bind 失败。oracle 默认用 1521,但很多环境(尤其是开发机、docker、或装过其他数据库)早被 java、postgresql、甚至某个残留的 oracle-xe 进程占了。先确认:运行 netstat -an | grep 1521(linux/macos)或 netstat -ano | findstr :1521(windows),看 pid 是否非零且不属于 tnslsnr。
改 listener.ora 端口后仍连不上,sqlplus /@orcl 提示 ORA-12170: TNS:Connect timeout occurred
只改配置文件不够,必须同步更新三处:
-
listener.ora中PORT值(如改成1522),路径通常是$ORACLE_HOME/network/admin/listener.ora -
tnsnames.ora对应服务名的PORT必须一致(比如orcl条目里(PORT=1522)) - 如果用 JDBC,连接串里的端口号也得改,例如
jdbc:oracle:thin:@localhost:1522:orcl
改完必须重启监听:lsnrctl stop && lsnrctl start;别只 reload,它不重读端口配置。
修改端口后客户端能连,但 DBA_REGISTRY 显示组件状态异常或 EM Express 打不开
EM Express(https://localhost:5500/em)默认绑定在数据库监听端口上,但它是通过数据库内部服务注册的,不是靠 listener.ora 配置。端口一改,EM 就断连。解决方法只有两个:
- 手动为 EM 指定新端口:
exec DBMS_XDB_CONFIG.SETHTTPPORT(5501);,然后重启数据库(不是监听) - 或者干脆关掉 EM:
exec DBMS_XDB_CONFIG.SETHTTPPORT(0);,避免干扰
注意:DBA_REGISTRY 异常往往只是 EM 相关组件报告“未就绪”,不影响核心功能,别误判成数据库损坏。
Windows 下改完端口,lsnrctl status 显示正常,但远程客户端连不上
大概率是 Windows 防火墙拦了新端口。Oracle 安装时自动放行了 1521,但不会自动加你自定义的端口(比如 1522)。手动加一条入站规则:
- 打开“高级安全 Windows 防火墙” → “入站规则” → “新建规则”
- 选“端口”,TCP,特定本地端口填你的新端口号(如
1522) - 允许连接,名称写清楚(如
Oracle Listener 1522)
别跳过这步——本地连通不代表远程可用,这是最常被忽略的环节。

















