面试宝典:介绍下Oracle数据库动态性能视图 V$LISTENER_NETWORK

在这里插入图片描述
好的,我们来对 Oracle 19C 数据库中的 V$LISTENER_NETWORK 动态性能视图进行一次全面而深入的解析。这个视图是理解 Oracle 网络服务架构和诊断连接问题的关键。


1. 作用与概述

V$LISTENER_NETWORK 动态性能视图用于展示当前数据库实例所“知道”的所有 Oracle Net 监听器的网络配置和状态信息

  • 核心目的: 提供数据库实例视角下的监听器拓扑。它回答了“我的数据库实例向哪些监听器进行了注册?”以及“这些监听器的网络端点(地址和端口)是什么?”的问题。
  • 数据来源: 该视图的信息主要来源于:
    1. 动态注册: 当数据库实例启动时,PMON(进程监视器)或 LREG(监听器注册进程)会主动向 LOCAL_LISTENERREMOTE_LISTENER 参数指定的监听器进行服务注册。
    2. 静态注册: 监听器配置文件 (listener.ora) 中的静态服务配置。
    3. Oracle Notification Service (ONS): 用于 RAC 和高级功能中的事件通知。
  • 重要性: 在复杂的网络环境,尤其是 Oracle RAC(Real Application Clusters)中,客户端需要正确的监听器信息来建立连接。此视图是验证数据库实例与监听器之间网络配置是否正确同步的首要工具。

2. 使用场景

此视图在以下场景中至关重要:

  1. 连接问题诊断

    • 当客户端报告“TNS: 无法解析指定的连接标识符”或“无监听程序”时,DBA 可以查询此视图,确认数据库实例是否已向预期的监听器正确注册了服务。
  2. Oracle RAC 环境管理

    • 在 RAC 中,每个实例会向 SCAN 监听器和本地监听器注册。通过此视图可以验证所有集群监听器是否都已被当前实例识别,这对于确保负载均衡和故障转移的正常工作至关重要。
  3. 配置验证

    • 验证 LOCAL_LISTENERREMOTE_LISTENER 初始化参数的配置是否按预期生效。
    • 检查为服务配置的所有网络端点(协议、主机、端口)是否正确。
  4. 高可用性与故障转移规划

    • 了解完整的监听器网络布局,有助于规划客户端连接字符串的故障转移配置 (FAILOVER=ON, LOAD_BALANCE=ON)。

3. 字段含义详解

V$LISTENER_NETWORK 视图的字段描述了监听器的标识、所属权、网络协议细节和状态。

字段名称数据类型含义说明
LISTENER_IDNUMBER监听器的唯一内部标识符。由Oracle内部生成,用于区分不同的监听器配置。
NAMEVARCHAR2(64)监听器的名称。通常来源于 listener.ora 中的配置(如 LISTENER, LISTENER_SCAN1),如果未命名,则显示为空。
NETWORK_NAMEVARCHAR2(64)监听器所属网络的名称。在复杂网络环境中,用于区分不同物理或逻辑网络(如 eth0bond0 或自定义网络)。
OWNERVARCHAR2(5)指示谁提供了此监听器信息
LOCAL: 由当前实例的 LOCAL_LISTENER 参数定义。
REMOTE: 由当前实例的 REMOTE_LISTENER 参数定义(在RAC中通常是SCAN监听器)。
SELF: 数据库实例自身,通常通过ONS(Oracle Notification Service)发现。
PROPERTYVARCHAR2(8)监听器的属性。例如 IPV4, IPV6,表示监听器使用的IP协议版本。
IPVARCHAR2(64)监听器绑定的IP地址。可以是具体的IP地址(如 192.168.1.10),也可以是主机名(如 my-scan.example.com)或通配符(0.0.0.0 表示所有接口)。
PORTNUMBER监听器监听的TCP端口号。默认为 1521
ENDPOINTVARCHAR2(256)完整的网络端点字符串。是 PROTOCOLIPPORT 的综合体(例如:(DESCRIPTION=(ADDRESS=(PROTOCOL=TCP)(HOST=my-scan)(PORT=1521))))。
PROTOCOLVARCHAR2(6)监听器使用的网络协议。几乎总是 TCP
GLOBALVARCHAR2(3)指示是否是全局监听器。在RAC环境中,SCAN监听器会被标记为 YES,本地监听器为 NO
VALIDVARCHAR2(3)指示该监听器端点是否被数据库实例认为是有效的、可到达的。通常是 YES。如果为 NO,表明配置可能有问题。
CON_IDNUMBER该记录所属容器的ID。对于CDB(多租户)环境,0表示CDB$ROOT,其他数字表示PDB的ID。

4. 相关视图与基表

  • 相关动态性能视图

    • V$ACTIVE_SERVICES: 显示当前数据库实例中活动的服务。这些服务会注册到 V$LISTENER_NETWORK 中的监听器。
    • GV$LISTENER_NETWORK: 在RAC环境中,显示所有集群节点上的监听器网络信息。
    • V$ONS_CONFIGURATION: 显示ONS的配置详情,它与监听器的发现和通信有关。
    • V$SYSTEM_PARAMETER / V$PARAMETER: 可以查询 local_listenerremote_listener 参数的当前值,与本视图中的 OWNER 字段相关联。
  • 外部工具与命令

    • lsnrctl status [listener_name]: 这是监听器控制工具的命令。它从监听器进程的视角显示注册的服务详情。V$LISTENER_NETWORK 是从数据库实例的视角看监听器。二者相辅相成,是诊断连接问题的“双剑合璧”。
    • tnsping: 用于测试客户端是否能解析和联系到某个网络服务名(其中包含监听器地址)。
  • 基表(Underlying Base Table)

    • **X∗∗表:‘V** 表: `V表:VLISTENER_NETWORK的信息来源于数据库实例的内存结构,这些结构由 LREG/PMON 进程在向监听器注册和维护心跳时更新。其底层极有可能是一个或多个X$表(如X$KCFGLSNR`),但这些是Oracle内部的、未公开的,严禁直接查询。视图的存在正是为了提供一个安全、稳定的接口来访问这些信息。

