本教程介绍如何使用复制作业中的变更数据捕获(CDC)有效地将数据更改从 Oracle 数据库复制到目标。 Oracle CDC 利用 LogMiner(一个内置的 Oracle 数据库实用工具)读取联机和存档的重做日志文件来捕获数据更改。 这可确保目标数据自动保持最新状态。
先决条件
在开始之前,确保你拥有:
Oracle 数据库要求:
- 有权访问源表的 Oracle 数据库(版本 11g 或更高版本)。
- 数据库必须在 ARCHIVELOG 模式下运行。 ARCHIVELOG 模式使 Oracle 能够存档重做日志文件,这是 LogMiner 访问历史更改所必需的。
- 必须启用数据库级补充日志记录(至少启用最小补充日志记录)。
- 必须在要从中捕获更改的每个表上启用表级补充日志记录。
- 具有访问 LogMiner 和读取重做日志所需的权限的数据库用户(有关详细信息,请参阅 通过 Oracle 上的 LogMiner 启用 CDC )。
- 存档重做日志的保留时间必须长于计划复制作业运行之间的间隔,以避免数据丢失。
有关 Oracle LogMiner 和补充日志记录的详细信息,请参阅官方 Oracle 文档:
构造要求:
- 具有创建复制作业所需的权限的 Fabric 工作区。
- 用于 CDC 复制的目标数据存储由复制作业支持。
- 运行版本 3000.310 或更高版本的本地数据网关,配置为连接到 Oracle 数据库。
小窍门
在 Oracle 中使用SYSDBA角色或DBA角色执行管理任务,例如启用 ARCHIVELOG 模式和授予 LogMiner 特权。 对于日常 CDC 操作,请创建仅具有所需权限的专用用户。
通过 Oracle 上的 LogMiner 启用 CDC
Oracle 使用 LogMiner 从重做日志文件捕获数据更改。 若要启用 CDC,必须配置 ARCHIVELOG 模式、补充日志记录和适当的用户权限。 按照以下步骤为 CDC 设置 Oracle 数据库。
步骤 1:启用 ARCHIVELOG 模式
ARCHIVELOG 模式可确保 Oracle 存档重做日志文件,LogMiner 需要通过这些文件来读取历史变更。 检查并启用 ARCHIVELOG 模式:
以具有特权的用户
SYSDBA身份连接到 Oracle 数据库。检查当前存档日志模式:
SELECT LOG_MODE FROM V$DATABASE;如果结果显示
NOARCHIVELOG,请继续执行以下步骤来启用它。在装载模式下关闭并重启数据库,然后启用 ARCHIVELOG 模式:
SHUTDOWN IMMEDIATE; STARTUP MOUNT; ALTER DATABASE ARCHIVELOG; ALTER DATABASE OPEN;验证是否已启用 ARCHIVELOG 模式:
SELECT LOG_MODE FROM V$DATABASE;结果应显示
ARCHIVELOG。
重要
启用 ARCHIVELOG 模式需要重启数据库。 在维护时段内规划此更改,以最大程度地减少对生产环境的影响。
有关详细信息,请参阅 Oracle 文档中 的“管理存档的重做日志文件 ”。
步骤 2:启用补充日志记录
补充日志记录在重做日志文件中记录额外的列数据,这是 LogMiner 准确重构数据更改所需的。
请启用最小数据库级别的补充日志记录:
ALTER DATABASE ADD SUPPLEMENTAL LOG DATA;启用表级补充日志记录,以捕获每个表中的更改。 对于每个表,请运行以下命令之一:
要记录所有列(建议用于完全跟踪所有更改):
ALTER TABLE <schema_name>.<table_name> ADD SUPPLEMENTAL LOG DATA (ALL) COLUMNS;仅记录主键列:
ALTER TABLE <schema_name>.<table_name> ADD SUPPLEMENTAL LOG DATA (PRIMARY KEY) COLUMNS;替换
<schema_name>和<table_name>为你的架构和表名。例:
ALTER TABLE sales.customers ADD SUPPLEMENTAL LOG DATA (ALL) COLUMNS; ALTER TABLE sales.orders ADD SUPPLEMENTAL LOG DATA (ALL) COLUMNS;验证是否在数据库级别启用了补充日志记录:
SELECT SUPPLEMENTAL_LOG_DATA_MIN, SUPPLEMENTAL_LOG_DATA_PK, SUPPLEMENTAL_LOG_DATA_ALL FROM V$DATABASE;请确认
SUPPLEMENTAL_LOG_DATA_MIN显示YES。验证表级补充日志记录:
SELECT OWNER, TABLE_NAME, LOG_GROUP_NAME, LOG_GROUP_TYPE FROM DBA_LOG_GROUPS WHERE OWNER = '<schema_name>' AND TABLE_NAME = '<table_name>';
有关详细信息,请参阅 Oracle 文档中的 补充日志记录 。
步骤 3:创建 LogMiner 用户并授予权限
为 LogMiner CDC 操作创建专用数据库用户,并授予所需的权限:
创建用户:
CREATE USER <logminer_user> IDENTIFIED BY <password>;授予所需的权限:
GRANT CREATE SESSION TO <logminer_user>; GRANT SELECT_CATALOG_ROLE TO <logminer_user>; GRANT CONNECT, RESOURCE TO <logminer_user>; GRANT EXECUTE_CATALOG_ROLE TO <logminer_user>; GRANT FLASHBACK ANY TABLE TO <logminer_user>; GRANT SELECT ANY DICTIONARY TO <logminer_user>; GRANT SELECT ANY TABLE TO <logminer_user>; GRANT LOGMINING TO <logminer_user>;将
<logminer_user>和<password>替换为你所需的用户名和密码。注释
该
LOGMINING权限在 Oracle 12c 及更高版本中可用。 对于 Oracle 11g,请改为授予SELECT ANY TRANSACTION。授予对源表的 SELECT 访问权限:
GRANT SELECT ON <schema_name>.<table_name> TO <logminer_user>;对每个源表重复此命令。
验证 Oracle 连接使用的用户是否具有
FLASHBACK ANY TABLE权限。 复制作业需要具备此权限,才能在初始完整加载期间捕获一致性快照。SELECT GRANTEE, PRIVILEGE FROM DBA_SYS_PRIVS WHERE PRIVILEGE LIKE 'FLASHBACK%' ORDER BY GRANTEE, PRIVILEGE;该
GRANTEE列应包括 Oracle 连接中配置的用户名。FLASHBACK ANY TABLE如果未为该用户列出该权限,请授予它:GRANT FLASHBACK ANY TABLE TO <logminer_user>;
注释
- LogMiner 读取重做日志文件以捕获 INSERT、UPDATE 和 DELETE 操作。
- 在表级补充日志记录之前,必须启用数据库级补充日志记录。
- 存档的重做日志占用额外的磁盘空间。 配置适当的保留策略,以平衡存储成本和 CDC 要求。
- 确保重做日志保留期长于计划的复制作业间隔,以防止更改数据丢失。
有关 Oracle LogMiner 的详细信息,请参阅官方 Oracle 文档 - 使用 LogMiner 分析重做日志文件。
使用 Oracle 数据库 CDC 创建复制作业
注释
- 以下步骤与
使用复制作业通过 CDC 将数据从 Azure SQL DB 引入到另一个 Azure SQL DB 时执行的步骤非常相似。
完成以下步骤,创建新的复制任务,以通过 CDC 将数据从 Oracle 数据库导入目标:
选择 “+ 新建项”,选择 “复制作业 ”图标,命名复制作业,然后选择“ 创建”。
选择要从中复制数据的数据存储。 在此示例中,选择 Oracle 数据库。
输入 连接详细信息 和 凭据 以连接到 Oracle 数据库。 可以使用本地数据网关在虚拟网络环境中安全地复制数据。
应清楚地看到已启用 CDC 的源表。 选择 已启用 CDC 的表 进行复制。
启用了 CDC 的表:
未启用 CDC 的表:
选择目标商店。 选择支持 CDC 合并或更新插入操作的目标,以实现最佳的 CDC 复制。
选择 增量复制 ,你会发现无需为每个表输入增量列来跟踪更改。 默认 的 Update 方法 应设置为 “合并”,并且所需的键列将默认与源存储中定义的主键匹配。
注释
最初,复制作业执行一次完整加载,然后通过 CDC 在后续运行中执行增量副本。
查看作业摘要,将运行选项设置为按计划,然后选择“ 保存 + 运行”。
注释
确保 Oracle 存档的重做日志保留期长于计划运行之间的间隔;否则,如果保留期内未处理,则更改的数据可能会丢失。
复制作业会立即启动。 第一次运行复制初始完整快照。
通过插入、更新或删除行来更新 Oracle 中的源表。
再次运行复制作业以获取并复制所有更改,包括插入、更新和删除的行,并将其复制到目标。