Oracle CDC Client(为方便处理,下文中用OCC代替)处理由Oracle LogMiner redo logs提供的CDC信息(可用版本:Oracle 11g或12c)。
可以使用这个origin执行数据库复制。可以使用一个单独的pipeline,与JDBC Query Consumer或JDBC Multitable Consumer分离。然后,使用Oracle CDC Client启动pipeline,以处理后续更改。
Oracle CDC Client根据提交编号升序处理数据。
要读取redo logs,OCC需要LogMiner dictionary。origin可以在redo logs或online catalog中使用dictionary。在redo logs中使用dictionary时,origin可以捕获schema的更改并进行调整。当使用redo log dictionary时,origin还可以生成事件。
origin可以为数据库中的一个或多个表的INSERT,UPDATE,SELECT_FOR_UPDATE,以及DELETE创建记录。origin在记录头属性中包含CDC和CRUD的信息,以便启动CRUD的目标地址可以方便地处理生成的记录。
注意:要使用OCC,必须为要使用的数据库启用LogMiner,并完成必要的先前任务。
配置OCC时,需要配置CDC细节,例如要从中读取的schema和table、如何读取初始更改、dictionary位置以及要包含的操作。还要指定事务窗口和LogMiner会话窗口。
可以将origin配置为本地缓冲记录或使用数据库缓冲区。在使用本地缓冲区之前,请验证所需资源是否可用,并指定未提交事务的操作。
可以指定origin处理不支持数据类型时的操作,以及如何处理null值。
可以指定JDBC连接信息以及用户验证。
一.LogMiner Dictionary Source
LogMiner提供了字典帮助处理redo logs。LogMiner可以在多个位置存储字典。
OCC可以使用以下字典源位置:
(1)Online catalog:不希望更改表结构时,使用online catalog。
(2)Redo logs:希望更改表结构时,使用redo logs。当从redo logs中读取字典时,OCC决定何时发生schema更改,并刷新用于创建记录的schema。
重要:在redo logs中使用字典时,确保每次表结构更新时将最新字典提取到redo logs中。
注意,在redo logs中使用字典可能比在online catalog中使用字典有更高的延迟。
二.Oracle CDC Client 预备知识
在使用OCC Origin之前,请完成以下任务:
(1)启用LogMiner
(2)为数据库或表启用补充日志记录
(3)创建具有所需角色和权限的用户帐户
(4)若要在redo log中使用字典,请提取Log Miner字典
(5)安装Oracle JDBC driver
任务1:启用LogMiner
LogMiner提供了用于汇总数据库活动的redo log。origin利用这些日志来生成记录。
LogMiner需要在ARCHIVELOG模式下启用归档。要确定数据库的状态并启用LogMiner,请使用以下步骤:
(1)作为具有DBA特权的用户登录数据库
(2)检查数据库日志记录模式:
select log_mode from v$database;
如果返回ARCHIVELOG,跳到任务2.
如果返回NOARCHIVELOG,继续以下步骤:
(3)关闭数据库:
shutdown immediate;
(4)启动、挂载数据库
startup mount;
(5)配置启用存档、打开数据库
alter database archivelog;
alter database open;
任务2:为数据库或表启用补充日志记录
要从重做日志检索数据,LogMiner需要数据库或表的补充日志记录。
对于要使用的每个表,在表级别上至少启用主键或“标识键”日志记录。使用标识键日志记录,记录只包括主键和更改的字段。
由于Oracle已知的问题,要为表启用补充日志记录,必须首先为数据库启用最小补充日志记录。
要在origin生成的记录中包含所有字段,请在表或数据库级别启用完整的补充日志记录。完整的补充日志记录提供了来自所有列的数据,包括未更改数据以及主键和已更改列的数据。
(1)要验证是否为数据库启用了补充日志记录,请运行以下命令:
SELECT supplemental_log_data_min, supplemental_log_data_pk, supplemental_log_data_all FROM v$database;
如果都返回YES,则跳到任务3;
(2)启用标识键或完整补充日志记录。
启用标识键日志记录
可以为数据库中的单个表或所有表启用标识键日志记录:
- 单个表
ALTER DATABASE ADD SUPPLEMENTAL LOG DATA;
ALTER TABLE <schema name>.<table name> ADD SUPPLEMENTAL LOG DATA (PRIMARY KEY) COLUMNS;
- 所有表
ALTER DATABASE ADD SUPPLEMENTAL LOG DATA (PRIMARY KEY) COLUMNS;
启用完整的补充日志记录
可以为数据库中的单个表或所有表启用完整的补充日志记录.
- 单个表
ALTER DATABASE ADD SUPPLEMENTAL LOG DATA;
ALTER TABLE <schema name>.<table name> ADD SUPPLEMENTAL LOG DATA (ALL) COLUMNS;
- 所有表
ALTER DATABASE ADD SUPPLEMENTAL LOG DATA (ALL) COLUMNS;
(3)提交变更:
ALTER SYSTEM SWITCH LOGFILE;
任务3:创建用户账号
创建一个与OCC Origin一起使用的用户帐户。可以根据所使用的Oracle版本以不同的方式创建帐户。
Oracle 12c multitenant databases
1.作为具有DBA特权的用户登录数据库。
2.创建常用用户帐号:
ALTER SESSION SET CONTAINER=cdb$root;
CREATE USER <user name> IDENTIFIED BY <password> CONTAINER=all;
GRANT create session, alter session, set container, select any dictionary, logmining, execute_catalog_role TO <username> CONTAINER=all;
ALTER SESSION SET CONTAINER=<pdb>;
GRANT select on <db>.<table> TO <user name>;
Oracle 12c standard databases
1.作为具有DBA特权的用户登录数据库。
2.创建常用用户帐号:
CREATE USER <user name> IDENTIFIED BY <password>;
GRANT create session, alter session, select any dictionary, logmining, execute_catalog_role TO <user name>;
GRANT select on <db>.<table> TO <user name>;
Oracle 11g databases
1.作为具有DBA特权的用户登录数据库。
2.创建常用用户帐号:
CREATE USER <user name> IDENTIFIED BY <password>;
GRANT create session, alter session, execute_catalog_role, select any dictionary, select any transaction, select any table to <user name>;
GRANT select on v$logmnr_parameters to <user name>;
GRANT select on v$logmnr_logs to <user name>;
GRANT select on v$archived_log to <user name>;
GRANT select on <db>.<table> TO <user name>;
任务4:抽取Log Miner Dictionary(Redo Logs)
当使用redo logs作为字典源时,必须在启动pipeline之前将Log Miner字典提取到redo logs。定期重复此步骤,以确保包含字典的redo logs仍然可用。
Oracle建议只在非高峰时间提取字典,因为提取会消耗数据库资源。
要提取Oracle 11g或12c数据库的字典,请运行以下命令:
EXECUTE DBMS_LOGMNR_D.BUILD(OPTIONS=> DBMS_LOGMNR_D.STORE_IN_REDO_LOGS);
要提取Oracle 12c多租户数据库的字典,请运行以下命令:
ALTER SESSION SET CONTAINER=cdb$root;
EXECUTE DBMS_LOGMNR_D.BUILD(OPTIONS=> DBMS_LOGMNR_D.STORE_IN_REDO_LOGS);
任务5:安装Driver
OCC Origin通过JDBC连接到Oracle。除非安装了所需的驱动程序,否则无法访问数据库。
三.Schema,Table Name和Exclusion Patterns
在配置OCC origin时,要指定包含要处理CDC的表,需要定义Schema、表名和可选排除模式。
在定义schema和表名时,可以使用正则表达式在模式内或跨多个模式定义一组表。还可以使用正则表达式作为排除模式,从较大的表集中排除表的子集。
例如,你希望进行sales schema中以sales开头的所有表的CDC,而不包括以破折号(-)和单字符后缀结尾的表。您可以使用以下配置来指定要处理的表:
- Schema: sales
- Table Name Pattern:SALES*
- Exclusion Pattern:SALES.*-.
四.Initial Change
初始更改是LogMiner redo los中你希望开始处理的地方。当你启动pipeline时,OCC从指定初始更改处开始处理,一直持续到pipeline停止。
注意,OCC只处理CDC。如果需要现有数据,可以在启动OCC pipeline之前,在单独的pipeline中使用JDBC查询读取表数据。
OCC提供了几种配置初始更改的方法:
从最近的变化
origin处理启动pipeline后发生的所有更改。
从指定的日期时间
origin处理在指定的日期时间以及之后发生的所有更改。使用以下格式:DD-MM-YYYY HH24:MI:SS。
从指定的系统更改号(SCN)
origin处理指定SCN中以及以后发生的所有更改。当使用指定的SCN时,origin开始处理与SCN关联的时间戳。如果在redo logs中找不到SCN,则origin将继续从redo logs中可用的下一个更高的SCN读取。
Example
你希望处理Orders表中的所有现有数据,然后捕获更改的数据,将所有数据写入Amazon S3。要读取现有数据,可以使用JDBC Query Consumer和Amazon S3目的地的pipeline,如下所示:

