监听器“启动了”但lsnrctl status不显示实例服务,是因为19c默认依赖lreg动态注册,而残留的sid_list_listener静态块会阻止lreg注册;必须彻底删除该段配置、确保数据库open且local_listener指向本节点vip,并由grid用户通过srvctl统一管理监听。

监听器“启动了”但 lsnrctl status 不显示实例服务
这不是监听没起来,而是它压根没收到注册请求。19c 默认依赖 LREG 进程动态注册,但升级后残留的 SID_LIST_LISTENER 静态块会阻止 LREG 注册——Oracle 认为“你都手动写了,那我就别动了”。结果就是监听进程在跑,lsnrctl status 却只显示 CLRExtProc 或直接报 The listener supports no services。
验证方法很简单:
- 执行
lsnrctl status,看输出里有没有你的service_name(比如orcl)或对应instance_name - 如果只有 IPC 地址连接、卡在
Connecting to (DESCRIPTION=(ADDRESS=(PROTOCOL=IPC)(KEY=EXTPROC1521))),说明监听僵死,先lsnrctl stop再start - 若返回
TNS-01106: Listener using listener name LISTENER has already been started,大概率是 reload 失败导致配置未生效
listener.ora 里还留着 SID_LIST_LISTENER 块
11g RAC 靠静态注册,19c RAC 要求彻底关闭这条路。只要 listener.ora 中存在 SID_LIST_LISTENER 段,哪怕只剩一个空括号,LREG 就拒绝注册。
必须删干净,包括:
- 整段
SID_LIST_LISTENER = (SID_LIST = ...),不要只删内层 - 任何以
SID_LIST_开头的变体(如SID_LIST_LISTENER_SCAN1),除非你明确为 SCAN 监听单独配了静态注册(通常不需要) - 删完后不能只靠
lsnrctl reload—— 有些版本 reload 不清旧注册缓存,建议lsnrctl stop && lsnrctl start
保留的最小合法结构只需监听地址定义,例如:
LISTENER = (DESCRIPTION_LIST = (DESCRIPTION = (ADDRESS = (PROTOCOL = TCP)(HOST = node1-vip)(PORT = 1521)) (ADDRESS = (PROTOCOL = IPC)(KEY = EXTPROC1521)) ))
LOCAL_LISTENER 指向错误地址或数据库未 OPEN
动态注册的前提有两个:数据库实例状态是 OPEN,且 LOCAL_LISTENER 参数值能被正确解析并连通。RAC 环境下最容易错的是 HOST 值:
- 写
localhost或127.0.0.1—— 客户端无法通过该地址访问,且 RAC 节点间通信会失败 - 写集群 SCAN 名或其它节点 VIP —— 实例只会往本节点 VIP 注册,跨节点注册无效甚至被拒绝
- 路径中用了环境变量(如
$ORACLE_HOME)或未加协议/括号(如node1-vip:1521)—— Oracle 解析失败,参数实际为空
正确做法是:
- 查当前实例名:
SELECT instance_name FROM v$instance; - 确认数据库状态:
SELECT status FROM v$instance;必须返回O - 设置时用完整 ADDRESS 字符串:
ALTER SYSTEM SET LOCAL_LISTENER='(ADDRESS=(PROTOCOL=TCP)(HOST=node1-vip)(PORT=1521))' SCOPE=BOTH SID='rac1';(注意SID='rac1'是 RAC 必须项)
RAC 节点混用 grid 和 oracle 用户启动监听
这是升级后最隐蔽的坑:集群资源本该由 grid 用户管理 LISTENER 和 LISTENER_SCAN,但 DBA 手动用 oracle 用户执行过 lsnrctl start,导致两个同名监听进程并存。结果就是 CRS 显示 Not All Endpoints Registered,lsnrctl services 看不到实例,而 ps -ef | grep tnslsnr 却能看到多个 tnslsnr 进程。
检查和清理步骤:
- 用
crsctl stat res -t看监听资源状态,若出现INTERMEDIATE或Not All Endpoints Registered,高度可疑 - 执行
ps -ef | grep tnslsnr,确认是否同时存在grid和oracle(或其它用户)启动的进程 - 杀掉非
grid用户的监听进程:kill -9 <pid></pid>或用oracle用户执行$ORACLE_HOME/bin/lsnrctl stop LISTENER - 再用
srvctl统一管控:srvctl stop listener -n node1 && srvctl start listener -n node1
升级后所有监听生命周期必须交还给 grid 用户和 CRS,手工干预只应作为临时诊断手段。











