Oracle CDC 服务是运行程序 xdbcdcsvc.exe的 Windows 服务。 可以将 Oracle CDC 服务配置为在同一台计算机上运行多个 Windows 服务,每个服务名称不同。 在单个计算机上创建多个 Oracle CDC Windows 服务通常是为了在它们之间实现更好的分离,或者当每个服务需要使用不同的 SQL Server 实例时。
Oracle CDC 服务是使用 Oracle CDC 服务配置控制台创建的,或通过内置于 xdbcdcsvc.exe 程序的命令行接口定义。 在这两种情况下,创建的每个 Oracle CDC 服务都与单个 SQL Server 实例(可能通过 AlwaysOn 设置进行群集或镜像)相关联,连接信息(连接字符串和访问凭据)是服务配置的一部分。
启动 Oracle CDC 服务时,它会尝试连接到与之关联的 SQL Server 实例,获取它需要处理的 Oracle CDC 实例列表,并执行初始环境验证。 服务启动期间的错误和任何启动/停止信息始终写入 Windows 应用程序事件日志。 建立与 SQL Server 的连接后,所有错误和信息消息都会写入 SQL Server 实例的 MSXDBCDC 数据库中 dbo.xdbcdc_trace 表。 在启动期间进行的检查之一是验证当前没有其他具有相同名称的 Oracle CDC 服务正在运行。 如果当前从其他计算机连接同名的服务,Oracle CDC 服务将进入等待循环,等待其他服务断开连接,然后继续处理 Oracle CDC 工作。
当 Oracle CDC 服务通过所有启动验证时,它会在 MSXDBCDC 数据库中检查 dbo.xdbcdc_databases 表,以确定是否有已启用的 Oracle CDC 实例。 对于每个已启用的 Oracle CDC 实例,该服务都会启动一个子进程来处理该 Oracle CDC 实例。
Oracle CDC 实例启动时,它将访问与 CDC 实例同名的 SQL Server CDC 数据库,并从上一次运行中检索其状态。 它还验证一切是否正常运行。 然后恢复处理更改;读取 Oracle 事务日志并将更改写入 CDC 数据库。
Oracle CDC 服务会定期监视 MSXDBCDC 数据库中 的dbo.xdbcdc_tables 表,以确定是否存在对任何 Oracle CDC 实例配置的任何配置更改。 如果发现更改,Oracle CDC 服务会通知 Oracle CDC 实例,它应检查其配置是否有更改。 大多数配置更改(如添加和删除捕获实例)都可以在启用 Oracle CDC 实例时应用,其他配置更改则要求重启 Oracle CDC 实例。
使用 Oracle CDC 设计器控制台时,会自动检测更改。 直接使用 SQL 更新 Oracle CDC 配置时,应调用以下过程,以便 Oracle CDC 服务注意到配置更改:
DECLARE @dbname nvarchar(128) = 'HRcdc'
EXECUTE [MSXDBCDC].[dbo].[xdbcdc_update_config_version] @dbname
GO
Oracle CDC 实例进程在系统表中更新其状态 cdc.xdbcdc_state ,并将错误信息写入 cdc.xdbcdc_trace 表。 xdbcdc_state表可用于监视 Oracle CDC 实例的状态。 它提供 up-to日期状态、各种计数器(例如从 Oracle 读取的更改数、写入到 SQL Server 的更改数、已提交的事务数以及当前正在进行的事务数)和延迟指示。
Oracle CDC 实例配置保存在 cdc.xdbcdc_config 表中,该表是 Oracle CDC 设计器控制台使用的表。 由于 Oracle CDC 实例的整个配置位于目标 SQL Server 实例和 CDC 数据库中,因此可为 Oracle CDC 实例创建 SQL Server 部署脚本。 这是使用 Oracle CDC 服务配置和 Oracle CDC 设计器控制台完成的。
安全注意事项
下面介绍了使用适用于 Oracle 的 CDC 服务所需的安全要求。
保护源 Oracle 数据
Oracle CDC 服务不需要访问 Oracle 源数据,并且通过确保日志挖掘凭据不授予对客户 Oracle 表的 SELECT 权限来保护。
保护源 Oracle 更改数据
Oracle CDC 服务提供日志挖掘凭据,使服务能够捕获对 Oracle 数据库中任何表所做的更改。 更改数据没有常规表的精细访问权限,因此访问更改数据会绕过内置的 Oracle 数据访问控制。
被捕获的源 Oracle 表在 CDC 数据库里具有与其架构和表名称相同的空镜像表。 捕获的数据存储在 SQL Server 捕获实例中,并提供与从 SQL Server 数据库捕获的更改相同的保护。 为了获取与捕获实例关联的更改数据,必须向用户授予选择访问关联镜像表所有捕获列的权限。 此外,如果在创建捕获实例时指定了一个门控角色,则调用者也必须是指定门控角色的成员。 其他一般用于捕获变更数据的函数可通过公共角色让所有数据库用户访问元数据,尽管对返回的元数据的访问通常还需通过对源表的选择性访问权限及任何已定义的限制角色成员资格来控制。
这意味着具有 sysadmin 固定服务器角色或 db_owner 固定数据库角色的用户(默认情况下)对捕获的数据具有完全访问权限,并且可以通过限定角色或授予对捕获列的选择访问权限来授予进一步的访问权限。
保护源 Oracle 日志挖掘凭据
存储在 CDC 数据库中(cdc.xdbcdc_config表中)的 Oracle CDC 服务配置包括日志挖掘用户名及其关联的密码。
日志挖掘密码通过使用以下命令自动创建的固定名称 xdbcdc_asym_key 的非对称密钥进行加密:
USE [<cdc-database-name>]
CREATE ASYMMETRIC KEY xdbcdc_asym_key
WITH ALGORITHM = RSA_1024
ENCRYPTION BY PASSWORD = '<cdc-database-name><asym-key-password>'
如果使用了其他算法,则可以删除此密钥,并使用相同的名称删除一个新密钥,并通过同一密码进行加密。
非对称密钥密码是在注册表中保存在路径 HKLM\Software\Microsoft\XDBCDCSVC\ 下的主密码。 该密钥只能由本地管理员和 Oracle CDC Windows 服务帐户访问。 密钥包含存储非对称密钥密码的加密二进制值 AsymmetricKeyPassword 。 需要访问此注册表项才能访问 Oracle 日志挖掘凭据。
若要使用 ENCRYPTION BY PASSWORD 子句,密码必须满足运行 SQL Server 实例的计算机的 Windows 密码策略要求。 为此,请根据该策略选择非对称密钥密码。
如果非对称密钥密码丢失,则必须在 Oracle CDC 服务设计器中再次指定每个 Oracle CDC 实例的日志挖掘凭据。
当 CDC 服务检测到没有此非对称密钥的 Oracle 实例 CDC 数据库或密钥存在但密码不匹配时,非对称密钥会自动在 CDC 数据库中创建。
Oracle CDC 服务 Windows 服务帐户
用于 Oracle CDC Windows 服务的服务帐户不需要任何其他特权。 此帐户必须能够同时使用 Oracle Native Client API 和 SQL Server Native Client ODBC API。 它还需要能够访问注册表中的服务配置密钥(此 CDC 服务配置控制台为此设置 ACL)。