错误处理

重要

现已弃用 Attunity 的 Oracle 变更数据捕获功能。 有关详细信息,请参阅公告

Oracle CDC 实例会挖掘来自单个 Oracle 源数据库的更改(Oracle RAC 群集被视为单一数据库),并将提交的更改写入目标 SQL Server 实例中 CDC 数据库中的更改表。

CDC 实例在名为 cdc.xdbcdc_state 的系统表中维护其状态。 可以随时查询此表以查找 CDC 实例的状态。 有关cdc.xdbcdc_state表的详细信息,请参阅 cdc.xdbcdc_state

下表描述了xdbcdc_state表中的 CDC 实例状态。

对于每个状态,cdc.xdbcdc_state表中对应列会显示以下两个指示:

  • 实例不处于活动状态(当前没有处理它的 Windows 进程)。 如果 活动 列值为 1,则处理此特定 Oracle CDC 实例的 Oracle CDC 服务的子进程正在运行。

  • 如果 错误 列值为 0,则 Oracle CDC 实例未处于错误状态。 如果 错误 列值为 1,则存在阻止 Oracle CDC 实例处理更改的错误。

    如果 错误 列的值为 1 且 活动 列值也为 1,则 Oracle CDC 实例会发生可恢复的错误,该实例可以自动解决。 如果错误列的值为 1 且活动列的值为 0,则在大多数情况下可能需要手动解决方法来解决该问题,然后才能恢复处理。

下表描述了 Oracle CDC 实例在其状态表中可以报告的各种状态代码。

状态 活动状态代码 错误状态代码 DESCRIPTION 子状态
中止 0 1 Oracle CDC 实例未运行。 ABORTED 子状态指示 Oracle CDC 实例处于活动状态,然后意外停止。 当 Oracle CDC 服务主实例检测到 Oracle CDC 实例在状态为 “ACTIVE” 时未运行时,便会由 Oracle CDC 服务主实例设置 ABORTED 子状态。
错误 0 1 Oracle CDC 实例未运行。 ERROR 状态指示 CDC 实例处于活动状态,但随后遇到不可恢复的错误,已禁用自身。 检测到不可恢复的配置错误:配置不当。

PASSWORD-REQUIRED:没有为 Attunity 的 Oracle 更改数据捕获设计器设置密码,或配置的密码无效。 这是因为更改了服务非对称密钥密码。
跑步 1 0 CDC 实例正在运行,正在处理更改记录。 IDLE:所有更改记录都已处理并存储到目标控件(_CT)表中。 控制表没有正在进行的事务。

处理:正在处理的更改记录尚未写入控件(_CT)表。
停止 0 0 CDC 实例未运行。 STOP 子状态指示 CDC 实例处于活动状态,然后已正确停止。
暂停 1 1 CDC 实例正在运行,但由于可恢复错误而暂停处理。 DISCONNECTED:无法建立与源 Oracle 数据库的连接。 还原连接后,处理将恢复。

存储:存储已满。 存储可用时,处理将恢复。 在某些情况下,此状态可能不会显示,因为无法更新状态表。

LOGGER:记录器已连接到 Oracle,但由于暂时问题,它无法读取 Oracle 事务日志。
数据错误 x x 此状态代码仅用于 xdbcdc_trace 表。 它不会出现在 xdbcdc_state 表中。 此状态的跟踪记录指示 Oracle 日志记录出现问题。 错误的日志记录以 BLOB 的形式存储在 数据 列中。 BADRECORD:无法分析附加的日志记录。

CONVERT-ERROR:某些列中的数据无法转换为捕获表中的目标列。 仅当配置指定转换错误应生成跟踪记录时,才会显示此状态。

由于 Oracle CDC 服务状态存储在 SQL Server 中,因此在某些情况下,数据库中的状态值可能不会反映服务的实际状态。 最常见的情况是服务失去与 SQL Server 的连接,并且无法恢复它(出于任何原因)。 在这种情况下, 存储在cdc.xdbcdc_state 中的状态会过时。 如果上次更新时间戳(UTC)超过一分钟,则状态可能已过时。 在这种情况下,请使用 Windows 事件查看器查找有关服务状态的其他信息。

错误处理

本部分介绍 Oracle CDC 服务如何处理错误。

伐木业

