Oracle 19c 中 listener.ora 必须用 DESCRIPTION_LIST 包裹 DESCRIPTION,HOST 需为实际网卡 IP 或可解析主机名,PORT 避免冲突,SID_LIST_LISTENER 非必需但若存在须配置正确,动态注册依赖 LOCAL_LISTENER 参数与监听地址一致,且需 ALTER SYSTEM REGISTER 触发;推荐使用 netca -silent 初始化以确保语法合规。

listener.ora 基本结构必须包含 DESCRIPTION_LIST 和 ADDRESS
直接写 LISTENER = (DESCRIPTION = ...) 在 Oracle 19c 中可能被忽略,尤其当配置了多个监听器或使用非默认名时。19c 默认要求用 DESCRIPTION_LIST 包裹 DESCRIPTION 块,否则 lsnrctl start 可能静默失败或只监听 IPC 地址。
关键点:
-
HOST值不能是localhost或127.0.0.1——远程客户端连不上;必须填服务器实际网卡 IP(如192.168.1.100)或可被客户端nslookup解析的主机名 -
PORT若改非默认(如21521),需同步检查是否被占用:netstat -an | grep :21521 - IPC 地址(
KEY=EXTPROC1521)可保留,但非必需;若不打算用外部过程(extproc),删掉更干净
正确示例(TCP 监听,IP + 自定义端口):
LISTENER =
(DESCRIPTION_LIST =
(DESCRIPTION =
(ADDRESS = (PROTOCOL = TCP)(HOST = 192.168.1.100)(PORT = 21521))
)
)
SID_LIST_LISTENER 静态注册不是必须项,但缺它会报 ORA-12514
Oracle 19c 默认靠 PMON/LREG 动态注册,SID_LIST_LISTENER 是为兼容旧逻辑或特殊场景(如数据库未启动时需预知服务)准备的。但它一旦存在,就必须写对,否则 lsnrctl status 里服务状态永远是 UNKNOWN,且干扰动态注册。
常见错误现象:
-
lsnrctl status显示监听已启动,但 “Services Summary” 下没你的实例名 → 检查是否漏配SID_LIST_LISTENER,或配了但SID_NAME与实际ORACLE_SID大小写/拼写不一致 - 客户端连时报
ORA-12514: TNS:listener does not currently know of service requested→ 先确认是动态还是静态路径:如果数据库已启动且SELECT value FROM v$parameter WHERE name = 'service_names';有返回,问题大概率在LOCAL_LISTENER参数没指向这个监听地址
最小可用静态块(仅当真需要时才加):
SID_LIST_LISTENER =
(SID_LIST =
(SID_DESC =
(SID_NAME = orcl)
(ORACLE_HOME = /u01/app/oracle/product/19c/dbhome_1)
(GLOBAL_DBNAME = orcl.example.com)
)
)
改完 listener.ora 后 reload 不等于服务就通了
lsnrctl reload 只重载配置,不重启进程,适合热更新;但它不会触发数据库重新注册服务。很多情况下你改的是监听地址,但数据库仍往旧地址(比如默认 1521)上报,导致 status 里看不到服务。
必须核对的三处:
- 数据库内执行:
SHOW PARAMETER local_listener—— 返回值必须和listener.ora里ADDRESS完全一致(协议、IP、端口) - 若改了端口,还需同步改
LOCAL_LISTENER:例如ALTER SYSTEM SET LOCAL_LISTENER='(ADDRESS=(PROTOCOL=TCP)(HOST=192.168.1.100)(PORT=21521))' SCOPE=BOTH; - 改完参数后,手动触发注册:
ALTER SYSTEM REGISTER;(否则等 PMON 下次轮询,最长 60 秒)
防火墙和 SELinux 是真实拦路虎:CentOS/RHEL 上跑 systemctl stop firewalld 和确认 getenforce 输出为 Disabled,比反复调 listener.ora 更快定位连不通问题。
netca -silent 是生产环境唯一靠谱的初始化方式
手写 listener.ora 容易因括号错位、大小写(如把 TCP 写成 tcp)、空格缩进不一致导致 lsnrctl start 报 TNS-01106 或无提示失败。而 netca -silent 生成的文件经过 Oracle 内部校验,格式零容错。
关键操作要点:
- 别自己新建响应文件,复制模板:
cp $ORACLE_HOME/assistants/netca/netca.rsp /tmp/my_netca.rsp - 必须显式设
CREATE_TYPE="CUSTOM",否则自定义端口、监听名等全被忽略 - 端口写法严格:
LISTENER_PROTOCOLS={"TCP;21521"},不是TCP,21521或TCP:21521 - 执行后检查退出码:
echo $? == 0才算成功;再立刻跑lsnrctl status确认监听进程真起来了
真正容易被忽略的是:netca 生成的监听器默认叫 LISTENER,但如果你后续用 lsnrctl start MYLISTENER,它根本找不到——名字不匹配,命令就失效。要么统一用默认名,要么所有地方(配置、命令、数据库参数)同步换名。


















