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

在这里插入图片描述

好的,我们来对 Oracle 19C 数据库中的 V$PERSISTENT_QUEUES 动态性能视图进行一次全面、深入的解析。这个视图与 Oracle Advanced Queuing (AQ) 的持久化机制密切相关。


1. 作用与概述

V$PERSISTENT_QUEUES 视图的主要作用是展示数据库中当前被缓存在系统全局区(SGA)中的持久队列(Persistent Queue)的相关信息

核心概念:持久队列
在 Oracle Advanced Queuing (AQ) 中,队列有两种基本模式:

  • 持久化队列(Persistent Queues):这是默认模式。消息被安全地存储在数据库表中,并受到重做日志(Redo Log)的保护。即使数据库实例发生故障,消息也不会丢失。它们参与数据库事务,确保了 “Exactly-Once” 的投递语义。
  • 缓冲队列(Buffered Queues):为了追求更高的性能,消息被存储在内存中,不会立即持久化到磁盘。这牺牲了部分的持久性保证(可能丢失消息),换取了更低的延迟。

V$PERSISTENT_QUEUES 视图聚焦于持久化队列。它并不直接存储队列消息,而是提供了这些队列在内存(SGA)中的元数据和控制结构的实时快照,用于监控和管理。


2. 使用场景

  1. AQ 性能监控与调优
    通过观察队列的 NUM_MSGS(消息数量)、STATE(状态)等字段,可以评估队列的繁忙程度和当前负载,判断是否存在积压或瓶颈。

  2. 故障诊断与排查
    当AQ操作(如入队、出队、传播)出现性能下降、挂起或错误时,此视图可以帮助DBA检查队列的内存状态是否正常,例如是否有队列处于异常状态(如 BLOCKED)。

  3. 实例恢复后验证
    数据库实例崩溃并重启后,可以查询此视图来确认持久队列的内存结构是否已成功恢复,从而保证AQ服务能够继续正常工作。

  4. 资源管理
    了解有多少队列正在被活动地使用,以及它们占用的内存资源情况。


3. 字段含义详解

以下是 V$PERSISTENT_QUEUES 视图中关键字段的详细说明:

| 字段名 | 数据类型 | 含义说明 |
| :— | :— | :— |
| QUEUE_ID | NUMBER | 队列的唯一内部标识符。与 DBA_QUEUES.QUEUE_ID 相对应。 |
| QUEUE_NAME | VARCHAR2(128) | 队列的名称。 |
| SCHEMA_NAME | VARCHAR2(128) | 队列所属 schema 的名称。 |
| MEMORY_SIZE | NUMBER | 该队列在 SGA 中占用的内存大小(以字节为单位)。 |
| NUM_MSGS | NUMBER | 当前队列中存在的消息总数(包括就绪和延迟的消息)。 |
| NUM_READY_MSGS | NUMBER | 当前处于 READY 状态、可供消费者出队的消息数量。这是监控积压的关键指标。 |
| NUM_DELAYED_MSGS | NUMBER | 当前处于 DELAYED 状态(尚未到达其预定处理时间)的消息数量。 |
| NUM_EXPIRED_MSGS | NUMBER | 已过期的消息数量(超过了其生存时间 expiration)。 |
| STATE | NUMBER | 队列的当前内部状态。这是一个代码值(例如,正常、阻塞等),通常需要与其他视图结合解读。 |
| PERSISTENT_STATE | NUMBER | 队列持久化状态的内部代码。指示队列元数据在内存与磁盘之间的同步状态。 |
| TRANSACTION_ID | VARCHAR2(22) | 当前正在该队列上进行操作的事务ID(如果存在)。 |
| ENQUEUE_ENABLED | VARCHAR2(5) | 指示入队操作是否被启用YES/NO)。 |
| DEQUEUE_ENABLED | VARCHAR2(5) | 指示出队操作是否被启用YES/NO)。 |
| QUEUE_MODE | NUMBER | 队列的模式1 代表持久化队列2 代表缓冲队列。此视图主要显示模式为 1 的队列。 |
| SPARE1 | NUMBER | 保留字段,供Oracle内部使用。 |
| SPARE2 | NUMBER | 保留字段,供Oracle内部使用。 |
| CON_ID | NUMBER | 包含此队列的容器的ID。在CDB环境中,指示该队列属于哪个PDB。 |


4. 相关视图与基表

  • 相关动态性能视图

    • DBA_QUEUES:数据字典视图,提供所有队列的静态定义信息(如类型、表名、重试次数等)。V$PERSISTENT_QUEUES 提供运行时内存信息,两者相辅相成。
    • V$BUFFERED_QUEUES:与 V$PERSISTENT_QUEUES 类似,但专门用于监控缓冲队列
    • V$AQ:提供高级队列的统计信息。
    • V$PERSISTENT_QMN_CACHE:存储队列监视器进程的持久化状态信息,与队列操作密切相关。
  • 底层基表
    V$PERSISTENT_QUEUES 是一个动态性能视图,它不基于普通的磁盘基表。它的数据来源于 SGA 中的一块内存结构,该结构由 QMNn(队列监视器)进程管理和维护。
    持久队列的消息内容本身是存储在常规的数据库表中的(这些表在创建队列时由Oracle自动创建,名称类似于 AQ$<queue_table_name>)。而 V$PERSISTENT_QUEUES 视图反映的是用于快速访问和管理这些队列表的内存中的控制块和元数据


