端口冲突时需检查并释放占用端口,确保监听器名唯一、ADDRESS独立定义、LOCAL_LISTENER指向正确地址,并通过ALTER SYSTEM REGISTER或静态注册解决实例注册问题。
listener.ora 里配多个监听器,端口冲突了怎么办
监听器起不来,lsnrctl status 报 tns-12541: no listener 或 tns-12560: tns:protocol adapter error,大概率是端口被占或配置语法错。oracle 不允许两个监听器绑定同一 ip+端口组合,哪怕名字不同。
- 用
netstat -an | grep :1521(Linux/macOS)或netstat -ano | findstr :1521(Windows)确认端口是否真被占 - 监听器名必须全局唯一,且不能含下划线以外的特殊字符(如
LISTENER_1522合法,LISTENER-1522会解析失败) - 每个
LISTENER_xxx段必须独立定义ADDRESS,不能复用上一段的ADDRESS_LIST - Oracle 12c 及以后支持
ENDPOINT语法,但老版本只认ADDRESS,混用会导致LSNRCTL加载时静默跳过该段
非默认端口监听器注册不到数据库实例
监听器起来了,lsnrctl status LISTENER_1522 显示 “No services”,说明实例没注册进来。这不是监听器问题,而是数据库侧没告诉它“我在哪儿”。
- 检查数据库参数:
LOCAL_LISTENER必须指向对应监听器,比如ALTER SYSTEM SET LOCAL_LISTENER='(ADDRESS=(PROTOCOL=TCP)(HOST=localhost)(PORT=1522))'; - 如果用了别名(如
LISTENER_1522),确保TNSNAMES.ORA里有对应条目,且LOCAL_LISTENER值是那个别名字符串,不是地址本身 -
REMOTE_LISTENER不影响单机注册,别乱设;SECURE_REGISTER开启后可能拦截动态注册,临时调试建议关掉 - 改完参数记得
ALTER SYSTEM REGISTER;触发立即注册,否则要等默认 60 秒轮询
tnsnames.ora 和 listener.ora 的 host 写 localhost 还是真实 IP
写 localhost 看似方便,但容易在容器、多网卡或 hosts 绑定异常时失效。Oracle 解析 localhost 走的是系统 resolver,而监听器绑定靠的是 socket bind,两者行为不总一致。
- 监听器配置中
HOST推荐写具体 IP(如192.168.1.10)或0.0.0.0(监听所有接口),避免localhost或127.0.0.1 -
tnsnames.ora里的HOST应与监听器实际绑定地址一致;客户端连不上时,先ping和telnet ip port确认网络层通 - Oracle 19c+ 支持
HOST=*(监听所有 IPv4/IPv6),但部分旧客户端驱动不兼容,生产环境慎用 - 修改后必须重启监听器:
lsnrctl stop LISTENER_1522 && lsnrctl start LISTENER_1522,reload 不重读HOST和PORT
动态注册失败时,静态注册怎么补救
当数据库实例无法动态注册(比如启库早于监听器、或 LOCAL_LISTENER 配错),只能靠静态注册兜底。这招不优雅但有效,尤其适合 RAC 或 Data Guard 场景。
- 在
listener.ora对应监听器段内加SID_LIST_LISTENER_1522块,注意名称必须和监听器名完全匹配 -
SID_DESC里GLOBAL_DBNAME建议设为ORACLE_SID+DB_DOMAIN(如orcl.example.com),否则客户端用 service_name 连会失败 -
ORACLE_HOME路径必须绝对准确,结尾不加斜杠,Windows 下用双反斜杠或正斜杠均可,但不能混用 - 静态注册不感知实例启停,所以
STATUS里会一直显示UNKNOWN,只要READY就能连——这点常被误判为故障
lsnrctl status、tnsping、sqlplus /@tns_alias 串着验,缺一不可。










