能,但必须严格匹配Oracle版本语法并手动触发服务注册;SID_LIST_LISTENER是硬性要求,SID_NAME须与ORACLE_SID完全一致,ORACLE_HOME需用绝对路径,Windows需先注册监听服务,数据库端须配置local_listener参数并执行alter system register。直接回答:能,但必须严格匹配 Oracle 版本的监听器配置语法和启动机制;跳过
netca 后,lsnrctl 能加载配置,但服务注册(即数据库实例被监听识别)需额外手动触发,否则 STATUS 里永远显示 “The listener supports no services”。
listener.ora 文件必须包含 SID_LIST 才能注册实例
很多人只配了 listener 段,却漏掉 sid_list_listener,导致监听启动成功但不识别数据库。关键不是“能连上端口”,而是“能否路由到指定实例”。
-
SID_LIST_LISTENER是硬性要求,哪怕只配一个实例也要显式写出来 -
SID_DESC中的SID_NAME必须与当前环境变量ORACLE_SID完全一致(大小写敏感) -
ORACLE_HOME路径不能用变量(如$ORACLE_HOME),必须展开为绝对路径,否则 Windows 下启动失败报错error 1060 - Linux 下若使用 IPC 协议,
KEY值要和数据库初始化参数ipc_key匹配,否则实例无法动态注册
Windows 上启动监听服务前必须注册 Windows 服务
Linux 下执行 lsnrctl start 即可,但 Windows 不行——没注册成系统服务就直接 start,会提示 Failed to open service <oracleoradb11g_home1tnslistenerlistener4>, error 1060</oracleoradb11g_home1tnslistenerlistener4>。
- 先用
lsnrctl生成服务名:运行lsnrctl→ 输入set current_listener LISTENER4→ 再输入save_config(仅限 11g+) - 或手动注册:以管理员身份运行
oradim -new -sid LISTENER4 -intpwd password -startmode auto(注意这不是数据库实例 sid,而是监听服务名) - 注册后仍需确认服务名是否出现在 Windows 服务列表中,名称格式通常是
OracleOraDb11g_home1TNSListenerLISTENER4,路径必须与ORACLE_HOME一致
监听启动后数据库实例不自动注册?立刻检查这三处
即使 lsnrctl status 显示监听已运行,Services Summary 为空,说明实例未注册。这不是监听问题,是数据库端配置缺失。
- 确认数据库已启动到
MOUNT或OPEN状态(NOMOUNT不会注册) - 检查参数
local_listener是否设置:运行show parameter local_listener,若为empty,执行alter system set local_listener='(ADDRESS=(PROTOCOL=TCP)(HOST=localhost)(PORT=1528))' scope=both; - 强制注册:在已启动的数据库中执行
alter system register;,该命令立即触发 PMON 向监听发送注册请求,无需重启
多个监听共存时,tnsnames.ora 和 listener.ora 的端口/别名必须一一对应
比如你定义了 L1 监听在 1522,L2 在 1523,那客户端连接串里的 (PORT=...) 就不能填错;更隐蔽的问题是:tnsnames.ora 里服务名(如 scimdb4)的 HOST 和 PORT 必须与 listener.ora 中对应监听的 ADDRESS 完全一致,否则看似能连,实则连到别的监听甚至空监听。
- 不要复用同一端口给多个监听(Oracle 不允许)
- 修改
listener.ora后必须执行lsnrctl reload,而不是stop/start,否则动态注册信息会丢失 - Linux 下若 SELinux 启用,需确认
sestatus并放行对应端口:sudo semanage port -a -t oracle_port_t -p tcp 1528
lsnrctl,后者靠数据库自身的 PMON 进程主动上报,且依赖 local_listener 参数和网络可达性。少一个环节,tnsping 成功、lsnrctl status 显示监听运行,但 SQL*Plus 仍报 ORA-12514: TNS:listener does not currently know of service requested in connect descriptor。











