您正在查看过时的Debezium版本的文档。开云体育官方注册网址
如果您想查看本页最新的稳定版本,请前往在这里

开云体育官方注册网址Debezium连接器用于Oracle

该连接器目前处于孵化状态,即准确的语义,配置选项等可能会根据我们收到的反馈在未来的修订中改变。如果您遇到任何问题,请告诉我们。

开云体育官方注册网址Debezium的Oracle Connector可以监视和记录Oracle服务器上数据库中的所有行级更改。开云体育电动老虎机最值得注意的是,连接器还不支持更改捕获表的结构(例如。ALTER TABLE……)在初始快照完成后(请参阅dbz - 718).不过,它支持在连接器运行时捕获新添加的表(前提是新表的名称与连接器的筛选器配置匹配)。

概述

开云体育官方注册网址Debezium从Oracle中使用XStream API或直接通过LogMiner。为了使用XStream API,您需要拥有GoldenGate产品的许可证(尽管并不要求安装GoldenGate本身)。

安装Oracle

需要执行以下步骤来准备数据库,以便可以使用Debezium连接器。开云体育官方注册网址开云体育电动老虎机这假设多租户配置(具有容器数据库和至少一个可插拔数据库);开云体育电动老虎机如果您不使用此模型,请相应地调整步骤。

你可以在目录中找到在虚拟机中设置Oracle的模板(通过Vagrant)oracle-vagrant-box /存储库。

准备数据库开云体育电动老虎机

XStream

启用GoldenGate复制和归档日志模式:

ORACLE_SID=ORCLCDB dbz_oracle sqlplus /nolog CONNECT sys/top_secret AS SYSDBA alter system set db_recovery_file_dest_size = 5G;修改system set db_recovery_file_dest = '/opt/oracle/oradata/recovery_area' scope=spfile;Alter system set enable_goldengate_replication=true;立即关闭数据库启动;开云体育电动老虎机打开数据库开云体育电动老虎机——应该显示“数据库日志模式:存开云体育电动老虎机档模式”存档日志列表退出;

此外,为了捕获之前更改行的状态,必须为捕获的表或数据库启用补充日志记录。开云体育电动老虎机例如,对于一个特定的表:

更改表库存。客户ADD SUPPLEMENTAL LOG DATA (ALL) COLUMNS;

LogMiner

LogMiner实现要求数据库配置最小数量的重做日志组和每个组的文件。开云体育电动老虎机建议至少要有5重做日志组2每组重做文件。关于如何操作重做日志组和数据库版本的文件,请参考Oracle文档。开云体育电动老虎机

启用归档日志模式:

ORACLE_SID=ORACLCDB dbz_oracle sqlplus /nolog CONNECT sys/top_secret AS SYSDBA alter system set db_recovery_file_dest_size = 10G;修改system set db_recovery_file_dest = '/opt/oracle/oradta/recovery_area' scope=spfile;立即关闭数据库启动;开云体育电动老虎机打开数据库开云体育电动老虎机现在“数据库日志模式:存档模式开云体育电动老虎机”存档日志列表退出了吗

此外,为了捕获之前更改行的状态,必须为捕获的表或数据库启用补充日志记录。开云体育电动老虎机例如,对于一个特定的表:

更改表库存。客户ADD SUPPLEMENTAL LOG DATA (ALL) COLUMNS;

为连接器创建用户

XStream

在容器数据库中创建一个XStream管理用户(根据Oracle的建议来管理XStream):开云体育电动老虎机

/opt/oracle/oradata/ORCLCDB/xstream_adm_tbs. sqlplus sys/top_secret@//localhost:1521/ORCLCDB as sysdba CREATE TABLESPACE xstream_adm_tbs DATAFILE '/opt/oracle/oradata/ORCLCDB/xstream_adm_tbs. sqldbf的大小25M重用自动扩展MAXSIZE无限制;退出;
/opt/oracle/oradata/ORCLCDB/ORCLPDB1/xstream_adm_tbs DATAFILE . sqlplus sys/top_secret@//localhost:1521/ORCLPDB1 as sysdba CREATE TABLESPACE xstream_adm_tbs DATAFILE '/opt/oracle/oradata/ORCLCDB/ORCLPDB1/xstream_adm_tbs. sqldbf的大小25M重用自动扩展MAXSIZE无限制;退出;
sqlplus sys/top_secret@//localhost:1521/ORCLCDB as sysdba CREATE USER c##xstrmadmin IDENTIFIED BY xsa DEFAULT TABLESPACE xstream_adm_tbs QUOTA UNLIMITED ON xstream_adm_tbs CONTAINER=ALL;授权创建会话,设置容器为c##xstrmadmin CONTAINER=ALL;DBMS_XSTREAM_AUTH开始。GRANT_ADMIN_PRIVILEGE(grantee => 'c##xstrmadmin', privilege_type => 'CAPTURE', grant_select_privileges => TRUE, container => 'ALL');结束;/退出;

创建XStream用户(Debezium连接器用于连接到XStre开云体育官方注册网址am出站服务器):

/opt/oracle/oradata/ORCLCDB/xstream_tbs. sqlplus sys/top_secret@//localhost:1521/ORCLCDB as sysdba CREATE TABLESPACE xstream_tbs DATAFILE '/opt/oracle/oradata/ORCLCDB/xstream_tbs. sqldbf的大小25M重用自动扩展MAXSIZE无限制;退出;
/opt/oracle/oradata/ORCLCDB/ORCLPDB1/xstream_tbs DATAFILE . sqlplus sys/ top_secrets @//localhost:1521/ORCLPDB1 as sysdba CREATE TABLESPACE xstream_tbs DATAFILE '/opt/oracle/oradata/ORCLCDB/ORCLPDB1/xstream_tbs. sqldbf的大小25M重用自动扩展MAXSIZE无限制;退出;
sqlplus sys/top_secret@//localhost:1521/ORCLCDB as sysdba CREATE USER c##xstrm IDENTIFIED BY xs DEFAULT TABLESPACE xstream_tbs QUOTA UNLIMITED ON xstream_tbs CONTAINER=ALL;授予c##xstrm CONTAINER=ALL创建会话权限;授予c##xstrm CONTAINER=ALL;授予V_$DATABASE的SELEC开云体育电动老虎机T权限给c##xstrm CONTAINER=ALL;给c##xstrm CONTAINER=ALL回闪任意表;退出;

