Oracle通过kafka同步数据到MySQL

本文介绍了如何通过Oracle的日志分析工具LogMiner,结合Kafka实现数据同步到MySQL的解决方案。由于Oracle官方的OGG成本较高,作者选择了利用LogMiner解析重做日志并发送到Kafka,再由MySQL消费进行同步。文章包含开启重做日志和补充日志的步骤,以及关键代码示例。
摘要由CSDN通过智能技术生成

场景

Oracle同步数据最佳的解决方案是自家的ogg,但是考虑到成本,需要找到其他的解决方案。如果是MySQL通过kafka同步,问题简单的多,因为阿里巴巴的开源数据同步方案——canel是最佳的解决方案。但是,canel只开源了MySQL数据库同步方案,Oracle同步没有开源出来。
借鉴canel的思路,canel通过实时获取MySQL的binlog日志做数据同步,Oracle有没有类似的方法呢
答案是肯定的,那就是Oracle的日志分析工具——logmner。通过实时获取logmner的重做日志,筛选出需要的信息,发送到kafka即可。

在这里插入图片描述

topic数据格式

在这里插入图片描述

以下是一个消息报文例子

{
   
  "sqlList": [
    {
   
      "dbType": "Oracle",
      "key": "3172712",
      "oprType": "UPDATE",
      "tableName": "PRODUCT_CHANNEL_CFG",
      "status": "1",
      "dbSql": "update \"PRODUCT_CHANNEL_CFG\" set \"STATUS\" = '1', \"OPR_CODE\" = '2' where \"PRODUCT_ID\" = '21000004' and \"CHANNEL_ID\" = '12345678' and \"STATUS\" = '1' and \"INURE_TIME\" = TO_DATE('01-1月 -19', 'DD-MON-RR') and \"EXPIRE_TIME\" = TO_DATE('01-1月 -19', 'DD-MON-RR') and \"OPR_CODE\" = '1' and \"EFFT_TYPE\" = '1' and \"CREATE_ID\" = '1000815' and \"CREATE_TIME\" = TO_DATE('23-8月 -19', 'DD-MON-RR') and \"MODIFY_ID\" IS NULL and \"MODIFY_TIME\" IS NULL;"
    },
    {
   
      "dbType": "MySql",
      "key": "3172712",
      "oprType": "UPDATE",
      "tableName": "PRODUCT_CHANNEL_CFG",
      "status": "1",
      "dbSql": "update product_channel_cfg set status = '1', opr_code = '2' where product_id = '21000004' and channel_id = '12345678' and status = '1' and inure_time = str_to_date('20190101', '%Y%m%d%H') and expire_time = str_to_date('20190101', '%Y%m%d%H') and opr_code = '1' and efft_type = '1' and create_id = '1000815' and create_time = str_to_date('20190823', '%Y%m%d%H') and modify_id is null and modify_time is null;"
    }
  ]
}

代码及步骤

  1. 首先,你要开启Oracle的重做日志,以及补充日志,具体步骤这不再赘述
  2. 代码如下:
    AcceptBean
import java.util.List;

public class AcceptBean {
   
    private List<InputBean> sqlList;

    public List<InputBean> getSqlList() {
   
        return sqlList;
    }

    public void setSqlList(List<InputBean> sqlList) {
   
        this.sqlList = sqlList;
    }
}

InputBean

public class InputBean {
   
    private String key;
    private String dbType;
    private String dbSql;

    public String getDbType() {
   
        return dbType;
    }

    public void setDbType(String dbType) {
   
        this.dbType = dbType;
    }

    public String getDbSql() {
   
        return dbSql;
    }

    public void setDbSql(String dbSql) {
   
        this.dbSql = dbSql;
    }

    public String getKey() {
   
        return key;
    }

    public void setKey(String key) {
   
        this.key = key;
    }
}

KafkaProducerDemo

import org.apache.kafka.clients.producer.*;

import java.util.Properties;

public class KafkaProducerDemo {
   
    private  final Producer<String,String> kafkaProducer;

    public final static String TOPIC="POC_TOPIC";

    public KafkaProducerDemo(){
   
        kafkaProducer=createKafkaProducer() ;
    }
    private Producer<String,String> createKafkaProducer(){
   
        Properties props = new Properties();
        props.put("bootstrap.servers", "127.0.0.1:9092");
        props.put("acks", "all");
        props.put(<
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值