5. 底层详细原理

  1. 服务注册流程(动态注册)

    • 数据库实例启动时,读取 LOCAL_LISTENERREMOTE_LISTENER 初始化参数。
    • LREG 进程(在11g及以后,之前是PMON)尝试联系这些参数中指定的所有监听器。
    • 联系成功后,LREG 会向监听器发送一个“服务注册”消息包,其中包含:服务名SERVICE_NAMES)、实例名INSTANCE_NAME)、负载值建议的处理器数量等。
    • 监听器收到注册信息后,将其存入自己的内存中,并开始监控该实例的健康状态(通过LREG定期发送的心跳信息)。
    • 同时,数据库实例端(LREG)也会在自身的内存中维护一个它成功注册过的监听器列表及其网络端点信息。V$LISTENER_NETWORK 视图正是查询的这个列表。
  2. 信息维护

    • 注册不是一次性的。LREG 会定期(大约每60秒)向监听器重新注册信息并发送心跳,以更新负载信息并告知监听器实例仍然存活。
    • 如果监听器不可达,数据库实例会尝试重连。这种状态可能会反映在 VALID 等字段上。
    • 当实例关闭(正常或异常)时,LREG/PMON 会尝试向监听器发送“服务卸载”消息,监听器随之将服务从可用服务列表中移除。如果实例异常终止,监听器在多次心跳超时后也会自动将其标记为不可用。
  3. 在RAC中的特殊行为

    • 在RAC中,REMOTE_LISTENER 参数通常设置为SCAN(Single Client Access Name)地址。
    • 每个实例的LREG进程都会向SCAN监听器注册自己。
    • SCAN监听器充当一个中央协调点,为客户端请求提供负载均衡和故障转移,将连接请求导向最合适的实例。
    • 因此,在RAC实例的 V$LISTENER_NETWORK 视图中,你会看到 OWNERREMOTE 的SCAN监听器条目和 OWNERLOCAL 的本地监听器条目。

6. 相关知识点介绍

  • LOCAL_LISTENER vs REMOTE_LISTENER
    • LOCAL_LISTENER: 指定实例向其注册的本地监听器的网络地址。通常是非RAC环境或RAC中的节点专用监听器。
    • REMOTE_LISTENER: 指定实例向其注册的远程监听器的网络地址。在RAC中,这就是SCAN监听器。
  • TNSNAMES.ORA 和 Easy Connect: 客户端使用连接描述符(在tnsnames.ora文件中或Easy Connect字符串)来定位监听器。描述符中的 HOSTPORT 必须与 V$LISTENER_NETWORK 中的某个 IP/PORTNAME 匹配,连接才能建立。
  • SCAN (Single Client Access Name): RAC的特有概念。它是一个域名,解析到集群前方的多个IP地址(通常3个)。它为客户端提供了一个稳定的访问入口,屏蔽了集群后台节点的增减变化。

7. 常用查询 SQL

1. 查看数据库实例已知的所有监听器概要
这是最常用、最基础的查询。

SELECT owner, 
       network_name, 
       name AS listener_name,
       ip, 
       port, 
       protocol,
       global,
       valid
FROM v$listener_network
ORDER BY owner, network_name;

2. 验证RAC环境下的监听器配置
在RAC环境中,检查SCAN和本地监听器是否都已正确识别。

SELECT owner, 
       name,
       ip, 
       port,
       endpoint
FROM v$listener_network
WHERE owner IN ('REMOTE', 'LOCAL') -- 重点关注REMOTE(SCAN)和LOCAL监听器
ORDER BY owner;

3. 检查监听器配置的完整端点信息

SELECT owner, name, endpoint
FROM v$listener_network;

4. 排查问题:查找无效的监听器配置

SELECT * FROM v$listener_network WHERE valid = 'NO';

5. 与活动服务关联查询(需要与V$ACTIVE_SERVICES连接)

SELECT ln.owner,
       ln.ip,
       ln.port,
       s.name AS service_name,
       s.inst_id AS instance_id
FROM v$listener_network ln
CROSS JOIN v$active_services s 
WHERE ln.owner IS NOT NULL
ORDER BY ln.owner, s.name;
-- 注意:这是一个逻辑关联,并非直接SQL关联,旨在显示注册关系。

总结

V$LISTENER_NETWORK 动态性能视图是数据库实例与Oracle网络基础设施(监听器)之间的“联络图”。它提供了数据库视角下的监听器网络拓扑,是诊断连接问题、验证复杂网络配置(尤其是RAC)的基石

掌握此视图意味着您能够:

  • 快速验证 数据库实例是否已正确识别并注册到所有必要的监听器。
  • 清晰理解 Oracle网络服务的通信基础架构。
  • 有效诊断 复杂的客户端连接故障,精准定位问题是发生在数据库注册端、监听器端还是客户端。
  • 自信管理 Oracle RAC 和高可用性环境中的负载均衡与故障转移配置。

V$LISTENER_NETWORK(数据库端视图)与 lsnrctl status(监听器端命令)结合使用,是解决任何Oracle网络连接问题的标准方法和最佳实践。

欢迎关注我的公众号《IT小Chen

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值