
好的,我们来对 Oracle 19C 数据库中的 V$PERSISTENT_PUBLISHERS 动态性能视图进行一次全面、深入的解析。
1. 作用与概述
V$PERSISTENT_PUBLISHERS 视图的主要作用是展示配置为“持久发布”(Persistent Publication)的 LogMiner 发布者(Publisher)的相关信息。
核心概念:持久发布 (Persistent Publication)
在 Oracle 的逻辑复制(如 Oracle GoldenGate, XStream)和 Change Data Capture (CDC) 环境中,需要一个进程来“发布”或“捕获”数据库的重做日志中的变更。这个进程就是 发布者 (Publisher)。
- 瞬时发布 (Transient Publication):发布者进程(如 LogMiner)在启动时动态配置,进程退出后配置信息丢失。
- 持久发布 (Persistent Publication):发布者的配置信息(如要捕获的 schema、表、规则等)被永久地保存在数据库的数据字典中。即使数据库或发布者进程重启,配置也会被自动重新加载,确保了复制环境的可靠性和连续性。
V$PERSISTENT_PUBLISHERS 正是为了管理和监控这些持久化配置的发布者而存在的。它反映了当前数据库中活动的、已配置的持久发布者列表。
2. 使用场景
-
Oracle GoldenGate / XStream 环境监控:
这是最主要的使用场景。管理员通过此视图确认预期的持久发布者是否已正确注册并处于活动(ACTIVE)状态,监控发布者的重启SCN和状态变更。 -
故障诊断与排查:
当逻辑复制出现中断、延迟或无法捕获变更时,查询此视图可以检查发布者状态是否为INACTIVE或ERROR,从而快速定位问题是出在源端的捕获环节。 -
配置验证:
在配置或修改完 GoldenGate 或 XStream 的抽取进程(Extract)后,通过此视图验证持久发布者参数(如SCN,first_scn,captured_scn)是否符合预期。 -
性能监控:
结合其他视图(如V$STREAMS_CAPTURE),可以了解发布者读取和解析重做日志的进度和效率。
3. 字段含义详解
以下是 V$PERSISTENT_PUBLISHERS 视图中各个字段的详细说明:
| 字段名 | 数据类型 | 含义说明 |
| :— | :— | :— |
| PUBLISHER_ID | NUMBER | 发布者的唯一数字标识符。由系统自动分配。 |
| PUBLISHER_NAME | VARCHAR2(128) | 发布者的名称。这通常对应 Oracle GoldenGate 抽取进程或 XStream 应用进程的名称。 |
| STATUS | VARCHAR2(10) | 发布者的当前状态。有效值:
- ACTIVE:发布者已注册并且正在活动地发布更改。
- INACTIVE:发布者已注册但目前未处于活动状态(例如,关联的进程已停止)。
- ERROR:发布者在尝试发布更改时遇到错误。 |
| GROUP_NAME | VARCHAR2(128) | 与此发布者相关联的 LogMiner 挖掘组(Mining Group)的名称。一个挖掘组可以被多个发布者共享。 |
| SCN | NUMBER | 发布者启动或重启时的系统更改号(SCN)。这是发布者开始或恢复挖掘的重做日志位置。 |
| FIRST_SCN | NUMBER | 发布者可以开始挖掘的最低SCN。通常这是发布者创建时的SCN。 |
| CAPTURED_SCN | NUMBER | 发布者最后成功捕获并发布的更改的SCN。这代表了发布者的当前进度。 |
| LATEST_SCN | NUMBER | 发布者已看到(但未必已处理或发布)的最高SCN。 |
| SOURCE_DATABASE | VARCHAR2(128) | 源数据库的唯一标识符(通常是DBID或GUID)。在灾备环境中,用于区分数据来源。 |
| CREATE_DATE | DATE | 此发布者配置被持久化创建的日期和时间。 |
| LAST_ALTER_DATE | DATE | 此发布者配置最后一次被修改的日期和时间。 |
| SPARE1 | VARCHAR2(128) | 保留字段,供Oracle内部使用。 |
| SPARE2 | NUMBER | 保留字段,供Oracle内部使用。 |
| CON_ID | NUMBER | 包含此发布者的容器的ID。在CDB环境中,指示该发布者属于哪个PDB。对于非CDB,此值为0。 |
4. 相关视图与基表
-
相关动态性能视图:
V$STREAMS_CAPTURE:提供关于捕获进程(即活动的发布者)的实时运行时信息,如状态、已用内存、错误消息等。V$PERSISTENT_PUBLISHERS显示配置,而V$STREAMS_CAPTURE显示运行实例。V$LOGMINER_CONTENTS:LogMiner 会话挖掘出的实际重做内容。发布者本质上是对此视图的持续查询。DBA_CAPTURE/DBA_REGISTERED_ARCHIVED_LOG:数据字典视图,也包含一些与逻辑捕获相关的配置和元数据信息。
-
底层基表:
与大多数V$视图一样,V$PERSISTENT_PUBLISHERS并非基于普通的用户表,而是源自内部的X$表和控制文件。其持久化的配置信息主要存储在 数据字典(如SYS.SLOG、SYS.CAPTURE、SYS.CAPTURE、SYS.CAPTURE 等) 中。当数据库启动或发布者进程注册时,会从数据字典中读取这些信息并填充到内存中,进而通过V$PERSISTENT_PUBLISHERS视图暴露给用户。
5. 详细原理与知识点
1. 发布者与 LogMiner 的关系:
持久发布者是 Oracle LogMiner 功能的一个高级、持久的封装。LogMiner 提供了读取和分析重做日志的基础能力。而持久发布者利用此能力,通过预先定义的持久化配置,自动、连续地将日志内容转化为逻辑变更记录(LCRs),并传递给下游的应用程序(如GoldenGate Apply进程)。
2. 持久化的优势:
- 高可用性:如果数据库或捕获进程重启,进程会自动从数据字典中读取配置,并从
CAPTURED_SCN或SCN附近的位置继续挖掘日志,无需人工干预,极大减少了停机时间。 - 一致性:确保了捕获配置不会意外丢失,与数据库模式变更(如DDL)的管理集成得更好。
3. 工作流程:
- 配置:当使用
DBMS_GOLDENGATE或DBMS_CAPTURE_ADM包创建或修改一个抽取进程时,其配置(如规则集、第一次SCN)被写入数据字典。 - 注册:当抽取进程启动时,它会在数据库中以其名称注册为一个持久发布者。此时,
V$PERSISTENT_PUBLISHERS中会出现一条新记录,状态为ACTIVE,并设置SCN和FIRST_SCN。 - 挖掘与发布:发布者调用 LogMiner 引擎,从指定的SCN开始持续读取重做日志,解析变更,并通过Oracle网络或队列将变更数据发送给消费者。
- 进度跟踪:
CAPTURED_SCN和LATEST_SCN会不断更新,以反映发布进度。 - 停止/重启:进程停止后,状态可能变为
INACTIVE。重启后,进程会重新注册,并从最后的CAPTURED_SCN开始恢复挖掘。
4. 与CDB的关系:
在多租户环境中,每个PDB都可以有自己独立的逻辑复制配置。CON_ID 字段明确指出了发布者所属的PDB。这意味着你可以在一个CDB中的多个PDB上同时运行GoldenGate,每个PDB的发布者信息都是独立管理的。
6. 常用查询SQL
1. 查看当前所有持久的发布者:
SELECT PUBLISHER_ID,
PUBLISHER_NAME,
STATUS,
SCN,
CAPTURED_SCN,
LATEST_SCN,
TO_CHAR(CREATE_DATE, 'YYYY-MM-DD HH24:MI:SS') AS CREATED,
CON_ID
FROM V$PERSISTENT_PUBLISHERS
ORDER BY PUBLISHER_ID;
2. 监控发布者的进度和状态(关键监控语句):
SELECT PUBLISHER_NAME,
STATUS,
SCN AS RESTART_SCN,
CAPTURED_SCN,
(LATEST_SCN - CAPTURED_SCN) AS LAG_SCN,
TO_CHAR(CREATE_DATE, 'YYYY-MM-DD HH24:MI:SS') AS CREATED
FROM V$PERSISTENT_PUBLISHERS
WHERE STATUS = 'ACTIVE'; -- 也可以查看 'INACTIVE' 或 'ERROR'
3. 诊断处于错误状态的发布者:
SELECT p.PUBLISHER_NAME,
p.STATUS,
p.SCN,
s.CAPTURE_MESSAGE || ' (Error: ' || s.ERROR_MESSAGE || ')' AS ERROR_DETAILS
FROM V$PERSISTENT_PUBLISHERS p
JOIN V$STREAMS_CAPTURE s ON p.PUBLISHER_NAME = s.CAPTURE_NAME
WHERE p.STATUS = 'ERROR';
4. 在CDB中查询,显示发布者所在的PDB名称:
SELECT c.NAME AS PDB_NAME,
p.PUBLISHER_NAME,
p.STATUS,
p.CAPTURED_SCN
FROM V$PERSISTENT_PUBLISHERS p
JOIN V$CONTAINERS c ON p.CON_ID = c.CON_ID
ORDER BY c.NAME, p.PUBLISHER_NAME;
总结
V$PERSISTENT_PUBLISHERS 是管理和监控基于 Oracle 逻辑复制技术(如 GoldenGate 和 XStream)的核心视图之一。它提供了源数据库端捕获进程的配置持久化和运行时状态信息。理解这个视图对于确保CDC或逻辑复制数据流的高可用性、可靠性以及进行有效的故障诊断至关重要。它将瞬态的 LogMiner 会话提升为了一个可管理、可监控的持久化服务。
欢迎关注我的公众号《IT小Chen》

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



