使用kafka connect结合debezium的方式采集oracle数据

环境配置:
1、kafka 2.8.0
2、debezium 1.9.0
3、oracle 11g

1、oracle环境配置

该步骤参考我的上篇文章 https://blog.youkuaiyun.com/qq_36039236/article/details/124235751?spm=1001.2014.3001.5502

本章节继续针对FAMILY.STUDENT_INFO表进行操作。

2、kafka connect配置

kafka内部集成了kafka connect, 只需要下载对应的debezium-oracle插件,配置connect-distributed.properties 配置文件即可。
debezium-oracle插件下载地址
然后配置connect-distributed.properties的plugin.path, 解压对应的插件,配置对应的插件路径即可, 另外需要下载ojdbc8.jar放到kafka的lib目录下。
配置

3、启动kafka以及kafka connect

启动命令:

# 启动zookeeper
zkServer.sh start

# 启动kafka
./bin/kafka-server-start.sh -daemon ./config/server.properties

# 启动kafka-connect
./bin/connect-distributed.sh -daemon ./config/connect-distributed.properties

查看进程:
jps
查看加载的插件:

# 获取connector插件信息
curl http://localhost:8083/connector-plugins

插件

4、创建oracle source

命令如下:

curl -H "Content-Type: application/json" -X POST -d  '{
    "name": "source333", 
    "config": {
     "connector.class" : "io.debezium.connector.oracle.OracleConnector",
     "tasks.max" : "1",
     "database.server.name" : "oracle_service",
     "database.hostname" : "localhost",
     "database.port" : "1521",
     "database.user" : "family",
     "database.password" : "zyhcdc",
     "database.dbname" : "helowin",
     "table.include.list": "family.student_info",
     "database.history.kafka.bootstrap.servers" : "localhost:9092",
     "database.history.kafka.topic": "schema-changes.inventory222",
     "event.processing.failure.handling.mode": "skip",
     "log.mining.strategy":"online_catalog",
     "database.serverTimezone":"UTC",
     "database.serverTimezone":"Asia/Shanghai"
  }
}' http://localhost:8083/connectors/

查看任务执行状态:

curl http://localhost:8083/connectors/source333/status

status
查看Kafka topic列表:

./bin/kafka-topics.sh --list --zookeeper localhost:2181/kafka28

topics

发现增加了三个topic, 其中oracle_service.FAMILY.STUDENT_INFO记录的是 FAMILY.STUDENT_INFO表的ddl变更数据,schema-changes.inventory222 记录的是 FAMILY.STUDENT_INFO表的元数据变更信息。

创建对应topic的消费者:

./bin/kafka-console-consumer.sh --bootstrap-server localhost:9092 --topic oracle_service.FAMILY.STUDENT_INFO --from-beginning

data

获取到了表中原有的变更记录。

下面对表执行以下操作,观察获取到的数据变化:

-- 新增一条数据
insert into student_info (sno, sname, sex)
values (29, 'zyh-test', 'm');

insert

-- 更新数据
update student_info t set t.sname='zyh666', t.sex='m' where t.sno=23;

update

-- 删除数据
delete from student_info where sno = 26;

delete
验证更改表结构,是否对采集数据产生影响:

-- 增加一个字段
ALTER TABLE student_info ADD (age integer default 22 not null);
-- 新增一条记录
insert into student_info (sno, sname, sex, age)
values (30, 'zyh-888', 'm', 18);

data

发现增加了字段之后,数据记录这里并没有获取到新字段的值,如何处理???留个问题给小伙伴下去自己探索一下,这里不再赘述,后续进行补充

验证更新字段名称,是否造成影响:

alter table student_info rename column sname to stu_name;
-- 新增一条记录
insert into student_info (sno, stu_name, sex, age)
values (31, 'zyh-999', 'm', 18);

变更

发现变更字段名称对获取变更记录并没有造成影响。

5、相关问题处理

1、Oracle JDBC 驱动版本一定要是8
如果oracle jdbc的驱动版本不对,会出现一系列的连接失败异常以及找不到对应的表异常。