LogMiner

创建LogMiner用户(Debezium连接器连接Oracle时使开云体育官方注册网址用):

/opt/oracle/oradata/ORCLCDB/logminer_tbs. sqlplus sys/top_secret@//localhost:1521/ORCLCDB as sysdba CREATE TABLESPACE logminer_tbs DATAFILE '/opt/oracle/oradata/ORCLCDB/logminer_tbs. sqldbf的大小25M重用自动扩展MAXSIZE无限制;退出;
/opt/oracle/oradata/ORCLCDB/ORCLPDB1/logminer_tbs. sqlplus sys/top_secret@//localhost:1521/ORCLPDB1 as sysdba CREATE TABLESPACE logminer_tbs DATAFILE '/opt/oracle/oradata/ORCLCDB/ORCLPDB1/logminer_tbs. sqlplus sys/top_secret@//localhost:1521/ORCLPDB1 as sysdba CREATE TABLESPACE logminer_tbs DATAFILE 'dbf的大小25M重用自动扩展MAXSIZE无限制;退出;
sqlplus sys/top_secret@//localhost:1521/ORCLCDB as sysdba CREATE USER c##logminer IDENTIFIED BY lm DEFAULT TABLESPACE logminer_tbs QUOTA UNLIMITED ON logminer_tbs CONTAINER=ALL;给logminer CONTAINER创建会话GRANT SET CONTAINER TO c##logminer CONTAINER=ALL;logminer CONTAINER=开云体育电动老虎机ALLGRANT FLASHBACK任意表到c##logminer CONTAINER=ALL;GRANT LOGMINING TO c##logminer CONTAINER=ALL;logminer CONTAINER=ALL;退出;

创建一个XStream出站服务器

如果您正在使用LogMiner实现,则不需要此步骤。

创建一个出站服务器(给定正确的特权,这可能由连接器自动完成,参见dbz - 721):

sqlplus c##xstrmadmin/xsa@//localhost:1521/ORCLCDB声明表dbms_utilities . uncl_array;模式DBMS_UTILITY.UNCL_ARRAY;开始表(1):= NULL;schema (1):= 'd开云体育官方注册网址ebezium';DBMS_XSTREAM_ADM。创建_OUTBOUND( server_name => 'dbzxout', table_names => tables, schema_names => schemas); END; / exit;

修改XStream出站服务器以允许xstrm用户连接到它:

sqlplus sys/top_secret@//localhost:1521/ORCLCDB as sysdba BEGIN DBMS_XSTREAM_ADM. sqlALTER_OUTBOUND(server_name => 'dbzxout', connect_user => 'c##xstrm');结束;/退出;

注意,给定的出站服务器不能同时被多个连接器实例使用。如果希望设置Debezium Oracle连接器的多个实例,则每个实例都需要一个特定的XStre开云体育官方注册网址amOutbound服务器。

支持配置

到目前为止,连接器已经使用可插入数据库设置(CDB/PDB模型)进行了测试。开云体育电动老虎机它应该监视该模型中的单个PDB。它也应该与传统的(非cdb)设置一起工作,尽管到目前为止还不能测试这一点。

Oracle连接器如何工作

开云体育电动老虎机数据库架构历史记录

tbd。

快照

大多数Oracle服务器都被配置为不在重做日志中保留数据库的完整历史,因此Debezium Oracle连接器将无法通过简单地读取日志来查看数据库的完整历开云体育电动老虎机史。开云体育官方注册网址因此,默认情况下(快照模式最初的)连接器将在第一次启动时执行初始化一致的快照数据库(意味着开云体育电动老虎机根据连接器的筛选器配置捕获的任何表中的结构和数据)。

每个快照由以下步骤组成:

  1. 确定要捕获的表

  2. 获得一个独占模式锁定每个被监视的表,以确保任何表都不会发生结构更改。

  3. 读取服务器重做日志中的当前SCN(“系统更改号”)位置。

  4. 捕获所有相关表的结构。

  5. 释放在第2步中获得的锁,即锁只被持有一小段时间。

  6. 扫描所有相关的数据库表和模式,使其在步骤3中读取的开云体育电动老虎机SCN位置有效(从scn123开始选择*),并生成一个事件,并将该事件写入相应的特定于表的Kafka主题。

  7. 在连接器偏移中记录快照的成功完成。

如果连接器失败,重新平衡,或者在步骤1开始后但在步骤7完成之前停止,重新启动连接器将开始一个新的快照。一旦Oracle连接器完成了它的初始快照,它将继续从第3步中的位置读取流,以确保它不会错过快照拍摄时发生的任何更新。如果连接器由于任何原因再次停止,在重新启动时,它将从之前停止的地方继续流式传输更改。

第二种快照模式为schema_only.在这种情况下,不应用上面描述的快照例程中的第6步。换句话说,连接器仍然捕获相关表的结构,但它不创建任何表表示连接器启动时的完整数据集的事件。如果您只对从现在开始的数据更改感兴趣,而不是对所有记录的完整当前状态感兴趣,这可能很有用。

读取重做日志

在第一次启动时,连接器获取捕获的表(DDL)结构的快照,并将此信息保存在其内部数据库历史主题中。开云体育电动老虎机然后,它继续从捕获模式结构的SCN监听更改事件。处理后的scn作为偏移量传递给Kafka Connect,并定期与数据库服务器确认(允许它丢弃旧的日志文件)。开云体育电动老虎机重新启动后,连接器将从之前停止的偏移量(SCN)恢复。

主题名称

架构更改主题

模式更改主题消息的格式处于酝酿状态,可以在不另行通知的情况下进行更改。

Oracle连接器在数据库历史主题中存储数据库表的历史模式结构。开云体育电动老虎机此主题应被视为连接器的内部状态,用户不应使用。如果应用程序需要跟踪源数据库中的更改,则有面向公众的模式更改主题。开云体育电动老虎机主题名称与连接器配置中配置的逻辑服务器名称相同。

开云体育官方注册网址每当一个新表从这个主题流出来,或者当表的结构被改变时,Debezium就会向这个主题发出一条新消息(必须遵循模式演化过程).该消息包含表模式的逻辑表示。

