Oracle CDC 数据库

重要

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

Oracle CDC 实例与目标 SQL Server 实例上同名的 SQL Server 数据库相关联。 此数据库称为 Oracle CDC 数据库(或 CDC 数据库)。

CDC 数据库是使用 Oracle CDC 设计器控制台创建和配置的,其中包含以下元素:

  • 通过启用 SQL Server CDC 数据库创建的 cdc 架构。

  • Oracle CDC 实例使用的一组 cdc.xdbcdc_xxxx 表。

  • 一组空映射表,其中包含源 Oracle 数据库中被捕获表的定义。

  • 由 SQL Server CDC 机制生成的一组更改表和更改访问函数,它们与常规的非 Oracle、SQL Server CDC 中使用的更改表和更改访问函数相同。

cdc 架构最初仅对 dbowner 固定数据库角色的成员可访问。 对更改表和更改函数的访问由与 SQL Server CDC 相同的安全模型确定。 有关安全模型的详细信息,请参阅 安全模型

创建 CDC 数据库

在大多数情况下,CDC 数据库是使用 CDC 设计器控制台创建的,但也可以使用使用 CDC 设计器控制台生成的 CDC 部署脚本创建该数据库。 SQL Server 系统管理员可以根据需要更改数据库设置(对于存储、安全性或可用性等项)。

有关使用 CDC 设计器控制台创建数据库表和所需脚本的详细信息,请参阅 “使用新建实例向导”。

CDC 数据库用户角色

为 CDC 创建并启用 CDC 数据库后,在 CDC 数据库中创建名为 cdc_service 的数据库用户,并与 Oracle CDC 服务配置的 SQL Server 登录名相关联。 此用户成为 db_datareaderdb_datawriterdb_ddladmin 数据库角色的成员。 如果 SQL Server 登录名也是与 dbo 用户关联的,则不会创建 cdc_service

此角色分配允许 Oracle CDC 服务使用捕获的数据以及控制信息更新架构下的 cdc 表。

创建 CDC 数据库并设置 CDC 源 Oracle 表时,CDC 数据库所有者可以授予镜像表的 SELECT 权限,并定义 SQL Server CDC 控制角色以控制谁访问更改数据。

镜像表

对于每个在 Oracle 源数据库中捕获的表,<架构名称>.<表名称>,将在 CDC 数据库中创建一个具有相同架构和表名称的类似空表。 无法捕获具有架构名称 cdc (不区分大小写)的 Oracle 源表,因为 cdc SQL Server 中的架构是为 SQL Server CDC 保留的。

镜像表为空;其中未存储任何数据。 它们用于启用 Oracle CDC 实例使用的标准 SQL Server CDC 基础结构。 为了防止数据被插入或更新到镜像表中,所有针对公共角色的UPDATE、DELETE和INSERT操作都将被拒绝。 这可确保无法修改它们。

对更改数据的访问权限

由于 SQL Server 安全模型用于获取对与捕获实例关联的更改数据的访问权限,因此必须授予 select 用户对关联镜像表的所有捕获列的访问权限(对原始 Oracle 表的访问权限不提供对 SQL Server 中更改表的访问权限)。 有关 SQL Server 安全模型的信息,请参阅 安全模型

此外,如果在创建捕获实例时指定了一个门控角色,则调用者也必须是指定门控角色的成员。 其他用于访问元数据的常规变更数据捕获功能可以通过 PUBLIC 角色供所有数据库用户访问,不过,返回的元数据访问通常受到限制,需要通过对基础源表的选择权限以及成为任何已定义限制角色的成员来获得。

创建捕获实例时,可以通过调用 SQL Server CDC 组件生成的基于表的特殊函数来读取更改数据。 有关此函数的详细信息,请参阅变更数据捕获函数(Transact-SQL)。

通过 Integration Services CDC 源组件访问 CDC 数据受到相同的规则的约束。

CDC 数据库表

本部分介绍 CDC 数据库中的下表。

更改表 (_CT)

更改表是从镜像表创建的。 它们包含从 Oracle 数据库捕获的更改数据。 这些表是根据以下约定命名的:

[cdc]。[<capture-instance>_CT]

最初为表 <schema-name>.<table-name>启用捕获时,默认捕获实例名称为 <schema-name>_<table-name>。 例如,Oracle HR.EMPLOYEES 表的默认捕获实例名称是 HR_EMPLOYEES,关联的更改表是 [cdc]。 [HR_EMPLOYEES_CT]。

捕获表由 Oracle CDC 实例写入。 使用 SQL Server 在创建捕获实例时生成的特殊表值函数读取它们。 例如,fn_cdc_get_all_changes_HR_EMPLOYEES。 有关这些 CDC 函数的详细信息,请参阅变更数据捕获函数(Transact-SQL)。

cdc.lsn_time_mapping

[cdc].[lsn_time_mapping] 表由 SQL Server CDC 组件生成。 在 Oracle CDC 的情况下,其用法不同于其正常使用。