2、数字类型解析到kafka格式异常
decimal类型的数字到kafka中格式出现异常
查阅官方文档 , 得知Debezium默认使用java.math.BigDecimal以二进制形式精确表示值。
1参数2
解决:连接器参数添加

"decimal.handling.mode": "string"

3、Debezium捕获Oracle数据延迟大
成功跑起来Debezium并捕获到了数据,但是发现捕获数据的延迟过大,常常需要2-5分钟后数据库变更数据才会进入kafka中。

查阅官方文档
参数
解决:连接器参数添加

"log.mining.strategy":"online_catalog"

4、Debezium时间戳相比数据库多了8小时
Debezium 默认将所有时间戳字段转换为 UTC,所以会导致时间与本地相差了8小时。搜索网络上的解决方案,通过添加以下连接器参数均无效

"database.serverTimezone":"UTC"
"database.serverTimezone":"Asia/Shanghai"

解析相关变更记录时需要注意。

总结

自此,以上操作已经全部完成了,小伙伴可以根据工作需要选择对应的解决方案,总体体验上还是觉得flink cdc更加得方便,好了,就到这里,希望感兴趣的小伙伴能够点个关注,一起交流学习~

### 使用 Debezium 实现实时数据采集Kafka Debezium 可以作为连接器部署在 Kafka Connect 中来实现从各种数据库捕获变更并将这些变更加入到 Kafka 主题中[^2]。 #### 安装和配置 Debezium Connector 为了设置 Debezium 来监控特定的数据库并将其变化发送给 Kafka,需要先安装对应的 Debezium 连接器。对于 MySQL 数据库为例: 1. **启动 Zookeeper 和 Kafka** 确保已经有一个正在运行的 Kafka 集群以及相应的 Zookeeper 服务实例。 2. **创建 Kafka Topic** 创建一个或多个目标主题用于存储来自数据库的变化记录。例如: ```bash kafka-topics.sh --create --topic dbserver1.inventory.customers \ --bootstrap-server localhost:9092 --partitions 3 --replication-factor 1 ``` 3. **配置 Debezium Source Connector** 下面是一个 JSON 文件 `mysql-source.json` 的例子,它定义了如何配置 Debezium MySQL Connector: ```json { "name": "inventory-connector", "config": { "connector.class": "io.debezium.connector.mysql.MySqlConnector", "tasks.max": "1", "database.hostname": "localhost", "database.port": "3306", "database.user": "debezium", "database.password": "dbz", "database.server.id": "184054", "database.server.name": "dbserver1", "database.include.list": "inventory", "table.whitelist": "inventory.customers,inventory.orders", "column.blacklist": "", "snapshot.mode": "initial", "include.schema.changes": "true" } } ``` 4. **提交 Configuration 到 Kafka Connect REST API** 将上述配置文件的内容 POST 至 Kafka Connect 的 RESTful 接口以注册新的 source connector: ```bash curl -X POST http://localhost:8083/connectors/ \ -H 'Content-Type: application/json' \ -d @mysql-source.json ``` 一旦完成以上步骤,Debezium 就会开始监听指定数据库中的任何 DDL/DML 操作,并将它们转换成事件发布到预先设定好的 Kafka topic 上[^3]。 ```python from confluent_kafka import Consumer, Producer import json producer_conf = {'bootstrap.servers': 'localhost:9092'} consumer_conf = { 'bootstrap.servers': 'localhost:9092', 'group.id': 'my-group', 'auto.offset.reset': 'earliest' } def consume_messages(topic_name): consumer = Consumer(consumer_conf) consumer.subscribe([topic_name]) try: while True: msg = consumer.poll(1.0) if msg is None: continue if msg.error(): print(f"Consumer error: {msg.error()}") continue print(json.loads(msg.value().decode('utf-8'))) finally: consumer.close() consume_messages('dbserver1.inventory.customers') ``` 此 Python 脚本展示了怎样利用 Confluent Kafka 库消费由 Debezium 发布的消息。
评论 12
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

雾岛与鲸

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值