读取所有现有数据后,停止JDBC Query Consumer pipeline并启动以下OCC pipeline。这个pipeline被配置为接收在启动pipeline之后发生的更改,但是如果你希望防止任何数据丢失,你可以配置初始更改,将其配置为确切的datetime或更早的SCN:

五.Include Nulls 包含空值
当Oracle LogMiner执行完整的补充日志记录时,得到的数据包括表中所有没有发生更改的空值列,默认情况下,它在生成记录时忽略null值。
可以在origin中配置记录中包含空值。当目标系统指定了字段时,可能需要包含null值。要包含null值,请在Oracle CDC选项卡上启用include Nulls属性。
六.不支持的数据类型
你可以配置origin如何处理包含不支持数据类型的记录。有以下几种方式:
- 将剔除了不支持类型的记录发送到管道
- 将剔除了不支持数据类型的记录发送到error
- 丢弃记录
可以配置origin在记录中包含不支持数据类型。当包含不受支持的类型时,源文件包含字段名,并将数据作为未解析的字符串传递。
以下Oracle数据类型不支持:
Array、Blob、Clob、Datalink、Distinct、Java Object、Nclob、Other、Ref、Ref Cursor、SQLXML、Struct、Time with Timezone
七.条件数据类型支持
请注意以下关于条件支持的Oracle数据类型的信息:
- Oracle Raw 数据类型会被当做Data Collector Byte Array对待。
- Oracle Timestamp with Timezone类型被转换为Data Collector Zoned Datetime类型。
八.缓存的选择
在处理数据时,Oracle CDC客户端可以在数据收集器机器上本地缓存数据,或者使用Oracle LogMiner buffer:
Local Buffers
当使用本地缓冲区时,源请求相关表和时间段的事务。源缓存生成的LogMiner重做SQL语句,直到它验证事务的提交。在看到提交之后,它解析并处理提交的数据。
源可以将redo SQL语句完全缓冲在内存中,或者主要将它们写入磁盘,同时使用少量内存进行跟踪。
默认情况下,源使用本地缓冲区。通常,使用本地缓冲区应该比Oracle Log Miner缓冲区提供更好的性能。
使用本地缓冲区处理大型事务或避免垄断Oracle PGA。当Data Collector资源允许时,在内存中缓存信息以获得更好的性能。将信息缓冲到磁盘,以避免独占Data Collector资源。
Oracle LogMiner buffers
当使用Oracle LogMiner缓冲区时,源会从Oracle LogMiner请求特定时间段的数据。然后LogMiner为数据库中的所有表缓存那段时间内的所有事务,而不是只缓存源所需的表。
LogMiner将事务信息保存在缓冲区中,直到读取日志中的提交,然后将提交的数据传递给Oracle CDC Client。
根据事务的大小和数量以及缓冲的时间周期,缓冲事务可以独占PGA,即Oracle服务器进程的私有内存区域。
当您不希望事务量过多地占用Oracle资源时,请使用LogMiner缓冲区。
九.生成记录
当将源配置为解析SQL查询时,它根据Oplog操作类型和为数据库和表启用的日志记录生成不同的记录。它还在记录头属性中包含CDC和CRUD信息。