对于 Oracle CDC,此表中存储的 LSN 值基于与更改关联的 Oracle 系统更改号 (SCN) 值。 LSN 值的前 6 个字节是原始 Oracle SCN 数字。

此外,使用 Oracle CDC 时,时间列(tran_begin_timetran_end_time)存储更改的 UTC 时间,而不是与常规 SQL Server CDC 一样本地时间。 这可确保夏令时更改不会影响存储在lsn_time_mapping中的数据。

cdc.xdbcdc_config

此表包含 Oracle CDC 实例的配置数据。 它通过 CDC 设计器控制台进行更新。 此表只有一行。

下表描述了 cdc.xdbcdc_config 表列。

条目 DESCRIPTION
版本 这会跟踪 CDC 实例配置的版本。 每次更新表以及每次添加新捕获实例或删除现有捕获实例时,都会更新该表。
连接字符串 Oracle 连接字符串。 基本示例是:

<server>:<port>/<instance> (例如, erp.contoso.com:1521/orcl)。

连接字符串还可以指定 Oracle Net connect 描述符,例如 (DESCRIPTION=(ADDRESS=(PROTOCOL=tcp) (HOST=erp.contoso.com) (PORT=1521)) (CONNECT_DATA=(SERVICE_NAME=orcl)))

如果使用目录服务器或 tnsnames,则连接字符串可以是连接的名称。

有关 Oracle 连接字符串的详细信息,请参阅 https://go.microsoft.com/fwlink/?LinkId=231153 有关 Oracle CDC 服务使用的 Oracle 即时客户端的 Oracle 数据库连接字符串的详细信息。
使用Windows身份验证 一个布尔值,可以是:

0:为身份验证提供 Oracle 用户名和密码(默认值)

1:Windows 身份验证用于连接到 Oracle 数据库。 仅当 Oracle 数据库配置为使用 Windows 身份验证时,才能使用此选项。
用户名 日志挖掘 Oracle 数据库用户的名称。 仅当 use_windows_authentication = 0 时,这是必需的。
密码 日志挖掘 Oracle 数据库用户的密码。 仅当 use_windows_authentication = 0 时才是必须的。
事务暂存超时 在写入 cdc.xdbcdc_staged_transactions 表之前,未提交的 Oracle 事务在内存中保留的时间(以秒为单位)。 默认值为 120 秒。
内存限制 内存量限制(以 Mb 为单位)可用于缓存内存中的数据。 较低的设置会导致将更多的事务写入 cdc.xdbcdc_staged_transactions 表。 默认值为 50 Mb。
选项 名称[=value][; ] 形式的选项列表 - 它用于指定辅助选项(例如跟踪、优化)。 有关可用选项的说明,请参阅下表。

下表对可用选项进行了说明。

名称 违约 最小值 麦克斯 静态的 DESCRIPTION
跟踪 - - 可用值有:

真 实





CDC更新状态间隔 10 1 120 为事务分配的内存区块的大小(以 KB 为单位)(事务可以分配多个区块)。 请参阅 cdc.xdbcdc_config表中的memory_limit 列。
目标最大批量交易数 100 1 1000 真 实 可在 SQL Server CT 表中作为一个事务处理的 Oracle 事务的最大数目更新。
目标空闲LSN更新间隔 10 0 1 捕获的表没有活动时更新 lsn_time_mapping 表的间隔(以秒为单位)。
跟踪保留期 24 1 24*31 在跟踪表中保留消息的时间(以小时为单位)。
sql_reconnect_interval(SQL重连接间隔) 2 2 3600 重新连接到 SQL Server 之前等待的时间(以秒为单位)。 除了 SQL Server 客户端的连接超时,此间隔也会被使用。
SQL重连限制 -1 -1 -1 SQL Server 重新连接的最大数目。 默认 -1 意味着进程尝试重新连接,直到它停止。
cdc_restart_limit 6 -1 3600 在大多数情况下,CDC 服务会自动重启异常结束的 CDC 实例。 此属性定义服务每小时发生几次故障后停止并重新启动实例。 值 -1 表示应始终重启实例。

服务返回在配置表的任何更新后重启实例。
暂无改动必要 (No change necessary) 0 0 1000 如果参数的值已更改,CDC 实例会在跟踪表上打印其内存报告。
目标命令超时 600 1 3600 使用 SQL Server 的命令超时。
源字符集 - - - 真 实 可以设置使用特定的 Oracle 编码来代替 Oracle 数据库的代码页。 当字符数据使用的实际编码不同于 Oracle 数据库代码页所表示的编码时,可能会使用此方法。
错误重试间隔量 30 1 3600 在重试之前使用,此操作适用于多种错误,例如连接错误或系统表之间暂时缺乏同步的情况。
source_prefetch_size 100 1 1万 真 实 预读取批次的大小。
查询中最大数据表数量源 100 1 1万 真 实 在切换到读取不筛选表的 Oracle 日志之前,WHERE 子句中允许的最大表数。
源读取重试间隔 2 1 3600 源在尝试再次读取 EOF 上的 Oracle 事务日志之前等待的时间。
源重新连接间隔 30 1 3600 在尝试重新连接到源数据库之前等待多长时间(以秒为单位)。
source_reconnect_limit(源重新连接限制) -1 -1 源数据库重新连接的最多次数。 默认 -1 表示进程尝试重新连接,直到停止。
源命令超时 30 1 3600 使用 Oracle 的连接超时。
源连接超时 30 1 3600 使用 SQL Server 的连接超时。
跟踪数据错误 真 实 - - 布尔值。 True 指示记录数据转换和截断错误。
CDC停止于破坏性模式更改 - - 布尔值。 True 指示在检测到中断性架构更改时停止。

