暂无图片
暂无图片
2
暂无图片
暂无图片
暂无图片

Every Day of a DBA,第158期:19C 的 LISTENER_NETWORKS

原创 ByteHouse 5天前
54

19C 的 LISTENER_NETWORKS

文档用途:RAC多网卡/多VIP隔离注册,解释11g可运行而19c报ORA‑00136ORA‑32021根因、报错分析、实施步骤、坑点、MOS相关Bug。

一、动态注册基础背景

  • Oracle 11g:PMON进程完成动态服务注册。
  • Oracle 12c/18c/19c:LREG进程独立负责注册,PMON不再处理注册逻辑;LREG读取注册相关初始化参数,向监听发送注册信息。
  • 注册目标:把实例、服务名、负载信息注册到Listener,客户端才能连接。
  • 默认行为:实例会向所有本地、远程监听交叉注册;多套独立业务网络时会出现跨网注册,带来安全与路由问题,LISTENER_NETWORKS就是用来做网络隔离注册的参数。

⚠️重要约束:启用LISTENER_NETWORKS后,LOCAL_LISTENERREMOTE_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为什么可以:

  1. PMON进程支持listener_networks内部LOCAL_LISTENER直接解析TNS别名;
  2. alter system set SQL字面量长度限制宽松,大于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铁律:

  1. listener_networks内部LOCAL_LISTENER不能使用TNS别名,必须写裸(ADDRESS=(...))
  2. 禁止使用alter system set设置listener_networks参数,会触发255字符限制。

四、19c RAC标准实施步骤(pfile中转,绕开SQL限制)

MOS推荐生产实施方式:pfile编辑完整字符串,create spfile from pfile重建spfile。

  1. 导出当前spfile为pfile
create pfile='/tmp/initoradb.ora' from spfile;
  1. 编辑/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_networksoradb2.listener_networks不要写*.listener_networks,两个实例本机VIP地址不同;
  • LOCAL_LISTENER直接写(ADDRESS=(...)),不加ADDRESS_LIST,不使用TNS别名;
  • *.local_listener=''*.remote_listener='',清空顶层参数。
  1. 由pfile重建ASM上的spfile
create spfile from pfile='/tmp/initoradb.ora';
  1. 完整重启RAC数据库实例,必须重启,alter system register不生效
srvctl stop database -d oradb srvctl start database -d oradb
  1. 校验配置与注册结果
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 set SQL字面量255字符硬限制,spfile不受限
  • Doc ID 2209704.1:listener_networks 19c配置注意事项
  • Doc ID 1964100.1:GI Agent可能覆盖spfile中listener_networks参数
「喜欢这篇文章,您的关注和赞赏是给作者最好的鼓励」
关注作者
【版权声明】本文为墨天轮用户原创内容,转载时必须标注文章的来源(墨天轮),文章链接,文章作者等基本信息,否则作者和墨天轮有权追究责任。如果您发现墨天轮中有涉嫌抄袭或者侵权的内容,欢迎发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

评论