
好的,我们来对 Oracle 19C 中的 V$PROPAGATION_RECEIVER 动态性能视图进行一次全面、深入的详解。这个视图是 Oracle 流复制 (Streams) 和 高级复制 (Advanced Replication) 架构中的关键诊断工具,专门用于监控传播接收器的状态。
1. 作用与概述
V$PROPAGATION_RECEIVER 动态性能视图提供了关于 Oracle 流复制中传播作业(Propagation)的接收端(Receiver) 的实时性能和状态信息。
核心作用:监控从源数据库 发送到本数据库(即目标数据库)的传播消息的接收情况。它让你能够洞察接收器进程的健康状况、性能指标(如消息吞吐量、延迟)以及任何遇到的错误。这是诊断跨数据库数据复制延迟、失败或性能问题的关键视图。
重要提示:V$PROPAGATION_RECEIVER 显示的是目标数据库上的信息。要查看源数据库上发送端的信息,应使用 V$PROPAGATION_SENDER 视图。
2. 使用场景
- 诊断复制延迟问题:当目标数据库的数据滞后于源数据库时,使用此视图检查接收器是否正在运行、接收消息的速率以及最后一条成功接收的消息的 SCN 和时间戳,以量化延迟。
- 排查复制失败或中断:当复制停止工作时,检查视图中的
STATUS字段和LAST_ERROR_*系列字段,以确定接收器是否因遇到错误而停止。 - 监控复制性能:评估接收器进程的资源消耗(如 CPU 时间)和吞吐量(每秒消息数、字节数),以确定复制是否成为系统瓶颈。
- 验证配置和操作:在启停传播作业、进行维护或修改配置后,查询此视图以确认操作是否生效以及接收器状态是否符合预期。
3. 字段含义详解
以下是 V$PROPAGATION_RECEIVER 视图的主要字段及其含义的详细表格。
| 字段名 | 类型 | 含义详解 |
|---|---|---|
| QUEUE_SCHEMA | VARCHAR2(30) | 队列所有者模式:本地目标队列的所有者用户名。 |
| QUEUE_NAME | VARCHAR2(30) | 队列名称:本地目标队列的名称。传播的消息最终会被放入此队列。 |
| SOURCE_DATABASE | VARCHAR2(128) | 源数据库:消息来源数据库的全局名称(Global Name)。 |
| STATUS | VARCHAR2(8) | 接收器状态:核心字段。表示接收器进程的当前状态。 - RUNNING: 正在运行并接收消息。 - ABORTED: 因错误而中止。检查 LAST_ERROR 字段。- SCHEDULED: 已调度但未运行(可能在等待下一次运行时间)。 - DISABLED: 传播作业已被禁用。 |
| SID | NUMBER | 会话标识符:接收器会话的 SID。可与 V$SESSION 关联获取更多会话详情。 |
| SERIAL# | NUMBER | 会话序列号:接收器会话的序列号。与 SID 一起可唯一标识会话。 |
| TOTAL_MESSAGES | NUMBER | 消息总数:本次运行期间成功接收并入队的消息总数。 |
| TOTAL_BYTES | NUMBER | 字节总数:本次运行期间成功接收的消息的总字节大小。 |
| CURRENT_MSG_CREATION | DATE | 当前消息创建时间:衡量延迟的关键字段。当前正在处理的消息在源数据库上被创建(提交)的时间。如果接收器空闲,则显示最后一条处理的消息的创建时间。将此时间与当前时间比较,可估算数据延迟。 |
| LAST_ERROR | VARCHAR2(100) | 最后错误:接收器遇到的最后一个错误的错误消息。 |
| LAST_ERROR_MESSAGE | VARCHAR2(4000) | 最后错误消息全文:上一个错误的完整消息文本,通常比 LAST_ERROR 更详细。 |
| ERROR_DATE | DATE | 错误日期:最后一个错误发生的时间戳。 |
| RECEIVER_TIME | NUMBER | 接收器时间:接收器进程在处理消息上花费的总时间(秒)。 |
| RECEIVER_CPU_TIME | NUMBER | 接收器CPU时间:接收器进程消耗的 CPU 时间(秒)。高 CPU 时间可能表明处理逻辑复杂或消息量大。 |
| INSTANCE | VARCHAR2(16) | 实例名:在 RAC 环境中,运行此接收器进程的实例名称。 |
4. 相关视图与基表
V$PROPAGATION_SENDER:最直接的相关视图,但在源数据库上查询。它显示了发送到目标数据库的传播发送端的性能指标。两者结合可以全面分析传播链路(例如,对比发送和接收的消息数量是否匹配)。DBA_PROPAGATION:数据字典视图,显示所有已配置的传播作业的静态定义信息(如源队列、目标队列、目标数据库链接、传播规则等)。DBA_QUEUES:数据字典视图,显示队列信息,包括用作传播目标的队列。V$STREAMS_CAPTURE,V$STREAMS_APPLY_READER,V$STREAMS_APPLY_SERVER:其他流相关的性能视图,用于监控捕获和应用进程。V$SESSION:通过SID和SERIAL#关联,可以获取接收器会话的详细执行信息(如SQL_ID,EVENT,WAIT_TIME)。- 基表 (Underlying Table):
V$PROPAGATION_RECEIVER的数据来源于流复制组件的内存管理结构。其底层 X表∗∗通常是∗∗‘X表** 通常是 **`X表∗∗通常是∗∗‘XQPROP_RCVR` 或类似名称的内部结构。这些是 Oracle 内部的、未公开的结构。
5. 底层详细原理与相关知识点
-
Oracle Streams/Advanced Replication 架构:
- 传播 (Propagation) 是流复制中的一个关键组件,负责将源队列中的消息(代表数据变更的 LCRs - Logical Change Records)通过数据库链接(DBLINK)发送到远程目标队列。
- 这个过程涉及两个主要进程:
- 传播发送器 (Propagation Sender):在源数据库运行,从事务队列中取出消息并通过网络发送。
- 传播接收器 (Propagation Receiver):在目标数据库运行(由发送器进程通过数据库链接调用),接收消息并将其入队到目标队列中。
V$PROPAGATION_RECEIVER监控的就是这个进程。
-
工作流程:
- 源数据库的捕获进程或用户应用将 LCRs 或消息放入源队列。
- 源数据库的传播作业(发送器)被调度启动。
- 发送器通过预先配置的数据库链接连接到目标数据库。
- 发送器在目标数据库端启动一个接收器会话。
- 接收器会话从网络连接读取消息流。
- 接收器会话将消息事务性地(原子地)插入到目标队列中。
- 目标数据库的应用进程从目标队列中取出消息并应用(执行 DML)。
V$PROPAGATION_RECEIVER统计信息就是在第 5 和第 6 步中收集的。
-
关键性能指标与诊断:
- 延迟 (
CURRENT_MSG_CREATION): 这是最重要的指标。它直接反映了数据的新旧程度。 - 吞吐量 (
TOTAL_MESSAGES,TOTAL_BYTES): 结合运行时间,可以计算消息速率,评估复制性能。 - 错误 (
LAST_ERROR_*): 任何错误都可能导致复制中断。常见的错误包括网络问题、数据库链接认证失败、目标队列不可用、权限不足等。 - 资源消耗 (
RECEIVER_CPU_TIME): 高 CPU 消耗可能指向复杂的消息转换规则或极高的消息流量。
- 延迟 (
6. 常用查询 SQL
1. 查看所有传播接收器的摘要状态(最常用)
快速了解所有传入复制链路的健康状况。
SELECT source_database,
queue_schema || '.' || queue_name AS destination_queue,
status,
current_msg_creation,
total_messages,
total_bytes,
last_error
FROM v$propagation_receiver
ORDER BY source_database;
2. 计算数据延迟(极其重要)
精确计算目标数据库落后源数据库的时间。
SELECT source_database,
queue_schema,
queue_name,
status,
current_msg_creation,
-- 计算延迟(分钟)
ROUND((SYSDATE - current_msg_creation) * 24 * 60, 2) AS delay_minutes,
total_messages
FROM v$propagation_receiver
WHERE status = 'RUNNING' -- 通常只关心正在运行的
OR current_msg_creation IS NOT NULL;
3. 诊断出错的传播接收器
快速找到有问题的复制链路并查看错误详情。
SELECT source_database,
queue_schema,
queue_name,
status,
error_date,
last_error,
last_error_message -- 包含最详细的错误信息
FROM v$propagation_receiver
WHERE status = 'ABORTED'
OR last_error IS NOT NULL;
4. 关联V$SESSION获取更多等待信息
当接收器性能不佳时,查看其会话在等待什么资源。
SELECT r.source_database,
r.queue_name,
r.status,
s.sid,
s.serial#,
s.event,
s.seconds_in_wait,
s.state
FROM v$propagation_receiver r
JOIN v$session s ON (r.sid = s.sid AND r.serial# = s.serial#)
WHERE r.status = 'RUNNING';
5. 监控接收器的性能速率
假设该查询每分钟运行一次,可以计算每秒的消息吞吐量。
-- 第一次运行:记录初始值
CREATE TABLE prop_rec_snapshot AS
SELECT source_database, queue_name, total_messages, total_bytes, SYSDATE AS snap_time
FROM v$propagation_receiver
WHERE status = 'RUNNING';
-- 等待一段时间(如60秒)后第二次运行
SELECT r.source_database,
r.queue_name,
-- 计算每秒消息数
(r.total_messages - s.total_messages) / (r.snap_time - s.snap_time) / 86400 AS msg_per_sec,
-- 计算每秒字节数
(r.total_bytes - s.total_bytes) / (r.snap_time - s.snap_time) / 86400 AS bytes_per_sec
FROM v$propagation_receiver r
JOIN prop_rec_snapshot s ON (r.source_database = s.source_database AND r.queue_name = s.queue_name)
WHERE r.status = 'RUNNING';
-- 更新快照以供下次使用
DROP TABLE prop_rec_snapshot;
CREATE TABLE prop_rec_snapshot AS
SELECT source_database, queue_name, total_messages, total_bytes, SYSDATE AS snap_time
FROM v$propagation_receiver
WHERE status = 'RUNNING';
总结
V$PROPAGATION_RECEIVER 视图是管理和维护 Oracle 流复制和高级复制环境的核心监控点。它专注于复制链路的目标端,提供了评估数据新鲜度(延迟)、可靠性(错误) 和性能(吞吐量) 所需的关键指标。
通过持续监控此视图,DBA 可以:
- ** proactively 发现**复制延迟并分析其原因。
- 快速响应复制中断故障,并根据详细的错误信息进行修复。
- 量化评估复制对目标系统资源的消耗,并进行容量规划。
- 验证复制配置和操作的有效性。
对于依赖 Oracle 流复制进行数据分发的系统,熟练掌握此视图是保障数据一致性和业务连续性的必备技能。
欢迎关注我的公众号《IT小Chen》

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