False 表示删除镜像表和捕获实例。
源 Oracle 主目录 - - 可以设置为特定的 Oracle 主页路径或 CDC 实例将用于连接到 Oracle 的 Oracle 主页名称。

cdc.xdbcdc_state

此表包含有关 Oracle CDC 实例的持久状态的信息。 捕获状态用于恢复和故障转移方案以及运行状况监视。

下表描述了 cdc.xdbcdc_state 表列。

条目 DESCRIPTION
地位 当前 Oracle CDC 实例的当前状态代码。 状态描述 CDC 的当前状态。
子状态 第二级状态,提供有关当前状态的其他信息。
活跃 一个布尔值,可以是:

0:Oracle CDC 实例进程未处于活动状态。

1:Oracle CDC 实例进程处于活动状态。
错误 一个布尔值,可以是:

0:Oracle CDC 实例进程未处于错误状态。

1:Oracle CDC 实例处于错误状态。
状态信息 提供错误或状态说明的字符串。
时间戳 捕获状态上次更新时的时间戳(以UTC标准时间)。
活动捕获节点 主机的名称(主机可以是群集上的节点),该节点当前运行 Oracle CDC 服务和 Oracle CDC 实例(正在处理 Oracle 事务日志)。
最后交易时间戳 标记最后一个写入更改表的事务时间(UTC)的时间戳。
最后更改时间戳 从源 Oracle 事务日志中读取最新更改记录时的时间戳(UTC)。 此时间戳有助于识别 CDC 进程的当前延迟。
交易日志头_中文 从 Oracle 事务日志中读取的最新更改号(CN)。
交易日志尾部_cn Oracle 事务日志上的更改编号(CN),其中 Oracle CDC 实例在重启或恢复时重新定位到该日志中。
current_cn 已知在源数据库中的最新更改号(CN)。
软件版本 Oracle CDC 服务的内部版本。
已完成交易 自 CDC 上次重置以来处理的事务数。
书面变更 写入 SQL Server 更改表的更改记录数。
阅读更改 从源 Oracle 事务日志读取的更改记录数。
分阶段处理的交易 cdc.xdbcdc_staged_transactions 表中暂 存的当前活动事务数。

cdc.xdbcdc_trace (该术语用于跟踪数据变更)

此表包含有关 CDC 实例作的信息。 此表中存储的信息包括错误记录、显著状态更改和跟踪记录。 错误信息也会写入 Windows 事件日志,以确保如果 cdc.xcbcdc_trace 表不可用,该信息可用。

下表描述了cdc.xdbcdc_trace表列。

条目 DESCRIPTION
时间戳 写入跟踪记录时的确切 UTC 时间戳。
类型 包含以下值之一。

错误

信息

追踪
节点 写入记录的节点的名称。
地位 状态表使用的状态代码。
子状态 状态表使用的子状态代码。
状态信息 状态表使用的状态消息。
数据 错误记录或跟踪记录包含负载的情况下的其他数据(例如,损坏的日志记录)。

cdc.xdbcdc_staged_transactions

此表存储大型或长时间运行的事务的更改记录,直到捕获事务提交或回滚事件。 Oracle CDC 服务先按事务提交时间排序,再按每个事务的时间顺序对捕获的日志记录进行排序。 同一事务的日志记录存储在内存中,直到事务结束,然后将记录写入目标更改表或丢弃(以防回滚)。 由于内存量有限,因此大型事务将写入 cdc.xdbcdc_staged_transactions 表中,直到事务完成。 事务在运行时间较长时也会写入暂存表。 因此,重启 Oracle CDC 实例时,不需要从 Oracle 事务日志中重新读取旧更改。

下表描述了 cdc.xdbcdc_staged_transactions 表列。

条目 DESCRIPTION
transaction_id 正在暂存的事务的唯一事务标识符。
seq_num 当前事务中xcbcdc_staged_transactions的行数(从 0 开始)。
data_start_cn 用于此行中数据的第一次更改的更改编号(CN)。
数据结束位置_cn 本行数据最后一次更改的更改号(CN)。
数据 以 BLOB 的形式准备好的事务更改。

另请参阅

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