Oracle CDC 服务在以下位置之一创建错误信息。

  • Windows 事件日志,用于记录错误,并指示 Oracle CDC 服务生命周期事件(启动、停止、重新)连接到目标 SQL Server 实例)。

  • MSXDBCDC.dbo.xdbcdc_trace表主要用于Oracle CDC服务主进程的一般性日志记录和跟踪。

  • <cdc-database>.cdc.xdbcdc_trace 表,用于 Oracle CDC 实例的常规日志记录和跟踪。 这意味着与特定 Oracle CDC 实例相关的错误将记录到该实例的跟踪表中。

信息由 Oracle CDC 服务在服务运行时记录。

  • 由服务控制管理器启动或停止。

  • 无法连接到关联的 SQL Server 实例,并在失败后成功建立连接时。

  • 启动 Oracle CDC 服务实例时遇到错误。

  • 检测到 Oracle CDC 实例已中止。

  • 遇到意外错误。

当 CDC 实例在以下情况时,CDC 实例会记录信息:

  • 已启用或禁用。

  • 遇到错误。

  • 从一个可以恢复的错误中恢复。

跟踪表还用于记录详细的跟踪信息,以便进行故障排除。

处理源 Oracle 连接错误

Oracle CDC 服务需要与源 Oracle 数据库建立持久连接。 许多与服务配置无关的连接错误(例如网络错误)被视为暂时性错误。 因此,如果 Oracle CDC 服务无法与 Oracle 数据库建立连接(在断开连接后开始或工作期间),该服务会将状态更改为 SUSPENDED/DISCONNECTED,并输入重试循环,其中连接会定期重试。 重新建立连接后,将继续处理。

其他类型的连接错误不是暂时性的(例如凭据错误、特权不足和数据库地址错误)。 发生这些错误时,Oracle CDC 服务状态将设置为 ERROR/MISCONFIGURED 或 ERROR/PASSWORD-REQUIRED,并禁用该服务。 当用户修复基础错误时,应手动重新启用 Oracle CDC 实例以恢复处理。

如果不清楚错误是否为暂时性错误,最好假设它是暂时性的。

处理目标 SQL Server 连接错误

Oracle CDC 服务需要与目标 SQL Server 实例建立持久连接。 此连接用于:

  • 确保当前没有同名的其他服务使用此 SQL Server 实例。

  • 检查哪个 Oracle CDC 实例已启用或禁用并启动(或停止)其子进程。

当服务与目标 SQL Server 实例建立连接并验证它是否是唯一运行此名称的 Oracle CDC 服务时,它可以检查已启用哪些 Oracle CDC 实例并启动其处理进程(之后服务在禁用时停止这些进程)。 Oracle CDC 实例使用其 SQL Server 连接来处理 Oracle CDC 实例的 CDC 数据库。

与目标 SQL Server 的连接失败时如何处理错误取决于错误是否是暂时性的。

对于已知的非暂时性错误(例如凭据错误、权限不足、连接信息错误),服务将错误记录到 Windows 事件日志并停止(无法写入跟踪表,因为它无法连接到 SQL Server)。 在这种情况下,用户必须解决此错误并重启 Oracle CDC Windows 服务。

对于暂时性错误和意外错误,将多次重试操作,如果故障持续一段重要时间,CDC 服务将停止其 CDC 实例子进程并再尝试初始连接(此时,另一台计算机上的 Oracle CDC 服务可能已经接管了该已命名的 CDC 服务)。

解决目标 SQL Server 存储空间不足错误

当 Oracle CDC 服务检测到它无法将新的更改数据插入目标 SQL Server CDC 数据库中时,它会向事件日志写入警告,并尝试插入跟踪记录(尽管这可能会因相同原因而失败)。 然后,它会在特定间隔内重试作,直到作成功。

处理 Oracle CDC 错误

Oracle CDC 实例读取 Oracle 事务日志并处理它。 如果 CDC 处理遇到错误,则会在 cdc.xdbcdc_state 表中报告,用户需要根据报告的错误手动干预。

例如,Oracle CDC 实例在延长持续时间内可能不处于活动状态,并且所需的 Oracle 事务日志文件不再可用。 在这种情况下,Oracle DBA 必须还原 Oracle CDC 实例所需的日志才能恢复处理。

处理意外发生的 Oracle CDC 实例故障

Oracle CDC 服务监视其 CDC 实例子进程。 当 CDC 实例子进程中止时,CDC 服务在MSXDBCDC.dbo.xdbcdc_databases表中将其禁用,并将其cdc.xdbcdc_state状态更新为 ABORTED。 在这种情况下,标准 Windows 错误报告对话框用于报告此错误以供进一步分析。

另请参阅

由 Attunity 提供的 Oracle 数据变更捕获设计器
Oracle CDC 实例