oracle默认端口1521是监听器硬编码值;改端口需同步更新listener.ora、tnsnames.ora和local_listener三处配置,并执行lsnrctl stop/start重启监听,否则客户端仍连不上。

Oracle数据库默认端口号是1521,不是可选答案,而是监听器(tnslsnr)启动时硬编码的默认值;改端口不是“换一个数字”就完事,必须同步更新三处配置并重启监听,否则客户端照样连不上。
为什么连不上?先确认是不是1521真被占了
报 TNS-12541: TNS:no listener 或 ORA-12170: TNS:Connect timeout occurred,大概率不是监听没启,而是端口 bind 失败。Linux/macOS 运行:
netstat -an | grep :1521
Windows 运行:
netstat -ano | findstr :1521
看 PID 是否非零,且对应进程不是 tnslsnr。常见抢占者:PostgreSQL(5432 有时会误配)、Docker 容器、残留的 Oracle XE、甚至 Java 应用绑定了 1521。
改 listener.ora 端口但没生效?检查这三处硬性要求
只改 (PORT = 1521) 是最常见失败原因。必须同时满足:
-
listener.ora中所有(ADDRESS = (PROTOCOL = TCP)(HOST = ...)(PORT = 1521))都得改成新值(如1522),漏一处都不行 - 文件路径必须是
$ORACLE_HOME/network/admin/listener.ora,不是$ORACLE_HOME/dbs/下任何文件 - 必须含完整协议声明:
(PROTOCOL = TCP),小写或缺省会导致TNS-12545
改完不能只 lsnrctl reload——它不重读端口绑定。必须:
lsnrctl stop && lsnrctl start
再用 lsnrctl status 看 “Listening Endpoints Summary” 是否已变成新端口。
客户端还是连不上?tnsnames.ora 和 local_listener 得同步动
监听器换了端口,但客户端(sqlplus、JDBC、应用服务器)还在往 1521 发包,自然超时。必须:
- 修改
$ORACLE_HOME/network/admin/tnsnames.ora中对应服务名的(PORT = 1521)→(PORT = 1522) - 进 SQL*Plus 执行:
ALTER SYSTEM SET local_listener='(ADDRESS=(PROTOCOL=TCP)(HOST=localhost)(PORT=1522))' SCOPE=BOTH;,否则数据库实例不会向新端口注册服务名,lsnrctl status里只显示UNKNOWN - JDBC 连接串也要改,例如:
jdbc:oracle:thin:@localhost:1522:orcl
别信“改完监听就通了”的直觉——tnsping orcl 能通,才说明网络层和命名解析都对了。
EM Express 打不开?那是另一个独立端口问题
EM Express(https://localhost:5500/em)默认复用数据库监听端口,但它是通过内部服务注册的,不走 listener.ora。端口一改,EM 就断。解决只有两个办法:
- 手动指定新 HTTP 端口:
EXEC DBMS_XDB_CONFIG.SETHTTPPORT(5501);,然后重启数据库(不是监听) - 或者直接关掉:
EXEC DBMS_XDB_CONFIG.SETHTTPPORT(0);
注意:DBA_REGISTRY 里 EM 相关组件显示 “INVALID” 或 “LOADING”,通常只是 EM 没起来,不影响数据库核心功能,别当成库坏了。