5. 详细原理与知识点

1. 持久化如何实现?
持久队列的可靠性建立在数据库的核心机制之上:

  • 表存储:消息作为行存储在普通的堆组织表或索引组织表中。
  • 重做日志(Redo Log):所有对队列表的入队和出队操作都会生成重做日志记录。这确保了所有操作都可以在实例恢复时被重演。
  • 事务控制:AQ操作完全支持数据库事务。提交事务后,消息才真正入队成功;回滚事务则会撤销操作。

2. 内存缓存(SGA)的作用:
虽然消息存储在磁盘表中,但为了极致性能,Oracle在SGA中缓存了队列的元数据和控制信息:

  • 快速访问:避免为每个操作都去访问数据字典和队列表结构。
  • 状态管理:在内存中维护消息的状态(如就绪、延迟、处理中),极大减少了对底层表的锁争用。
  • 队列监控QMNn 进程使用这些内存结构来高效地管理传播、延迟消息唤醒等后台作业。

3. 实例恢复过程:

  1. 故障:实例意外终止,SGA中的队列内存结构丢失。
  2. 恢复:实例启动时,SMON进程进行恢复。
  3. 重建内存结构:SMON进程通过读取队列的底层存储表和重做日志,来重建 V$PERSISTENT_QUEUES 视图所反映的SGA内存结构。它会回滚未提交的事务(恢复出队操作),重做已提交的事务(恢复入队操作)。
  4. QMNn进程启动:队列监视器进程启动,读取已恢复的内存结构,继续执行传播等任务。

4. 关键知识点:

  • QMNn 进程:这是管理和驱动AQ活动的后台进程。没有它,持久队列的传播和部分管理功能将无法工作。
  • 与缓冲队列的区别:缓冲队列的消息主要存储在SGA中,其元数据在 V$BUFFERED_QUEUES 中显示,持久性保证更弱,但性能更高。
  • CON_ID 的重要性:在CDB中,每个PDB都有自己的AQ环境。CON_ID 字段确保了队列信息的隔离。

6. 常用查询SQL

1. 查看所有持久队列的基本运行状态:

SELECT q.QUEUE_ID,
       q.SCHEMA_NAME || '.' || q.QUEUE_NAME AS FULL_QUEUE_NAME,
       q.QUEUE_MODE,
       q.NUM_MSGS AS TOTAL_MSGS,
       q.NUM_READY_MSGS AS READY_MSGS,
       q.NUM_DELAYED_MSGS AS DELAYED_MSGS,
       q.ENQUEUE_ENABLED,
       q.DEQUEUE_ENABLED,
       q.CON_ID
FROM V$PERSISTENT_QUEUES q
ORDER BY q.SCHEMA_NAME, q.QUEUE_NAME;

2. 监控消息积压情况(寻找有大量就绪消息的队列):

SELECT SCHEMA_NAME, QUEUE_NAME, NUM_READY_MSGS, NUM_MSGS
FROM V$PERSISTENT_QUEUES
WHERE NUM_READY_MSGS > 100  -- 设置一个你认为构成“积压”的阈值
ORDER BY NUM_READY_MSGS DESC;

3. 检查队列功能是否被禁用(排查操作失败原因):

SELECT SCHEMA_NAME, QUEUE_NAME, ENQUEUE_ENABLED, DEQUEUE_ENABLED
FROM V$PERSISTENT_QUEUES
WHERE ENQUEUE_ENABLED = 'NO' OR DEQUEUE_ENABLED = 'NO';

4. 在CDB环境中,查询特定PDB中的队列信息:

SELECT c.NAME AS PDB_NAME,
       q.SCHEMA_NAME,
       q.QUEUE_NAME,
       q.NUM_READY_MSGS
FROM V$PERSISTENT_QUEUES q
JOIN V$CONTAINERS c ON q.CON_ID = c.CON_ID
WHERE c.NAME = 'YOUR_PDB_NAME'
ORDER BY q.NUM_READY_MSGS DESC;

总结

V$PERSISTENT_QUEUESOracle Advanced Queuing (AQ) 核心组件的一个关键监控窗口。它提供了持久化队列在内存中的运行时元数据信息,使得DBA能够:

  1. 实时监控:了解队列的负载、消息积压情况和功能状态。
  2. 诊断问题:快速识别被禁用的队列或存在潜在性能问题的队列。
  3. 理解架构:透过它理解AQ如何将数据库的持久化机制(表、事务、重做日志)与内存缓存技术结合,在保证消息可靠性的同时提供高性能。

对于依赖Oracle AQ或Oracle Streams(基于AQ构建)进行异步通信、集成和工作流处理的系统来说,掌握这个视图是进行高效运维和故障排查的重要技能。

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值