
好的,我们来对 Oracle 19C 数据库中的 V$QMON_SERVER_STATS 动态性能视图进行一次全面、深入的详解。这个视图是深入监控和诊断 Oracle 高级队列 (Advanced Queuing, AQ) 或 流 (Streams) 环境中消息处理服务器进程性能的关键工具。
1. 作用与概述
V$QMON_SERVER_STATS 视图的主要作用是提供关于 Oracle AQ 或 Streams 中消息处理服务器进程(如 Q000, Q001 等)的性能和活动统计信息。这些服务器进程是实际负责从队列中取出消息并执行具体处理逻辑(如应用规则、传播消息、调用回调函数)的工作单元。
核心价值:
- 进程级监控:允许您监控每个独立的 QMON 服务器进程的活动和效率。
- 性能分析:通过分析处理的消息数、处理时间、空闲时间等指标,评估消息处理子系统的整体健康状况和性能瓶颈。
- 负载均衡诊断:通过比较不同服务器进程的统计信息,可以判断负载是否在各个进程间均匀分布。
- 问题排查:帮助诊断消息积压、处理延迟或服务器进程异常等问题。
2. 使用场景
- 监控消息处理吞吐量:当使用 AQ 或 Streams 时,通过此视图查看每个服务器进程处理的消息数量(
MESSAGES_PROCESSED)和速率,评估系统处理能力。 - 诊断性能瓶颈:如果发现消息处理延迟,通过检查平均处理时间(
AVG_PROCESSING_TIME)、最大处理时间(MAX_PROCESSING_TIME)以及进程状态(STATUS),判断是个别消息处理过慢还是系统整体负载过高。 - 分析服务器进程利用率:通过
TIME_IDLE和TIME_BUSY等字段,了解服务器进程是大部分时间处于繁忙还是空闲状态,为调整AQ_TM_PROCESSES等参数提供依据。 - 排查错误:检查
FAILED_MESSAGES和RETRY_ATTEMPTS字段,识别是否存在因消息内容或处理逻辑问题导致的反复失败。
3. 字段含义详解
V$QMON_SERVER_STATS 视图的字段提供了监控单个服务器进程所需的各种指标。
| 字段名 | 数据类型 | 可选性 | 含义详解 |
| :— | :— | :— | :— |
| SERVER_ID | NUMBER | | 服务器进程的唯一标识符。 |
| SERVER_NAME | VARCHAR2(64) | | 服务器进程的操作系统名称。通常格式为 Qxxx(如 Q000, Q001)。 |
| COORDINATOR_ID | NUMBER | | 与此服务器进程关联的协调器进程(Coordinator)的 ID。用于关联到 V$QMON_COORDINATOR_STATS 视图。 |
| CURRENT_QUEUE | VARCHAR2(128) | | 此服务器进程当前正在处理的队列名称。如果空闲,可能为 NULL。 |
| MESSAGES_PROCESSED | NUMBER | | 自服务器进程启动以来,已成功处理的消息总数。这是一个累积值。 |
| LAST_MESSAGE_TIME | DATE | | 最后处理一条消息的时间戳。 |
| AVG_PROCESSING_TIME | NUMBER | | 处理一条消息的平均时间(通常以秒为单位)。 |
| MAX_PROCESSING_TIME | NUMBER | | 处理单条消息所花费的最大时间。可用于识别异常值。 |
| TIME_BUSY | NUMBER | | 服务器进程处于繁忙状态的总时间(通常以秒为单位)。 |
| TIME_IDLE | NUMBER | | 服务器进程处于空闲状态的总时间(通常以秒为单位)。 |
| FAILED_MESSAGES | NUMBER | | 处理失败的消息数量。 |
| RETRY_ATTEMPTS | NUMBER | | 消息处理失败后重试的总次数。 |
| STATUS | VARCHAR2(16) | | 服务器进程的当前状态。常见值:BUSY(处理中)、IDLE(空闲)、WAITING(等待)、STOPPED(停止)。 |
| LAST_UPDATE | DATE | | 该统计信息最后一次被更新的时间。 |
| CON_ID | NUMBER | | 容器 ID。在多租户环境(CDB)中,标识该行数据属于哪个容器。对于 CDB$ROOT,此值通常为 0。 |
4. 相关视图与基表
-
相关动态性能视图:
V$QMON_COORDINATOR_STATS:提供协调器进程的统计信息。通过COORDINATOR_ID字段可与此视图关联。V$QUEUE/DBA_QUEUES:显示数据库中的队列信息。V$AQ系列视图:提供高级队列活动的统计信息。V$BUFFERED_QUEUES:针对缓冲队列的统计信息。V$STREAMS_APPLY_READER/V$STREAMS_APPLY_SERVER:如果与流应用相关,这些视图显示应用读者和服务器的信息。GV$QMON_SERVER_STATS:V$QMON_SERVER_STATS的全局版本,用于 RAC 环境。
-
基表:
- 像绝大多数
V$动态性能视图一样,V$QMON_SERVER_STATS没有直接面向用户的基础表(Base Table)。 - 它的数据来源于数据库实例的内部内存结构。每个 QMON 服务器进程在运行时会将自身的统计信息更新到共享内存(SGA)中的特定区域。
V$QMON_SERVER_STATS视图则映射了这块内存区域的内容,使其可以被查询。- 其底层数据来源是
X$表(如可能为X$KQQMSVSTATS或类似名称),但这些是 Oracle 内部的、未公开的,不建议用户直接查询。
- 像绝大多数
5. 底层详细原理
-
QMON 服务器进程 (QMON Server Processes):
- 在 Oracle 高级队列(AQ)或流(Streams)环境中,QMON 服务器进程(通常表现为
Q000,Q001, …Q999)是实际的工作进程。 - 它们由 QMON 协调器进程(如
QMNC)调度,负责从指定的队列中取出消息并执行处理。
- 在 Oracle 高级队列(AQ)或流(Streams)环境中,QMON 服务器进程(通常表现为
-
统计信息收集:
- 每个服务器进程在执行其任务时(如出队消息、处理消息、确认消息),会在其内存结构中维护各种计数器。
- 例如,每当它成功处理一条消息,
MESSAGES_PROCESSED计数器就会增加。处理所花费的时间也会被记录并用于更新AVG_PROCESSING_TIME和MAX_PROCESSING_TIME。 - 类似地,进程会跟踪其处于繁忙和空闲状态的时间,更新
TIME_BUSY和TIME_IDLE。
-
视图映射:
V$QMON_SERVER_STATS视图被定义为直接读取这些内存中的计数器值。当您查询该视图时,Oracle 内核会访问共享内存中存储这些统计信息的区域,并将其格式化为表格形式返回。
-
更新频率:
- 统计信息的更新是近乎实时的,因为服务器进程在完成特定操作后会立即更新其内存中的计数器。
6. 相关知识点介绍
- Oracle Advanced Queuing (AQ):Oracle 数据库内置的消息队列系统。它允许应用程序在数据库事务中发布和订阅消息,确保消息的可靠传递和事务一致性。
V$QMON_SERVER_STATS与 AQ 的功能密切相关。 - Oracle Streams:一个旧版的数据复制和集成功能(已在较新版本中被弃用),它也大量使用了队列技术来处理数据变更。此视图在 Streams 环境中也可能相关。
- 多租户架构:在 Oracle 多租户环境(CDB 和 PDB)中,
V$QMON_SERVER_STATS视图通常显示根容器(CDB$ROOT)级别或你当前所连接的可插拔数据库(PDB)的信息。CON_ID字段用于区分不同的容器。 - 后台进程:Oracle 依赖许多后台进程来执行特定任务。与队列相关的进程可能包括
QMNC(Queue Monitor Coordinator) 和QMNn(Queue Monitor slaves)。
7. 常用查询 SQL
-
查看所有服务器进程的基本状态和统计信息
SELECT server_id, server_name, status, current_queue, messages_processed, last_message_time FROM v$qmon_server_stats ORDER BY server_id; -
检查消息处理性能和失败情况
SELECT server_name, messages_processed, failed_messages, retry_attempts, avg_processing_time, max_processing_time FROM v$qmon_server_stats ORDER BY messages_processed DESC; -
分析服务器进程的利用率(繁忙 vs. 空闲)
SELECT server_name, time_busy, time_idle, ROUND(time_busy / NULLIF(time_busy + time_idle, 0) * 100, 2) AS busy_percentage FROM v$qmon_server_stats ORDER BY busy_percentage DESC NULLS LAST; -
在 RAC 环境中查看所有实例的服务器统计信息
SELECT inst_id, server_id, server_name, status, messages_processed FROM gv$qmon_server_stats ORDER BY inst_id, server_id; -
查找当前正在处理消息的服务器进程
SELECT server_name, current_queue, last_message_time FROM v$qmon_server_stats WHERE status = 'BUSY' ORDER BY last_message_time DESC; -
监控服务器进程的活动性(判断其是否在工作)
SELECT server_name, last_message_time, sysdate - last_message_time AS minutes_since_last_activity FROM v$qmon_server_stats WHERE status = 'IDLE';
希望以上详细的解释能帮助您完全理解 V$QMON_SERVER_STATS 视图,并有效地将其用于 Oracle 高级队列或流环境的监控和性能优化工作中。如果您有更多疑问,欢迎随时提出。
欢迎关注我的公众号《IT小Chen》

被折叠的 条评论
为什么被折叠?



