改端口需同步修改listener.ora中的HOST、PORT及IPC KEY,更新数据库local_listener参数并执行alter system register,再stop/start监听器,最后验证lsnrctl status与services输出是否一致。

改端口不是只改 listener.ora 里的一个数字,漏掉 local_listener 参数或 HOST 配置错误,客户端照样连不上。
确认当前监听真实加载的配置文件和端口
别凭印象改文件,先看监听器实际在用什么:
- 运行
lsnrctl status,重点看 “Listening Endpoints Summary” 行,它显示的是当前真正监听的地址和端口 - 再执行
lsnrctl show config,它会输出监听器读取的listener.ora路径;如果显示 “No listener.ora file found”,说明监听是纯动态启动的,你得先建一个标准配置文件,否则改了也白改 - Linux 下检查端口占用:
netstat -an | grep :新端口号,确认没被其他进程占着
修改 listener.ora 必须动这三处
Oracle 19c 对语法更严格,只改 (PORT = 1521) 这一处远远不够:
-
HOST值不能是localhost或127.0.0.1——远程客户端必然失败;必须填服务器实际网卡 IP(如192.168.1.100)或客户端能nslookup解析的主机名 -
PORT改完后,顺手把(ADDRESS = (PROTOCOL = IPC)(KEY = EXTPROC1521))这行的数字也改成一致(如EXTPROC1522),避免混淆,不改不影响网络连接但容易误判 - 确保外层结构是
DESCRIPTION_LIST包裹DESCRIPTION,写成LISTENER = (DESCRIPTION = ...)在 19c 中可能被忽略,导致只监听 IPC 地址
local_listener 参数必须同步更新
这是最容易被跳过的致命一环:数据库实例靠它告诉监听器“我在哪、用哪个端口注册”。默认值为空时,它会自动绑定到 1521;你改了监听端口但没改这个参数,PMON 就仍往老端口注册,lsnrctl status 里就看不到你的服务,报 ORA-12514。
- 登录 SQL*Plus:
sqlplus / as sysdba - 查当前值:
show parameter local_listener - 设新值(IP 和端口必须跟
listener.ora里的一致):alter system set local_listener='(address=(protocol=tcp)(host=192.168.1.100)(port=1522))' scope=both; - 强制立即注册:
alter system register;(否则等 PMON 下一轮,最长 60 秒)
重启监听 + 客户端配置要跟上
改完配置不重启等于没改,但注意方式:
- 用
lsnrctl stop+lsnrctl start,而不是reload——reload不清理旧注册,可能新旧端口同时存在 - 启动后立刻跑
lsnrctl services,确认输出里只出现新端口,且你的服务STATUS是READY - 别忘了同步改
tnsnames.ora和 JDBC URL 里的端口,比如@host:1521/service得改成@host:1522/service - 防火墙放行新端口:
firewall-cmd --permanent --add-port=1522/tcp(CentOS 7+)
复杂点在于:RAC 环境下 SCAN 监听、VIP 监听、ASM 的 local_listener 都得单独处理,而且顺序不能错;单机看似简单,但 HOST 写错 IP 或 local_listener 没生效,问题现象完全一样——连都连不上,根本进不去查日志。