当将源配置为不解析SQL查询时,它只是将每个LogMiner SQL语句写入一个SQL字段。
头属性中的CRUD操作
当Oracle CDC Client被配置为解析SQL查询时,它在生成记录时在以下两个记录头属性中指定操作类型:
sdc.operation.type
Oracle CDC Client评估它处理的每个条目的Oplog操作类型,将其写入sdc.operation.type,写入记录头属性。
源在sdc.operation.type中使用以下值表示操作类型:
- 1 INSERT
- 2 DELETE
- 3 UPDATE, SELECT_FOR_UPDATE
如果您在管道中使用启用了crud的目的地,例如JDBC Producer或Elasticsearch,则该目的地可以在向目标系统写入时使用操作类型。必要时,可以使用表达式求值器或脚本处理器来操作sdc.operation.type中的值。
oracle.cdc.operation
Oracle CDC Client同时将Oplog CRUD操作类型写入oracle.cdc.operation记录的头属性。此属性在较早的版本中实现,并支持向后兼容。
源将Oplog操作类型写入oracle.cdc.operation属性,如下字符串:
- INSERT
- UPDATE
- SELECT_FOR_UPDATE
- DELETE
CDC Header Attributes
当Oracle CDC Client配置为SQL解析时,它提供以下的CDC头属性:
- oracle.cdc.operation
- oracle.cdc.query
- oracle.cdc.rowId
- oracle.cdc.scn
- oracle.cdc.timestamp
- oracle.cdc.table
- oracle.cdc.user