19C 的 LISTENER_NETWORKS
文档用途:RAC多网卡/多VIP隔离注册,解释11g可运行而19c报
ORA‑00136、ORA‑32021根因、报错分析、实施步骤、坑点、MOS相关Bug。
一、动态注册基础背景
- Oracle 11g:PMON进程完成动态服务注册。
- Oracle 12c/18c/19c:LREG进程独立负责注册,PMON不再处理注册逻辑;LREG读取注册相关初始化参数,向监听发送注册信息。
- 注册目标:把实例、服务名、负载信息注册到Listener,客户端才能连接。
- 默认行为:实例会向所有本地、远程监听交叉注册;多套独立业务网络时会出现跨网注册,带来安全与路由问题,
LISTENER_NETWORKS就是用来做网络隔离注册的参数。
⚠️重要约束:启用
LISTENER_NETWORKS后,LOCAL_LISTENER与REMOTE_LISTENER必须置空,二者不能同时配置。
二、三个参数详细说明
1. LOCAL_LISTENER
作用:指定实例向本机节点本地监听注册的地址;即本节点VIP监听地址集合。
- 默认值:端口1521,本机VIP;RAC GI环境下GI会自动填充该参数。
- 两种写法:
1)直接写地址描述符
alter system set local_listener='(ADDRESS=(PROTOCOL=TCP)(HOST=73.22.2.13)(PORT=1522))' sid='oradb1' scope=spfile;
2)引用tnsnames.ora别名(顶层参数完全支持,11g/19c均稳定)
alter system set local_listener='LCL_NET1_ORA1' sid='oradb1' scope=spfile;
别名要求:
tnsnames.ora仅写ADDRESS段,不要写CONNECT_DATA;实例会解析GRID_HOME/network/admin/tnsnames.ora,不是仅读ORACLE_HOME下文件。
- 多监听写法:逗号分隔多个
ADDRESS。 - 生效方式:
alter system register;即可热生效,不需要重启实例。
2. REMOTE_LISTENER
作用:指定向集群其他节点监听/SCAN监听注册地址;RAC中一般填写SCAN地址端口。
- RAC默认:
scan-name:port。 - 写法:
alter system set remote_listener='bzsrv-n1-scan:1522' sid='*' scope=spfile;
- 支持SCAN字符串,也支持TNS别名。
- 生效:
alter system register;热生效。
普通模式(不使用
LISTENER_NETWORKS)工作逻辑:
LREG读取LOCAL_LISTENER→注册本机VIP监听;读取REMOTE_LISTENER→注册SCAN/其他节点监听;实例会向全部监听交叉注册,无法做到按网络隔离。
3. LISTENER_NETWORKS
功能:实现按网络分组隔离注册,是Oracle提供的多网卡/多VIP隔离注册的官方参数。
每个网络组:NAME=逻辑网络名,组内定义该网络对应的LOCAL_LISTENER(本组本地监听)、REMOTE_LISTENER(本组远端/SCAN监听)。
效果:network1的流量只注册到network1的本地与远端监听;network2只注册network2的监听,不会跨网络交叉注册。
官方语法模板:
LISTENER_NETWORKS =
'((NAME=network_name)
(LOCAL_LISTENER=listener_address)
(REMOTE_LISTENER=listener_address))
,
((NAME=network_name2)
(LOCAL_LISTENER=listener_address2)
(REMOTE_LISTENER=listener_address2))'
业务场景:一套RAC两套业务网络,net1面向内网业务,net2面向外网业务,两套VIP、两套SCAN,要求内网实例注册只注册内网监听,外网只注册外网监听,互不交叉。
关键版本差异:
- 11g:PMON解析;
LOCAL_LISTENER支持TNS别名;alter system set字符串长度限制宽松。- 19c:LREG重构;嵌套内部LOCAL_LISTENER不再支持TNS别名;alter system set有255字节SQL字面量硬限制。
⚠️重要:该参数不能热生效,修改后必须完整重启数据库实例;执行
alter system register不会加载新的listener_networks配置。
三、11g可执行示例 & 19c报错复现与根因
11g可执行SQL(11.2.0.x)
alter system set LISTENER_NETWORKS='((NAME=network1)(LOCAL_LISTENER=LISTENER1_NET1)(REMOTE_LISTENER=bzhissrv:1521))','((NAME=network2)(LOCAL_LISTENER=LISTENER1_NET2)(REMOTE_LISTENER=REMOTE_NET2))';
11g为什么可以:
- PMON进程支持
listener_networks内部LOCAL_LISTENER直接解析TNS别名; alter system setSQL字面量长度限制宽松,大于255字符可正常写入spfile。
19c场景1:使用TNS别名,报ORA‑00136
alter system set listener_networks='((NAME=net1)(LOCAL_LISTENER=LCL_NET1_ORA1)(REMOTE_LISTENER=BZSRV_N1_SCAN)),((NAME=net2)(LOCAL_LISTENER=LCL_NET2_ORA1)(REMOTE_LISTENER=BZSRV_N2_SCAN))' sid='oradb1' scope=spfile;
报错:
ORA-32017: failure in updating SPFILE
ORA-00119: invalid specification for system parameter LISTENER_NETWORKS
ORA-00136: invalid LISTENER_NETWORKS specification #1
根因:
Bug 29947471:19c LREG进程重构后,
LISTENER_NETWORKS嵌套内部的LOCAL_LISTENER不再支持TNS别名,只接受裸地址描述符(ADDRESS=(...));顶层local_listener参数不受该Bug影响,只有嵌套内部会报错。REMOTE_LISTENER依旧支持别名/SCAN字符串。
19c场景2:直接写完整ADDRESS描述符,报ORA‑32021
alter system set listener_networks='((NAME=net1)(LOCAL_LISTENER=(ADDRESS_LIST=(ADDRESS=(PROTOCOL=TCP)(HOST=73.22.2.13)(PORT=1522))))(REMOTE_LISTENER=bzsrv-n1-scan:1522)),((NAME=net2)(LOCAL_LISTENER=(ADDRESS_LIST=(ADDRESS=(PROTOCOL=TCP)(HOST=74.22.2.13)(PORT=1523))))(REMOTE_LISTENER=bzsrv-n2-scan:1523))' sid='oradb1' scope=spfile;
报错:
ORA-32021: parameter value longer than 255 characters
根因:
ORA‑32021不是spfile文件存储限制;是alter system set xxx='字符串'这条SQL语句中,单引号包裹的字面量最大255字节硬限制。
spfile文件本身可以存储远大于255字节的参数值;只是不能通过SQL语句字面量传入长文本。
双网络listener_networks完整描述符必然超过255字节,所以alter system set完全不可用。
总结两条19c铁律:
listener_networks内部LOCAL_LISTENER不能使用TNS别名,必须写裸(ADDRESS=(...));- 禁止使用alter system set设置listener_networks参数,会触发255字符限制。
四、19c RAC标准实施步骤(pfile中转,绕开SQL限制)
MOS推荐生产实施方式:pfile编辑完整字符串,
create spfile from pfile重建spfile。
- 导出当前spfile为pfile
create pfile='/tmp/initoradb.ora' from spfile;
- 编辑
/tmp/initoradb.ora
*.local_listener=''
*.remote_listener=''
# oradb1 节点1实例:填写本机VIP裸ADDRESS,不要别名,不要ADDRESS_LIST
oradb1.listener_networks='((NAME=net1)(LOCAL_LISTENER=(ADDRESS=(PROTOCOL=TCP)(HOST=73.22.2.13)(PORT=1522)))(REMOTE_LISTENER=bzsrv-n1-scan:1522)),((NAME=net2)(LOCAL_LISTENER=(ADDRESS=(PROTOCOL=TCP)(HOST=74.22.2.13)(PORT=1523)))(REMOTE_LISTENER=bzsrv-n2-scan:1523))'
# oradb2 节点2实例:必须填写节点2本机VIP地址,不要复制oradb1配置
oradb2.listener_networks='((NAME=net1)(LOCAL_LISTENER=(ADDRESS=(PROTOCOL=TCP)(HOST=73.22.2.14)(PORT=1522)))(REMOTE_LISTENER=bzsrv-n1-scan:1522)),((NAME=net2)(LOCAL_LISTENER=(ADDRESS=(PROTOCOL=TCP)(HOST=74.22.2.14)(PORT=1523)))(REMOTE_LISTENER=bzsrv-n2-scan:1523))'
要点:
- 实例级参数:
oradb1.listener_networks、oradb2.listener_networks,不要写*.listener_networks,两个实例本机VIP地址不同;LOCAL_LISTENER直接写(ADDRESS=(...)),不加ADDRESS_LIST,不使用TNS别名;*.local_listener=''、*.remote_listener='',清空顶层参数。
- 由pfile重建ASM上的spfile
create spfile from pfile='/tmp/initoradb.ora';
- 完整重启RAC数据库实例,必须重启,alter system register不生效
srvctl stop database -d oradb srvctl start database -d oradb
- 校验配置与注册结果
show parameter listener_networks;
show parameter local_listener;
show parameter remote_listener;
--查看按网络分组注册信息
SELECT inst_id,network,listener_addr,listener_port FROM gv$listener_registration;
预期输出:
- inst_id=1:network=net1对应73.22.2.13:1522;network=net2对应74.22.2.13:1523
- inst_id=2:network=net1对应73.22.2.14:1522;network=net2对应74.22.2.14:1523
grid侧校验监听注册服务
lsnrctl status LISTENER lsnrctl status LISTENER_SCAN1
五、应急回滚(数据库启动失败场景)
实例启动报参数解析错误,进入nomount执行重置:
startup nomount;
alter system reset listener_networks scope=spfile sid='oradb1';
alter system reset listener_networks scope=spfile sid='oradb2';
shutdown immediate;
startup;
MOS参考Bug/Note:
- Bug 29947471:listener_networks内部LOCAL_LISTENER使用TNS别名报ORA‑00136
- ORA‑32021:
alter system setSQL字面量255字符硬限制,spfile不受限- Doc ID 2209704.1:listener_networks 19c配置注意事项
- Doc ID 1964100.1:GI Agent可能覆盖spfile中listener_networks参数