该消息的示例是:

{"schema":{…}, "payload": {"source": {"version": "1.3.1. "Final", "connector": "oracle", "name": "server1", "ts_ms": 1588252618953, "snapshot": "true", "db": "ORCLPDB1", "schema": "开云体育官方注册网址DEBEZIUM", "table": "CUSTOMERS", "txId": null, "scn": "1513734", "commit_scn": "1513734", "lcr_position": nu开云体育电动老虎机ll}, "databaseName": "ORCLPDB1", "schemaName": "DEBEZIUM", "ddl": "CREATE table \"DEBEZIUM\"。\"客户" \n ("ID " NUMBER(9,0) NOT NULL ENABLE, \n "FIRST_NAME " VARCHAR2(255), \n "LAST_NAME" VARCHAR2(255), \n "EMAIL " VARCHAR2(255), \n主键("ID ") ENABLE,\n补充日志数据(ALL)列\n)段创建立即\n PCTFREE 10 PCTUSED 40 INITRANS 1 MAXTRANS 255 \n NOCOMPRESS LOGGING\n STORAGE(INITIAL 65536 NEXT 1048576 MINEXTENTS 1 MAXEXTENTS 2147483645\n PCTINCREASE 0 FREELISTS 1 FREELIST GROUPS 1\n BUFFER_POOL DEFAULT FLASH_CACHE DEFAULT CELL_FLASH_CACHE DEFAULT)\n表空间\"USERS\" ", "tableChanges": [{"type": "CREATE", "id": "\"ORCLPDB1\".\"DEBEZIUM\"。开云体育官方注册网址\"CUSTOMERS\"", "table": {"defaultCharsetName": null, "primaryKeyColumnNames": ["ID"], "columns": [{"name": "ID", "jdbcType": 2, "nativeType": null, "typeName": "NUMBER", "typeExpression": "NUMBER", "charsetName": null, "length": 9, "scale": 0, "position": 1, "optional": false, "autoIncremented": false, "generated": false}, {"name": "FIRST_NAME", "jdbcType": 12, "nativeType": null, "typeName": "VARCHAR2", "typeExpression": "VARCHAR2", "charsetName": null, "length": 255, "scale":null, "position": 2, "optional": false, " autoincremental ": false, "charsetName": "LAST_NAME", "jdbcType": 12, "nativeType": null, "typeName": "VARCHAR2", "typeExpression": "VARCHAR2", "charsetName": null, "length": 255, "scale": null, "position": 3, "optional": false, " autoincremental ": false, "generated": false}, {"name": "EMAIL", "jdbcType": 12, "nativeType": null, "typeName": "VARCHAR2", "typeExpression": "VARCHAR2", "charsetName": null, "length": 255, "scale": "generated":假"},{"name": "EMAIL", "jdbcType": 12, "nativeType": null, "typeName": "VARCHAR2", "typeExpression": "VARCHAR2", "charsetName": null, "length": 255, "scale": "null, "position": 4, "optional": false, " autoincreented ": false, "generated": false}]}}]}}

的字段

  • 开云体育电动老虎机数据库名而且schemaName描述哪个数据库/模式受到了影响开云体育电动老虎机

  • ddl包含负责模式更改的DDL

  • tableChanges数组包含DDL命令生成的一个或多个模式更改

  • 类型描述更改的类型:创建-表已创建改变-表修改,下降-删除表

  • id表的完整标识符吗

  • 表格表示应用更改后的表元数据

  • primaryKeyColumnNames是组成表主键的列的列表吗

  • 列是每个列的元数据吗

模式更改消息使用更改应用到的数据库的名称作为键:开云体育电动老虎机

{"schema": {"type": "struct", "fields": [{"type": "string", "optional": false, "field": "data开云体育电动老虎机baseName"}], "optional": false, "name": "io. debez开云体育官方注册网址um .connector.oracle. schemachangekey "}, "payload": {"databaseName": "ORCLPDB1"}}

事件

由Oracle连接器产生的所有数据更改事件都有一个键和一个值,尽管键和值的结构依赖于产生更改事件的表(参见主题名称).

Debe开云体育官方注册网址zium Oracle连接器确保所有Kafka连接模式名有效的Avro模式名.这意味着逻辑服务器名必须以拉丁字母或下划线开头(例如,[a-z, a-z, _]),逻辑服务器名中的其余字符以及模式和表名中的所有字符必须是拉丁字母、数字或下划线(例如,[a-z, a-z, 0-9,\_])。如果不是,则所有无效字符将自动替换为下划线字符。

当逻辑服务器名、模式名和表名包含其他字符时,这可能导致意外的冲突,并且表全名之间唯一的区分字符无效,因此被下划线取代。

开云体育官方注册网址Debezium和Kafka Connect就是围绕这个设计的连续的事件消息流,这些事件的结构可能会随着时间而改变。对于消费者来说,这可能很难处理,所以Kafka Connect让每个事件都是自包含的。每个消息键和值都有两部分模式而且有效载荷.模式描述有效负载的结构,而有效负载包含实际数据。

更改事件键

对于给定的表,更改事件的键将具有一个结构,该结构在创建事件时包含表的主键(或唯一键约束)中的每一列的字段。

考虑一个客户表中定义的库存开云体育电动老虎机数据库模式:

CREATE TABLE customers (id NUMBER(9) GENERATED BY DEFAULT ON NULL AS IDENTITY (START WITH 1001) NOT NULL PRIMARY KEY, first_name VARCHAR2(255) NOT NULL, last_name VARCHAR2(255) NOT NULL, email VARCHAR2(255) NOT NULL UNIQUE);

如果开云体育电动老虎机database.server.name属性的值server1,每变事件为客户表,当它有这个定义时,将具有相同的键结构,在JSON中是这样的:

{"schema": {"type": "struct", "fields": [{"type": "int32", "optional": false, "field": "ID"}], "optional": false, "name": "server1.INVENTORY.CUSTOMERS. "Key"}, "payload": {"ID": 1004}}

模式密钥部分包含一个Kafka Connect模式,描述密钥部分中的内容,在我们的例子中,这意味着有效载荷值不是可选的,是由名为server1.开云体育官方注册网址DEBEZIUM.CUSTOMERS.Key,并且有一个名为id类型的int32.如果你看键的值有效载荷字段,你可以看到它确实是一个结构(在JSON中只是一个对象)id字段,值为1004

因此,可以将此键解释为描述inventory.customers表(从命名的连接器输出server1),其id主键列的值为1004

更改事件值

与消息键一样,更改事件消息的值具有模式节和有效载荷部分。Oracle连接器产生的每个更改事件值的有效负载部分都有一个信封结构,使用以下字段:

  • 人事处必选字段,包含描述操作类型的字符串值。Oracle连接器的值为c对于创建(或插入),u对于更新,d对于删除,和r用于读取(在快照的情况下)。

  • 之前是否是可选字段,如果存在则包含行状态之前事件发生了。该结构将由server1.INVENTORY.CUSTOMERS.ValueKafka Connect模式,其中server1对象中的所有行使用连接器inventory.customers表格

该字段及其元素是否可用在很大程度上取决于补充日志应用于表的配置。

  • 是否是可选字段,如果存在则包含行状态事件发生了。结构的描述是相同的server1.INVENTORY.CUSTOMERS.Value中使用的Kafka Connect模式之前

  • 是一个强制性的字段,其中包含一个结构描述元数据来源,在甲骨文中包含这些字段:Debezium版本,连接器名称、事件是否进行的一个快照,事务id(不是在快照),视交叉上核的变化,和一个时间戳,表示时间点记录改变时在源数据库(在快照,这是快照的时间点)。开云体育官方注册网址开云体育电动老虎机

commit_scn字段是可选的,描述了变更事件参与的事务提交的SCN。该字段仅在使用LogMiner连接适配器时出现。

  • ts_ms是可选的,如果存在,则包含连接器处理事件的时间(使用运行Kafka Connect任务的JVM中的系统时钟)。

当然,还有模式事件消息值的一部分包含描述此信封结构及其内嵌套字段的模式。

创建事件

我们来看看a创建事件值可能看起来像客户表:

{"模式":{“类型”:“结构”、“字段”:[{“类型”:“结构”、“字段”:[{“类型”:“int32”、“可选”:假的,“场”:“ID”},{“类型”:“弦”、“可选”:假的,“场”:“FIRST_NAME”},{“类型”:“弦”、“可选”:假的,“场”:“LAST_NAME”},{“类型”:“弦”、“可选”:假的,“场”:“电子邮件”}],“可选”:真的,“名字”:“server1.DEBEZIUM.CUSTOMERS。开云体育官方注册网址值","field": "before"}, {"type": "int32", "optional": false, "field": "ID"}, {"type": "string", "optional": false, "field": "FIRST_NAME"}, {"type": "string", "optional": false, "field": "LAST_NAME"}, {"type": "string", "optional": false, "field": "EMAIL"}], "optional": true, "name": "server1. debezum . customers。开云体育官方注册网址值”、“场”:“后”},{“类型”:“结构”、“字段”:[{“类型”:“弦”、“可选”:真的,“场”:“版本”},{“类型”:“弦”、“可选”:假的,“场”:“name”},{“类型”:“int64”、“可选”:真的,“场”:“ts_ms”},{“类型”:“弦”、“可选”:真的,“场”:“txId”},{“类型”:“int64”、“可选”:真的,“场”:“scn”},{“类型”:“int64”、“可选”:真的,“场”:“commit_scn”},{“类型”:“布尔”、“可选”:真的,“场”:“快照”}],“可选”:假的,“名字”:"io.开云体育官方注册网址 debezum .connector.oracle. source", "field": "source"}, {"type": "string", "optional": false, "field": "op"}, {"type": "int64", "optional": true, "field": "ts_ms"}], "optional": false, "name": "server1. debezum . customers . "信封”},“有效载荷”:{“前”:空,“后”:{" ID ": 1004年,“FIRST_NAME”:“安妮”,“LAST_NAME”:“Kretchmar”、“电子邮件”:“annek@noanswer.org”},“源”:{“版本”:“0.9.0。Alpha1", "name": "server1", "ts_ms": 1520085154000, "txId": "6.28.807", "scn": 2122185, "commit_scn": 2122185, "snapshot": false}, "op": "c", "ts_ms": 1532592105975}}

如果我们看模式事件的一部分价值的模式信封的模式结构(特定于Oracle连接器并在所有事件中重用),以及表特定的模式之前而且字段。

的模式名称之前而且字段的格式为logicalNameschemaName的表. value,因此完全独立于所有其他表的所有其他模式。这意味着当使用Avro转换器,得到的Avro方案每个表在每一个逻辑源有自己的演变和历史。

如果我们看有效载荷事件的一部分价值,我们可以看到事件中的信息,即它正在描述创建的行(sinceop = c),以及字段值包含新插入行的'IDFIRST_NAMELAST_NAME,电子邮件列。

事件的JSON表示形式似乎比它们描述的行要大得多。这是正确的,因为JSON表示必须包含模式有效载荷部分信息。这是可能的,甚至建议使用Avro转换器以大幅减少写入Kafka主题的实际消息的大小。

更新事件

的值更新这个表上的Change事件实际上会有完全相同的结果模式,其有效负载的结构相同,但将持有不同的值。这里有一个例子:

{"schema":{…},“有效载荷”:{“前”:{" ID ": 1004年,“FIRST_NAME”:“安妮”,“LAST_NAME”:“Kretchmar”、“电子邮件”:“annek@noanswer.org”},“后”:{" ID ": 1004年,“FIRST_NAME”:“安妮”,“LAST_NAME”:“Kretchmar”、“电子邮件”:“anne@example.com”},“源”:{“版本”:“0.9.0。Alpha1", "name": "server1", "ts_ms": 1520085811000, "txId": "6.9.809", "scn": 2125544, "commit_scn": 2125544, "snapshot": false}, "op": "u", "ts_ms": 1532592713485}}

当我们把这个和插入事件中,我们看到了一些不同有效载荷部分:

  • 人事处字段值现在是u,表示该行因更新而更改

  • 之前字段现在拥有数据库提交前包含值的行状态开云体育电动老虎机

  • 字段现在已经更新了行状态,这里可以看到电子邮件价值就是现在anne@example.com

  • 字段结构具有与以前相同的字段,但值不同,因为此事件来自重做日志中的不同位置。

  • ts_ms显示了Debezium处理此事件的时间戳。开云体育官方注册网址

通过观察,我们可以学到很多东西有效载荷部分。我们可以比较之前而且结构来确定由于提交而在该行中实际更改的内容。的结构告诉我们Oracle关于这个变化记录的信息(提供可跟踪性),但更重要的是,我们可以将这个信息与这个和其他主题中的其他事件进行比较,以了解这个事件是在之前发生的,之后发生的,还是作为其他事件的一部分发生在同一个Oracle提交中。

当一行的主键/唯一键的列更新时,行键的值也发生了变化,因此Debezium将输出开云体育官方注册网址三个事件:删除事件和墓碑上的事件使用旧的行键,后面跟着插入事件,使用该行的新键。

删除事件

到目前为止,我们已经看到了样本创建而且更新事件。现在,我们来看看a的值删除事件。再一次,模式的部分值将与创建而且更新事件:

{"schema":{…},“有效载荷”:{“前”:{" ID ": 1004年,“FIRST_NAME”:“安妮”,“LAST_NAME”:“Kretchmar”、“电子邮件”:“anne@example.com”},“后”:空,“源”:{“版本”:“0.9.0。Alpha1", "name": "server1", "ts_ms": 1520085153000, "txId": "6.28.807", "scn": 2122184, "commit_scn": 2122184, "snapshot": false}, "op": "d", "ts_ms": 1532592105960}}

如果我们看有效载荷部分,我们看到了一些不同的比较创建更新事件的有效载荷:

  • 人事处字段值现在是d,表示该行已被删除

  • 之前字段现在拥有在数据库提交时删除的行状态。开云体育电动老虎机

  • 字段为空,表示该行不再存在

  • 字段结构具有许多与以前相同的值,除了ts_ms视交叉上核而且txId领域发生了变化

  • ts_ms显示了Debezium处理此事件的时间戳。开云体育官方注册网址

此事件向使用者提供了用于处理删除该行的各种信息。

Oracle连接器的事件设计用于处理Kafka对数压缩,只要每个键至少保留最近的消息,就可以删除一些旧消息。这允许Kafka回收存储空间,同时确保主题包含一个完整的数据集,并可用于重新加载基于键的状态。

删除一行时,删除上面列出的event值仍然适用于日志压缩,因为Kafka仍然可以删除所有使用相同键的早期消息。但仅当消息值为时卡夫卡会知道它可以移除吗所有消息用同样的钥匙。为了实现这一点,Debezium的Oracle开云体育官方注册网址连接器总是遵循删除特别活动墓碑上具有相同but键的事件价值。

事务的元数据

开云体育官方注册网址Debezium可以生成表示事务元数据边界和丰富数据消息的事件。

事务边界

开云体育官方注册网址Debezium为每个事务生成事件开始而且结束.每个事件包含

  • 状态-开始结束

  • id唯一事务标识符的字符串表示

  • event_count(结束事件)——事务发出的事件总数

  • data_collections(结束事件)-对的数组data_collection而且event_count它提供了由来自给定数据收集的更改所发出的事件数

下面是一条消息的示例:

{"status": "BEGIN", "id": "5.6.641", "event_count": null, "data_collections": null} {"status": "END", "id": "5.6.641", "event_count": 2, "data_collections": [{"data_collection": "ORCLPDB1.DEBEZ开云体育官方注册网址IUM. debezium . "CUSTOMER", "event_count": 1}, {"data_collection": "ORCLPDB1.DE开云体育官方注册网址BEZIUM。ORDER", "event_count": 1}]}

事务事件被写入指定的主题<开云体育电动老虎机 database.server.name > .transaction

数据事件丰富

启用事务元数据时,数据消息信封是充实了新的事务字段。这个字段以复合字段的形式提供关于每个事件的信息:

  • id唯一事务标识符的字符串表示

  • total_order-该事件在事务生成的所有事件中的绝对位置

  • data_collection_order-该事件在事务发出的所有事件中的每数据收集位置

下面是一条消息的示例:

{“前”:零,“后”:{“pk”:“2”,“aa”:“1”},“源”:{…},“人事处”:“c”、“ts_ms”:“1580390884335”,“交易”:{" id ":“5.6.641”、“total_order”:“1”,“data_collection_order”:" 1 "}}

数据类型

如上所述,Debezium Oracle连接器用开云体育官方注册网址事件表示行更改,事件的结构类似于行所在的表。事件包含每个列值的字段,该值在事件中如何表示取决于列的Oracle数据类型。本节描述从Oracle数据类型到a的映射文字类型而且语义类型在事件字段中。

在这里,文字类型描述了如何使用Kafka Connect模式类型逐字表示值,即INT8INT16INT32INT64FLOAT32FLOAT64布尔字符串字节数组地图,结构体

语义类型描述了Kafka Connect模式如何捕获意义该字段使用Kafka Connect模式的名称。

对更多数据类型的支持将在后续版本中添加。请提交JIRA问题对于你遗漏的任何特定类型。

字符值

Oracle数据类型

文字类型(模式类型)

语义类型(模式名)

笔记

CHAR ((M))

字符串

N/A

NCHAR ((M))

字符串

N/A

VARCHAR ((M))

字符串

N/A

VARCHAR2 ((M))

字符串

N/A

NVARCHAR2 ((M))

字符串

N/A

数值

Oracle数据类型

文字类型(模式类型)

语义类型(模式名)

笔记

数量((P [*]))

结构体

io.开云体育官方注册网址debezium.data.VariableScaleDecimal

包含两个字段的结构:规模类型的INT32其中包含传输值的刻度和价值类型的字节以未缩放的形式包含原始值。

Number (p, s > 0)

字节

org.apache.kafka.connect.data.Decimal

数字(p, s⇐0)

INT8/INT16/INT32/INT64

N/A

数量以0为刻度的列表示整数;在Oracle中,负刻度表示舍入,例如-2的刻度将导致舍入到数百。
根据精度和比例,将选择匹配的Kafka Connect整数类型:INT8如果P - S < 3,INT16如果P - S < 5,INT32如果P - S < 10且INT64如果P - S < 19。
如果P - S >= 19,则将列映射到字节org.apache.kafka.connect.data.Decimal).

短整型

字节

org.apache.kafka.connect.data.Decimal

短整型在Oracle中映射到NUMBER(38,0),因此可以保存比任何INT类型可以存储

整数INT

字节

org.apache.kafka.connect.data.Decimal

整数在Oracle中映射到NUMBER(38,0),因此可以保存比任何INT类型可以存储

数字[(P, S)]

字节/INT8/INT16/INT32/INT64

org.apache.kafka.connect.data.Decimal如果使用字节

处理等效于数量(注意S默认为0数字).

小数((P, S))

字节/INT8/INT16/INT32/INT64

org.apache.kafka.connect.data.Decimal如果使用字节

处理等效于数量(注意S默认为0小数).

BINARY_FLOAT

FLOAT32

N/A

BINARY_DOUBLE

FLOAT64

N/A

浮动((P))

结构体

io.开云体育官方注册网址debezium.data.VariableScaleDecimal

包含两个字段的结构:规模类型的INT32其中包含传输值的刻度和价值类型的字节以未缩放的形式包含原始值。

双精度

结构体

io.开云体育官方注册网址debezium.data.VariableScaleDecimal

包含两个字段的结构:规模类型的INT32其中包含传输值的刻度和价值类型的字节以未缩放的形式包含原始值。

真正的

结构体

io.开云体育官方注册网址debezium.data.VariableScaleDecimal

包含两个字段的结构:规模类型的INT32其中包含传输值的刻度和价值类型的字节以未缩放的形式包含原始值。

十进制值

decimal.handling.mode配置属性设置为精确的,那么连接器将使用预定义的Kafka Connectorg.apache.kafka.connect.data.Decimalio.开云体育官方注册网址debezium.data.VariableScaleDecimal如上所述,数值列的逻辑类型。这是默认模式。

然而,当decimal.handling.mode配置属性设置为,则连接器将这些值表示为具有模式类型的Java双精度值FLOAT64.最后一个选项decimal.handling.mode配置属性为字符串.在这种情况下,连接器将用模式类型的格式化字符串表示值字符串

时间值

Oracle数据类型

文字类型(模式类型)

语义类型(模式名)

笔记

日期

INT64

io.开云体育官方注册网址debezium.time.Timestamp

表示过去纪元的毫秒数,不包括时区信息。

时间戳(0 - 3)

INT64

io.开云体育官方注册网址debezium.time.Timestamp

表示过去纪元的毫秒数,不包括时区信息。

时间戳,时间戳(4 - 6)

INT64

io.开云体育官方注册网址debezium.time.MicroTimestamp

表示经过epoch的微秒数,不包括时区信息。

时间戳(7 ~ 9)

INT64

io.开云体育官方注册网址debezium.time.NanoTimestamp

表示过去纪元的纳秒数,不包括时区信息。

带时区的时间戳

字符串

io.开云体育官方注册网址debezium.time.ZonedTimestamp

带有时区信息的时间戳的字符串表示形式

时间间隔

FLOAT64

io.开云体育官方注册网址debezium.time.MicroDuration

属性的时间间隔的微秒数365.25 / 12.0每月平均天数公式

部署连接器

由于许可要求,Debezium Oracle连接器不附带Oracle 开云体育官方注册网址JDBC驱动程序和XStream API JAR。你可以下载Oracle即时客户端

将存档提取到一个目录中,例如/ / instant_client / /路径。复制文件_ojdbc8.jar而且xstreams.jar从即时客户端到卡夫卡的填词目录中。创建环境变量LD_LIBRARY_PATH,指向即时客户端目录:

LD_LIBRARY_PATH = /道路/ / instant_client /

示例配置

下面是一个注册Debezium Oracle连接器实例的JSON请求示例:开云体育官方注册网址

{"name": "inventory-connector", "config": {"connector.class": "io.deb开云体育官方注册网址ezium.connector.oracle.OracleConnector", "tasks. debezium.connector.oracle. oracleconnector ", "Max ": "1", "开云体育电动老虎机database.server.name": "server1", "database. name"。Hostname ": "", "开云体育电动老虎机数据库。端口":"1521","数据库。开云体育电动老虎机user" : "c##xstrm", "database.password" : "xs", "database.dbname" : "ORCLCDB", "database.pdb.name" : "ORCLPDB1", "database.out.server.name" : "dbzxout", "database.history.kafka.bootstrap.servers" : "kafka:9092", "database.history.kafka.topic": "schema-changes.inventory" } }

选择适配器

开云体育官方注册网址Debezium提供了多种从Oracle获取变更事件的方法。默认情况下,Debez开云体育官方注册网址ium使用XStream API,但这并不总是适用于每个安装。

下面的示例配置通过添加开云体育电动老虎机database.connection.adapter,连接器可以切换到使用LogMiner实现。

{"name": "inventory-connector", "config": {"connector.class": "io.deb开云体育官方注册网址ezium.connector.oracle.OracleConnector", "tasks. debezium.connector.oracle. oracleconnector ", "Max ": "1", "开云体育电动老虎机database.server.name": "server1", "database. name"。Hostname ": "", "开云体育电动老虎机数据库。端口":"1521","数据库。开云体育电动老虎机user" : "c##xstrm", "database.password" : "xs", "database.dbname" : "ORCLCDB", "database.pdb.name" : "ORCLPDB1", "database.out.server.name" : "dbzxout", "database.history.kafka.bootstrap.servers" : "kafka:9092", "database.history.kafka.topic": "schema-changes.inventory" "database.connection.adapter": "logminer" } }

我们鼓励使用LogMiner实现进行测试,并向我们提供您的反馈,但我们还不建议在生产中使用它,因为它仍在积极开发中。

监控

除了Zo开云体育官方注册网址okeeper、Kafka和Kafka Connect内置的对JMX指标的支持外,Debezium Oracle连接器还有三种指标类型。

详情请参阅监控文档了解如何通过JMX公开这些指标的详细信息。

快照指标

MBean开云体育官方注册网址debezium.oracle: type = connector-metrics上下文=快照,server =<开云体育电动老虎机 database.server.name >

属性 类型 描述

字符串

连接器读取的最后一个快照事件。

自连接器读取并处理最近事件以来的毫秒数。

自上次启动或重置以来,此连接器已看到的事件总数。

已由连接器上配置的包含/排除列表筛选规则筛选的事件数。

string []

连接器监视的表的列表。

int

用于在快照和主Kafka Connect循环之间传递事件的队列长度。

int

用于在快照和主Kafka Connect循环之间传递事件的队列的空闲容量。

int

快照中包含的表的总数。

int

快照尚未复制的表数。

布尔

快照是否启动。

布尔

快照是否中止。

布尔

快照是否完成。

快照到目前为止所花费的总秒数,即使没有完成。

Map < String,长>

映射,其中包含为快照中的每个表扫描的行数。在处理期间将表增量地添加到Map中。每扫描10,000行并在完成一个表时更新一次。

流指标

MBean开云体育官方注册网址debezium.oracle: type = connector-metrics、上下文=流媒体服务器=<开云体育电动老虎机 database.server.name >

属性 类型 描述

字符串

连接器读取的最后一个流事件。

自连接器读取并处理最近事件以来的毫秒数。

自上次启动或重置以来,此连接器已看到的事件总数。

已由连接器上配置的包含/排除列表筛选规则筛选的事件数。

string []

连接器监视的表的列表。

int

用于在streamer和主Kafka Connect循环之间传递事件的队列长度。

int

用于在streamer和主Kafka Connect循环之间传递事件的队列的空闲容量。

布尔

标志,该标志表示连接器当前是否连接到数据库服务器。开云体育电动老虎机

从最后一个更改事件的时间戳到连接器处理它之间的毫秒数。这些值将包含运行数据库服务器和连接器的机器上的时钟之间的任何差异。开云体育电动老虎机

提交的已处理事务的数量。

Map < String, String >

上次接收事件的坐标。

字符串

最后处理的事务的事务标识符。

LogMiner指标

MBean开云体育官方注册网址debezium.oracle: type = connector-metrics、上下文= log-miner服务器=<开云体育电动老虎机 database.server.name >

属性 类型 描述

最近的SCN已经处理完毕。

int

观察到的DML操作的数量。

string []

当前重做日志的文件名。

string []

重做日志的当前状态。

重做日志切换的次数。

持续时间

上一次日志挖掘查询准备处理结果所花费的时间。

持续时间

日志挖掘查询为处理准备结果所花费的平均时间。

int

执行的日志挖掘查询的数量。

持续时间

处理最后一个日志挖掘查询结果所花费的时间。

持续时间

处理日志挖掘查询结果所花费的平均时间。

int

已处理的日志挖掘查询结果个数。

int

日志挖掘查询每次数据库往返获取的条目数。开云体育电动老虎机

int

在从日志挖掘视图获取另一批结果之前,连接器休眠的毫秒数。

架构历史指标

MBean开云体育官方注册网址debezium.mysql: type = connector-metrics、上下文= schema-history服务器=<开云体育电动老虎机 database.server.name >

属性 类型 描述

字符串

之一停止恢复(从存储中恢复历史),运行描述数据库历史记录的状态。开云体育电动老虎机

恢复开始的时间(以epoch秒为单位)。

在恢复阶段读取的更改数。

在恢复和运行时应用的模式更改的总数。

自上次更改从历史存储区恢复以来所经过的毫秒数。

自应用最后一次更改以来所经过的毫秒数。

字符串

从历史存储中恢复的最后一次更改的字符串表示形式。

字符串

最后应用的更改的字符串表示形式。

连接器属性

以下配置属性为要求除非有默认值可用。

财产

默认的

描述

连接器的唯一名称。尝试使用相同的名称再次注册将失败。(所有Kafka Connect连接器都需要这个属性。)

连接器的Java类的名称。始终使用值io.开云体育官方注册网址debezium.connector.oracle.OracleConnector用于Oracle连接器。

1

应该为此连接器创建的最大任务数。Oracle连接器总是使用单个任务,因此不使用这个值,所以默认值总是可以接受的。

Oracle数据库服务器的IP地址或主机名。开云体育电动老虎机

Oracle数据库服务器的整数端口号。开云体育电动老虎机

连接Oracle数据库服务器时使用的用户名。开云体育电动老虎机

连接Oracle数据库时使用的密码。开云体育电动老虎机

要连接的数据库的名称。开云体育电动老虎机当使用CDB + PDB模型时,必须是CDB名称。

使用CDB + PDB模型时要连接的PDB的名称。

数据库中配置的XStream出站服务器的名称。开云体育电动老虎机

逻辑名称,用于标识并提供被监视的特定Oracle数据库服务器的名称空间。开云体育电动老虎机逻辑名在所有其他连接器中应该是唯一的,因为它被用作从该连接器发出的所有Kafka主题名的前缀。只能使用字母数字字符和下划线。

xstream

要使用的适配器实现。xstream使用Oracle XStreams API。logminer使用原生的Oracle LogMiner API。

Kafka主题的全称,连接器将在其中存储数据库模式历史。开云体育电动老虎机

一个主机/端口对列表,连接器将使用它建立到Kafka集群的初始连接。此连接将用于检索以前由连接器存储的数据库模式历史,并用于写入从源数据库读取的每个DDL语开云体育电动老虎机句。这应该指向Kafka Connect进程使用的相同的Kafka集群。

最初的

一种对所捕获表的结构和可选数据进行初始快照的模式。支持的值为最初的(将捕获表的结构和数据的快照;如果主题应该用捕获表中的数据的完整表示来填充,则很有用)和schema_only(只对捕获的表的结构进行快照;有用的是,从现在开始发生的变化应该传播到主题)。快照完成后,连接器将继续从数据库的重做日志中读取更改事件。开云体育电动老虎机

空字符串

一个可选的逗号分隔的正则表达式列表,它匹配要监控的表的完全限定表标识符;任何未包含在包含列表中的表都将被排除在监视之外。每个标识符都是这样的schemaName的表.默认情况下,连接器将监视每个被监视数据库中的每个非系统表。开云体育电动老虎机不得与table.exclude.list

空字符串

一个可选的逗号分隔的正则表达式列表,它与要排除在监视之外的表的完全限定表标识符匹配;任何不在排除列表中的表都将被监控。每个标识符都是这样的schemaName的表.不得与table.include.list

N/A

一个以逗号分隔的可选正则表达式列表,它匹配基于字符的列的完全限定名称,这些列的值应该是更改事件消息值中的假名,字段值由使用该算法的散列值组成hashAlgorithm和盐.基于所使用的哈希函数,在数据假名化的同时保持了引用完整性。中描述了支持的哈希函数MessageDigest节Java密码体系结构标准算法名称文档。哈希值自动缩短为列的长度。

可以在单个配置中使用具有不同长度的多个属性,尽管每个属性的长度必须为正整数或零。列的完全限定名的格式为pdbNameschemaName的表columnName

例子:

column.mask.hash.sha with.salt——256.。CzQMA0cB5K =库存。订单。customerName, inventory.shipment.customerName

在哪里CzQMA0cB5K是随机选择的盐。

注:取决于hashAlgorithm使用,所选数据集与实际数据集相匹配,得到的屏蔽数据集可能不能完全匿名化。

精确的

指定连接器应如何处理的浮点值数量小数而且数字列:精确的(默认值)精确地表示它们使用java.math.BigDecimal变更事件中以二进制形式表示的值;或表示它们使用值,这可能会导致精度的损失,但将更容易使用。字符串选项将值编码为格式化的字符串,这很容易使用,但关于真实类型的语义信息会丢失。看到(十进位)

失败

指定连接器在事件处理期间应如何对异常作出反应。失败将传播异常(指示有问题事件的偏移量),导致连接器停止。
警告将导致跳过有问题的事件并记录有问题事件的偏移量。
跳过将导致跳过有问题的事件。

8192

正整数值,指定阻塞队列的最大大小,从数据库日志中读取的更改事件在写入Kafka之前被放置在其中。开云体育电动老虎机例如,当写入Kafka较慢或Kafka不可用时,该队列可以为binlog阅读器提供反压力。出现在队列中的事件不包括在此连接器定期记录的偏移量中。属性中指定的最大批处理大小,默认值为8192max.batch.size财产。

2048

正整数值,指定在此连接器的每次迭代期间应处理的每批事件的最大大小。默认为2048年。

1000

正整数值,指定连接器在每次迭代期间等待新更改事件出现的毫秒数。缺省值为1000毫秒,即1秒。

真正的

控制是否在删除事件之后生成墓碑事件。
真正的删除操作由删除事件和后续的墓碑事件表示。当只发送一个删除事件。
触发墓碑事件(默认行为)允许Kafka在源记录被删除后完全删除与给定键相关的所有事件。

空字符串

与完全限定的表和列匹配以映射主键的正则表达式的分号列表。
每个项(正则表达式)必须匹配<完全限定表>:<逗号分隔的列列表>表示自定义键。
完全限定表可以定义为pdbNameschemaName的表

N/A

一个以逗号分隔的可选正则表达式列表,它与基于字符的列的完全限定名匹配,如果字段值长于指定的字符数,则这些列的值应在更改事件消息值中被截断。可以在单个配置中使用具有不同长度的多个属性,尽管每个属性的长度必须为正整数。列的完全限定名的格式为pdbNameschemaName的表columnName

N/A

一个以逗号分隔的可选正则表达式列表,该列表与基于字符的列的完全限定名称匹配,这些列的值应在更改事件消息值中被替换为由指定数量的星号()字符。可以在单个配置中使用具有不同长度的多个属性,尽管每个属性的长度必须为正整数或零。列的完全限定名的格式为pdbNameschemaName的表columnName

N/A

一个以逗号分隔的可选正则表达式列表,它与列的完全限定名称相匹配,这些列的原始类型和长度应该作为参数添加到发出的更改消息中的相应字段模式中。模式参数__开云体育官方注册网址debezium.source.column.type__开云体育官方注册网址debezium.source.column.length而且__开云体育官方注册网址debezium.source.column.scale将分别用于传播原始类型名称和长度(对于变宽类型)。对于接收器数据库中相应列的适当大小很有用。开云体育电动老虎机列的完全限定名的格式为的表columnName,或schemaName的表columnName

N/A

一个以逗号分隔的可选正则表达式列表,它与特定于数据库的数据类型名称相匹配,这些列的原始类型和长度应该作为参数添加到发出的更改消息中的相应字段模开云体育电动老虎机式中。模式参数__开云体育官方注册网址debezium.source.column.type__开云体育官方注册网址debezium.source.column.length而且__开云体育官方注册网址debezium.source.column.scale将分别用于传播原始类型名称和长度(对于变宽类型)。对于接收器数据库中相应列的适当大小很有用。开云体育电动老虎机完全限定数据类型名称的格式为的表typeName,或schemaName的表typeName.看到特定于oracle的数据类型名称列表

0

控制心跳消息的发送频率。
此属性包含以毫秒为单位的间隔,该间隔定义连接器向心跳主题发送消息的频率。这可用于监视连接器是否仍在接收来自数据库的更改事件。开云体育电动老虎机在较长一段时间内只更改非捕获表中的记录的情况下,还应该利用心跳消息。在这种情况下,连接器会继续从数据库中读取日志,但不会向Kafka发出任何更改消息,这反过来意味着不会向Kafka提交偏移量更新。开云体育电动老虎机这将导致重做日志文件被数据库保留的时间超过所需的时间(因为连接器实际上已经处理了它们,但从未有机会将最新检索到的S开云体育电动老虎机CN刷新到数据库中),并且还可能导致在连接器重新启动后重新发送更多的更改事件。将此参数设置为0完全不发送心跳消息。
默认禁用。

__开云体育官方注册网址debezium-heartbeat

控制要向其发送心跳消息的主题的命名。
主题根据模式命名< heartbeat.topics.prefix >。< server.name >

连接器启动后在快照之前应该等待的间隔(以毫秒为单位);
可用于在启动集群中的多个连接器时避免快照中断,这可能导致连接器的重新平衡。

2000

指定在进行快照时应一次性从每个表读取的最大行数。连接器将以这个大小的多个批次读取表内容。默认为2000。

真正的连接器配置显式指定key.convertervalue.converter参数使用Avro,否则默认为

是否对字段名进行消毒以符合Avro命名要求。看到Avro命名欲知详情。

当设置为真正的开云体育官方注册网址Debezium生成具有事务边界的事件,并使用事务元数据丰富数据事件信封。

看到事务的元数据更多细节。