
好的,我们来对 Oracle 19C 中的 V$PROPAGATION_SENDER 动态性能视图进行一次全面、深入的详解。这个视图是 Oracle 流复制 (Streams) 和 高级复制 (Advanced Replication) 架构中与 V$PROPAGATION_RECEIVER 相对应的关键诊断工具,专门用于监控传播发送器的状态。
1. 作用与概述
V$PROPAGATION_SENDER 动态性能视图提供了关于 Oracle 流复制中传播作业(Propagation)的发送端(Sender) 的实时性能和状态信息。
核心作用:监控从本数据库(即源数据库)发送到目标数据库的传播消息的发送情况。它让你能够洞察发送器进程的健康状况、性能指标(如消息吞吐量、网络状态)以及任何遇到的错误。这是诊断跨数据库数据复制为何延迟、失败或性能不佳的源端关键视图。
重要提示:V$PROPAGATION_SENDER 显示的是源数据库上的信息。要查看目标数据库上接收端的信息,应使用 V$PROPAGATION_RECEIVER 视图。
2. 使用场景
- 诊断复制延迟问题:当目标数据库数据滞后时,在源端使用此视图检查发送器是否正在运行、发送消息的速率以及最后一条成功发送的消息的 SCN 和时间戳,以判断问题是出在发送端、网络还是接收端。
- 排查复制失败或中断:当复制停止工作时,检查视图中的
STATUS和LAST_ERROR_*系列字段,确定发送器是否因错误(如网络中断、目标不可达、权限问题)而停止。 - 监控复制性能与资源消耗:评估发送器进程的 CPU 使用情况、网络吞吐量(每秒发送的字节数)以及消息吞吐量,识别发送端是否存在性能瓶颈。
- 验证配置和操作:在启停传播作业、进行维护或修改配置后,查询此视图以确认操作是否生效以及发送器状态是否符合预期。
3. 字段含义详解
以下是 V$PROPAGATION_SENDER 视图的主要字段及其含义的详细表格。
| 字段名 | 类型 | 含义详解 |
|---|---|---|
| DBA_NAME | VARCHAR2(128) | 目标数据库:消息要发送到的目标数据库的全局名称(Global Name)。这是复制链路的目标标识。 |
| QUEUE_SCHEMA | VARCHAR2(30) | 队列所有者模式:本地源队列的所有者用户名。 |
| QUEUE_NAME | VARCHAR2(30) | 队列名称:本地源队列的名称。传播发送器从此队列中取出消息发送。 |
| 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_TIMESTAMP | DATE | 当前消息创建时间:衡量延迟的关键字段。当前正在发送的消息在源数据库上被创建(提交)的时间。如果发送器空闲,则显示最后一条发送的消息的创建时间。 |
| LAST_ERROR | VARCHAR2(100) | 最后错误:发送器遇到的最后一个错误的错误消息。常见错误涉及网络、数据库链接、目标队列权限等。 |
| LAST_ERROR_MESSAGE | VARCHAR2(4000) | 最后错误消息全文:上一个错误的完整消息文本,通常比 LAST_ERROR 更详细。 |
| ERROR_DATE | DATE | 错误日期:最后一个错误发生的时间戳。 |
| SENDER_TIME | NUMBER | 发送器时间:发送器进程在发送消息上花费的总时间(秒)。 |
| SENDER_CPU_TIME | NUMBER | 发送器CPU时间:发送器进程消耗的 CPU 时间(秒)。 |
| INSTANCE | VARCHAR2(16) | 实例名:在 RAC 环境中,运行此发送器进程的实例名称。 |
| DESTINATION | VARCHAR2(128) | 目标地址:发送连接的目标地址,通常包含服务名和数据库链接信息。 |
4. 相关视图与基表
V$PROPAGATION_RECEIVER:最直接的相关视图,但在目标数据库上查询。它显示了接收来自源数据库消息的接收端性能指标。两者结合可以全面分析传播链路(例如,对比发送和接收的消息数量是否匹配,以判断网络是否有丢包)。DBA_PROPAGATION:数据字典视图,显示所有已配置的传播作业的静态定义信息(如源队列、目标队列、目标数据库链接、传播规则等)。DBA_QUEUES:数据字典视图,显示队列信息,包括用作传播源的队列。DBA_DB_LINKS:数据字典视图,显示数据库链接信息,传播使用 DB Link 连接到目标库。V$STREAMS_CAPTURE:监控捕获进程的性能视图,捕获进程是传播发送器的消息来源。V$SESSION:通过SID和SERIAL#关联,可以获取发送器会话的详细执行信息(如SQL_ID,EVENT-很可能与网络等待事件相关)。- 基表 (Underlying Table):
V$PROPAGATION_SENDER的数据来源于流复制组件的内存管理结构。其底层 X表∗∗通常是∗∗‘X表** 通常是 **`X表∗∗通常是∗∗‘XQPROP_SNDR` 或类似名称的内部结构。这些是 Oracle 内部的、未公开的结构。
5. 底层详细原理与相关知识点
-
Oracle Streams/Advanced Replication 架构:
- 传播 (Propagation) 是流复制中的一个关键组件,负责将源队列中的消息(代表数据变更的 LCRs - Logical Change Records)通过数据库链接(DBLINK)发送到远程目标队列。
- 这个过程涉及两个主要进程:
- 传播发送器 (Propagation Sender):在源数据库运行,从事务队列中取出消息并通过网络发送。
V$PROPAGATION_SENDER监控的就是这个进程。 - 传播接收器 (Propagation Receiver):在目标数据库运行(由发送器进程通过数据库链接调用),接收消息并将其入队到目标队列中。
- 传播发送器 (Propagation Sender):在源数据库运行,从事务队列中取出消息并通过网络发送。
-
工作流程:
- 源数据库的捕获进程或用户应用将 LCRs 或消息放入源队列。
- 源数据库的传播作业(发送器)被调度启动。
- 发送器通过预先配置的数据库链接连接到目标数据库。此阶段常见的等待事件是
SQL*Net message to client。 - 发送器从源队列中取出消息。此阶段常见的等待事件是
Streams AQ: waiting for messages in the queue。 - 发送器将消息通过网络发送给目标数据库的接收器。此阶段常见的等待事件是
SQL*Net more data to client,网络性能是此处关键。 - 发送器等待接收器的确认。此阶段常见的等待事件是
SQL*Net message from client。
V$PROPAGATION_SENDER的统计信息就是在第 3、4、5、6 步中收集的。
-
关键性能指标与诊断:
- 延迟 (
CURRENT_MSG_CREATION_TIMESTAMP): 消息在源端产生的时间。与当前时间比较可计算源端积压的延迟。 - 吞吐量 (
TOTAL_MESSAGES,TOTAL_BYTES): 结合运行时间,可以计算发送速率,评估网络性能和发送端负载。 - 错误 (
LAST_ERROR_*): 发送端错误通常与连接性相关:网络中断、数据库链接配置错误、目标主机无法解析、目标监听器未启动、权限不足(如对目标队列的入队权限)等。 - 资源消耗 (
SENDER_CPU_TIME): 高 CPU 消耗可能指向复杂的消息转换规则或极高的消息流量。
- 延迟 (
6. 常用查询 SQL
1. 查看所有传播发送器的摘要状态(最常用)
快速了解所有传出复制链路的健康状况。
SELECT dba_name AS destination_db,
queue_schema || '.' || queue_name AS source_queue,
status,
current_msg_creation_timestamp,
total_messages,
total_bytes,
last_error
FROM v$propagation_sender
ORDER BY dba_name;
2. 计算源端积压的延迟
查看消息在源端队列中等待了多久才被处理。
SELECT dba_name,
queue_schema,
queue_name,
status,
current_msg_creation_timestamp,
-- 计算源端延迟(分钟)
ROUND((SYSDATE - current_msg_creation_timestamp) * 24 * 60, 2) AS source_delay_minutes,
total_messages
FROM v$propagation_sender
WHERE status = 'RUNNING'
OR current_msg_creation_timestamp IS NOT NULL;
3. 诊断出错的传播发送器
快速找到有问题的发送链路并查看错误详情,重点关注连接性问题。
SELECT dba_name,
queue_schema,
queue_name,
status,
error_date,
last_error,
last_error_message -- 包含最详细的错误信息,如ORA-12170: TNS连接超时
FROM v$propagation_sender
WHERE status = 'ABORTED'
OR last_error IS NOT NULL;
4. 关联V$SESSION获取网络等待信息
当发送器性能不佳时,查看其会话是否在等待网络I/O。
SELECT s.dba_name,
s.queue_name,
s.status,
sess.sid,
sess.serial#,
sess.event, -- 重点关注 'SQL*Net%' 相关事件
sess.seconds_in_wait,
sess.state
FROM v$propagation_sender s
JOIN v$session sess ON (s.sid = sess.sid AND s.serial# = sess.serial#)
WHERE s.status = 'RUNNING';
5. 监控发送器的性能速率
假设该查询每分钟运行一次,可以计算每秒的发送吞吐量。
-- 第一次运行:记录初始值
CREATE TABLE prop_send_snapshot AS
SELECT dba_name, queue_name, total_messages, total_bytes, SYSDATE AS snap_time
FROM v$propagation_sender
WHERE status = 'RUNNING';
-- 等待一段时间(如60秒)后第二次运行
SELECT s.dba_name,
s.queue_name,
-- 计算每秒消息数
(s.total_messages - snap.total_messages) / (s.snap_time - snap.snap_time) / 86400 AS msg_per_sec,
-- 计算每秒字节数 (网络带宽使用)
(s.total_bytes - snap.total_bytes) / (s.snap_time - snap.snap_time) / 86400 AS bytes_per_sec
FROM v$propagation_sender s
JOIN prop_send_snapshot snap ON (s.dba_name = snap.dba_name AND s.queue_name = snap.queue_name)
WHERE s.status = 'RUNNING';
-- 更新快照以供下次使用
DROP TABLE prop_send_snapshot;
CREATE TABLE prop_send_snapshot AS
SELECT dba_name, queue_name, total_messages, total_bytes, SYSDATE AS snap_time
FROM v$propagation_sender
WHERE status = 'RUNNING';
总结
V$PROPAGATION_SENDER 视图是管理和维护 Oracle 流复制和高级复制环境的源端核心监控点。它专注于复制链路的起始点,提供了评估发送性能、网络健康状况和源端可靠性所需的关键指标。
通过持续监控此视图,DBA 可以:
- 判断问题范围:区分复制问题是源自发送端、网络还是接收端。
- 快速诊断和解决源端发起的连接性和权限类错误。
- 量化评估复制对源系统资源的消耗以及网络带宽的使用情况。
- 验证源端的复制配置和操作的有效性。
对于依赖 Oracle 流复制进行数据分发的系统,将 V$PROPAGATION_SENDER(源端)与 V$PROPAGATION_RECEIVER(目标端)结合使用,是构建完整监控体系、保障数据高效可靠分发的必备技能。
欢迎关注我的公众号《IT小Chen》
1164

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



