Oracle 11g RAC升级至19c后本地监听无法启动的根本原因是静态SID_LIST_LISTENER配置干扰LREG动态注册,需删除listener.ora中该块、确保LOCAL_LISTENER参数正确且数据库OPEN、并检查防火墙/SELinux/DefaultTasksMax。

Oracle 11g RAC 升级到 19c 后本地监听无法启动,根本原因不是配置丢了,而是 19c 的监听器默认依赖动态注册,而升级过程残留的静态 SID_LIST_LISTENER 块会干扰 LREG 进程,导致监听假启动或根本起不来。
检查 lsnrctl status 是否真在运行,别信服务管理器图标
Windows 下打开 services.msc 看到 OracleOraDb19cTNSListener 显示“正在运行”,不代表监听器真的能响应请求。必须用命令行验证:
- 以管理员身份运行 CMD,执行
lsnrctl status - 如果返回
TNS-12541: TNS:no listener或卡在Connecting to (DESCRIPTION=(ADDRESS=(PROTOCOL=IPC)(KEY=EXTPROC1521)))就说明进程没真正就绪 - 更隐蔽的情况是返回
TNS-01106: Listener using listener name LISTENER has already been started—— 这往往是监听僵死,得先lsnrctl stop再start
删掉 listener.ora 里的 SID_LIST_LISTENER 静态注册块
11g RAC 默认靠静态注册,19c RAC 则完全转向动态注册(由数据库实例内的 LREG 进程自动向监听器注册服务名)。升级后 $ORACLE_HOME/network/admin/listener.ora 中若还保留着旧的 SID_LIST_LISTENER 段,LREG 会拒绝注册,监听器也就收不到任何服务信息。
- 打开
listener.ora,找到类似以下内容并整段删除:SID_LIST_LISTENER = (SID_LIST = (SID_DESC = (GLOBAL_DBNAME = orcl) (ORACLE_HOME = /u01/app/oracle/product/11.2.0/dbhome_1) (SID_NAME = orcl) ) ) - 只保留最简结构:监听地址定义 +
LISTENER别名,不要任何SID_LIST相关配置 - 改完后执行
lsnrctl reload或先stop再start
确认 LOCAL_LISTENER 参数指向正确,且数据库已启动
动态注册的前提是数据库实例本身已 OPEN,且 LOCAL_LISTENER 参数值能被监听器解析。常见坑点:
- 执行
sqlplus / as sysdba后运行SHOW PARAMETER LOCAL_LISTENER,确保它指向的是本机监听地址,例如:(ADDRESS=(PROTOCOL=TCP)(HOST=localhost)(PORT=1521)) - 如果值为空或为
localhost:1521这类不带协议和括号的写法,需用ALTER SYSTEM SET LOCAL_LISTENER='(ADDRESS=(PROTOCOL=TCP)(HOST=localhost)(PORT=1521))' SCOPE=BOTH修正 - 检查数据库状态:
SELECT STATUS FROM V$INSTANCE;必须是OPEN;若为MOUNTED,LREG 不工作,动态注册不会发生 - 重启监听后,等 30 秒再查
lsnrctl services,看输出里是否有你的数据库服务名(如orcl)和READY状态
防火墙、SELinux 和 DefaultTasksMax 三者必须全过
监听能 start 且 status 正常,不代表客户端能连。这三个系统层限制在 19c RAC 升级后最容易被忽略:
- Linux 上关防火墙:
systemctl stop firewalld(CentOS 7+),或放行端口:firewall-cmd --permanent --add-port=1521/tcp - SELinux 必须设为
disabled,不能只是permissive:setenforce 0+ 修改/etc/selinux/config中SELINUX=disabled - RAC 节点上检查
DefaultTasksMax:systemctl show --property DefaultTasksMax,若仍是默认512,必须改为infinity并重启节点——否则srvctl start listener可能静默失败
真正容易被忽略的是:升级后监听器日志里没有报错,lsnrctl status 看似正常,但 lsnrctl services 输出里压根没有你的数据库服务名。这时候别翻网络配置,先去 listener.ora 删 SID_LIST_LISTENER,再盯住 LOCAL_LISTENER 和数据库实例状态。动态注册不是“开了就行”,它是数据库和监听器之间一次需要双方都在线、参数都对、权限都通的握手。


















