
好的,我们将对 Oracle 19C 数据库中的 V$QMON_TASKS 动态性能视图进行最全面、最深入的解析。这个视图是监控 Oracle 高级队列(AQ)任务执行情况的核心实时工具。
1. 作用与概述
V$QMON_TASKS 视图用于实时显示和监控由队列监控协调器(QMNC)和队列监控从属进程(QMNn)正在执行或最近执行的具体任务(Tasks)的详细信息。
- 任务(Task): 这是 AQ 系统中的基本工作单元。一个任务代表一个具体的、可执行的操作。例如:将一批消息从队列 A 传播到队列 B,清理一批过期消息,处理一批延迟消息等。一个 QMNn 进程一次处理一个任务。
- 视图内容: 此视图提供了每个任务粒度的微观视角,包括任务ID、类型、状态、所属进程、开始时间、处理的消息数等。它回答了“当前系统正在具体做什么工作?每个工作进展如何?”的问题。
- 与其它视图的区别:
V$QMON_COORDINATOR_STATS: 展示“经理”(QMNC)的宏观管理统计。V$QMON_SERVER_STATS: 展示“工人”(QMNn)的宏观工作统计。V$QMON_TASKS: 展示每个“工人”正在做的“单个项目”(任务)的实时详情。
2. 使用场景
此视图在以下场景中至关重要:
-
实时性能诊断与瓶颈定位:
- 当发现消息积压或传播延迟时,直接查看此视图,可以立即识别出哪些具体任务正在运行、已经运行了多久、处理了多少消息。一个运行时间极长的
PROPAGATION任务可能表明网络问题、目标队列不可用或存在性能问题。
- 当发现消息积压或传播延迟时,直接查看此视图,可以立即识别出哪些具体任务正在运行、已经运行了多久、处理了多少消息。一个运行时间极长的
-
监控任务执行进度:
- 通过
PROCESSED_MESSAGES和TOTAL_MESSAGES字段(如果可用),可以估算特定传播任务的完成百分比。
- 通过
-
审计与历史分析:
- 查看
LAST_EXECUTION_TIME和任务历史记录,可以分析 AQ 系统的任务执行模式和历史性能。
- 查看
-
故障排查:
- 任务状态长时间处于
SCHEDULED但未执行,可能意味着没有可用的 QMNn 进程(需要调整AQ_TM_PROCESSES)。 - 任务状态为
ERROR直接指明了执行失败的具体任务,是排查问题的第一切入点。
- 任务状态长时间处于
3. 字段含义详解
以下是 V$QMON_TASKS 视图中的核心字段及其详细解释。字段可能因版本略有差异。
| 字段名称 | 数据类型 | 含义说明 |
|---|---|---|
| TASK_ID | NUMBER | 任务的唯一标识符。用于在整个系统内唯一地识别一个任务实例。 |
| COORDINATOR_PID | NUMBER | 调度此任务的 QMNC 协调器进程的操作系统 PID。用于关联到 V$QMON_COORDINATOR_STATS。 |
| PROCESS_ID | NUMBER | 当前正在执行此任务的 QMNn 进程的 ID。如果任务未在执行,则为 NULL。用于关联到 V$QMON_SERVER_STATS。 |
| TASK_TYPE | VARCHAR2(64) | 任务的类型。这是最关键的字段之一。常见值: • PROPAGATION: 消息传播,最常见的任务。• PURGE_ON_EXPIRATION: 清理过期消息。• DELAYED_MESSAGES: 处理延迟消息(延迟时间已到,使其可用)。• MEMORY_CLEANUP: 内存清理任务。• FLOW_CONTROL: 流控制任务。 |
| SOURCE | VARCHAR2(64) | 任务的来源或发起者。对于传播任务,通常是源队列的名称。 |
| DESTINATION | VARCHAR2(64) | 任务的目标。对于传播任务,是目标队列或数据库链接的名称。 |
| STATE | VARCHAR2(64) | 任务的当前状态。这是另一个最关键的字段。常见值: • SCHEDULED: 已调度,等待可用进程执行。• EXECUTING: 正在执行。• COMPLETED: 已成功完成。• ERROR: 执行中发生错误。• INTERRUPTED: 被中断(如实例关闭)。• SLEEPING: 休眠中,等待下一次执行(周期任务)。 |
| SCHEDULED_TIME | DATE | 任务被调度执行的时间。 |
| LAST_EXECUTION_TIME | DATE | 任务最后一次开始执行的时间。如果任务正在执行,则表示本次开始的时间。 |
| LAST_COMPLETION_TIME | DATE | 任务最后一次成功完成的时间。 |
| PROCESSED_MESSAGES | NUMBER | 在当前执行周期内,此任务已处理的消息数量。对于了解任务进度非常有用。 |
| TOTAL_MESSAGES | NUMBER | 在当前执行周期内,此任务需要处理的消息总数。并非所有任务类型都填充此值。 |
| ERROR_MESSAGE | VARCHAR2(64) | 如果任务状态为 ERROR,此处会存储简短的错误信息。是排查故障的直接线索。 |
| PRIORITY | NUMBER | 任务的优先级。优先级高的任务会优先被调度执行。 |
| RUN_COUNT | NUMBER | 任务被执行的次数。 |
4. 相关视图与基表
-
相关动态性能视图:
V$QMON_SERVER_STATS: 通过PROCESS_ID字段关联,可以获取执行任务的 QMNn 进程的详细统计信息(如总处理消息数、总执行时间)。V$QMON_COORDINATOR_STATS: 通过COORDINATOR_PID字段关联,可以了解管理这些任务的协调器的状态。DBA_QUEUE_SCHEDULES: 这是数据字典视图,存储了持久化的传播调度配置信息。而V$QMON_TASKS显示的是内存中的活动任务实例。二者相辅相成,DBA_QUEUE_SCHEDULES是“计划”,V$QMON_TASKS是“执行”。V$AQ,DBA_QUEUES: 用于查看队列本身的属性消息积压情况。
-
基表(Underlying Base Table):
- **XQMTASK∗∗:这是‘VQMTASK**: 这是 `VQMTASK∗∗:这是‘VQMON_TASKS` 所依赖的底层内存结构(基表)。它存储了所有活动任务实例的实时状态信息。同样,这是一个未公开的、内存中的 X$ 表,严禁直接查询。
- 可以通过以下查询查看其定义:
SELECT view_definition FROM v$fixed_view_definition WHERE view_name = 'GV$QMON_TASKS';
5. 底层详细原理
-
任务生命周期:
- 创建(Create): QMNC 协调器根据内部调度(如定时器到期、消息到达)或配置(如
DBA_QUEUE_SCHEDULES)创建一个任务实例,并为其分配一个唯一的TASK_ID。状态置为SCHEDULED。 - 调度(Dispatch): QMNC 从其管理的 QMNn 进程池中寻找一个空闲的“工人”。找到后,将任务分配给该进程,更新
PROCESS_ID字段,状态置为EXECUTING,并设置LAST_EXECUTION_TIME。 - 执行(Execute): QMNn 进程开始执行任务逻辑(如执行传播的 SQL 语句)。在此期间,内核会不断更新
PROCESSED_MESSAGES等计数器。 - 完成(Complete): 任务执行完毕(成功、失败或被中断)。状态更新为
COMPLETED,ERROR, 或INTERRUPTED,并设置LAST_COMPLETION_TIME。对于周期任务(如持续传播),完成后状态可能变为SLEEPING,等待下一次被调度。 - 清理(Cleanup): 完成任务的信息可能会在内存中保留一段时间以供查询,最终会被清除。
- 创建(Create): QMNC 协调器根据内部调度(如定时器到期、消息到达)或配置(如
-
统计信息收集:
- 任务执行过程中的所有状态变化和计数器更新都由 Oracle 内核代码直接写入到内存结构
X$QMTASK中。 V$QMON_TASKS视图提供了对这些内存数据的实时、只读访问。
- 任务执行过程中的所有状态变化和计数器更新都由 Oracle 内核代码直接写入到内存结构
6. 相关知识点介绍
- 传播(Propagation): 这是最常见的任务类型。Oracle AQ 不是通过作业(DBMS_JOB/DBMS_SCHEDULER)来实现传播,而是通过内建的 QMNC 和 QMNn 进程机制。这使得它更加强大和高效。
- 错误处理: 如果一个
PROPAGATION任务因网络问题或目标队列错误而失败(状态为ERROR),QMNC 会根据调度配置中的设置进行重试。重试间隔会逐渐增加(指数退避),直到成功。 - 事务性: 许多任务(如传播)是以事务方式执行的。例如,一个传播任务可能会处理 500 条消息作为一个事务。如果在该批次中途失败,则整个批次都会回滚,下次重试时会重新处理这 500 条消息。这确保了消息不会丢失。
- 内存与持久化:
V$QMON_TASKS显示的是内存中的信息。实例关闭后,这些信息会消失。而任务的配置(如传播调度)是持久化在数据字典(DBA_QUEUE_SCHEDULES)中的。
7. 常用查询 SQL
1. 查看当前所有活动的任务(最重要、最常用的查询)
SELECT task_id,
task_type,
source,
destination,
state,
process_id,
processed_messages,
total_messages,
last_execution_time,
ROUND((SYSDATE - last_execution_time) * 86400, 2) as seconds_running,
error_message
FROM v$qmon_tasks
ORDER BY last_execution_time NULLS FIRST;
2. 监控正在执行的传播任务及其进度
SELECT task_id,
source,
destination,
processed_messages,
total_messages,
ROUND( (processed_messages / NULLIF(total_messages, 0)) * 100, 2 ) as percent_complete,
last_execution_time,
ROUND((SYSDATE - last_execution_time) * 86400, 2) as seconds_running
FROM v$qmon_tasks
WHERE state = 'EXECUTING'
AND task_type = 'PROPAGATION';
3. 查找失败的任务及其错误信息
SELECT task_id,
task_type,
source,
destination,
state,
error_message,
last_execution_time,
last_completion_time
FROM v$qmon_tasks
WHERE state = 'ERROR'
ORDER BY last_execution_time DESC;
4. 查看任务与工作进程的关联关系
SELECT t.task_id,
t.task_type,
t.state,
t.source,
t.destination,
s.process_id,
s.current_state as worker_state,
s.total_msgs_processed as worker_total_msgs
FROM v$qmon_tasks t
LEFT JOIN v$qmon_server_stats s ON t.process_id = s.process_id
ORDER BY t.task_id;
5. 检查积压的或待调度的任务
SELECT task_id, task_type, source, destination, state, scheduled_time
FROM v$qmon_tasks
WHERE state IN ('SCHEDULED', 'SLEEPING')
ORDER BY scheduled_time;
总结
V$QMON_TASKS 动态性能视图是深入诊断 Oracle Advanced Queueing 系统实时行为的终极工具。它将抽象的“消息处理”概念转化为具体、可观察的“任务”实例。
通过此视图,您可以:
- 精准定位 性能瓶颈所在的具体操作。
- 实时监控 关键任务(如传播)的执行进度。
- 快速发现 执行失败的任务并获取错误线索。
- 完整理解 AQ 后台任务的生命周期和调度机制。
将 V$QMON_TASKS、V$QMON_SERVER_STATS 和 V$QMON_COORDINATOR_STATS 三个视图结合使用,构成了从全局调度、进程统计到单个任务执行的全方位、立体化的 AQ 性能监控体系,是高级 DBA 必须掌握的核心技能。
欢迎关注我的公众号《IT小Chen》

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



