使用canal同步Mysql操作到Oracle(windows)

本文档详细介绍了如何使用Canal从MySQL同步数据到Oracle,包括配置MySQL的my.ini,设置Canal参数,创建Canal用户并授权,以及Java连接和操作代码的解析。特别提醒,注意不同数据库之间的SQL语句差异和数据类型转换问题。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

版本信息

java version “1.8.0_141”
Mysql version mysql-8.0.19-winx64
Canal version canal.deployer.1.1.3
rt = 11112

配置mysql的my.ini配置文件

[mysqld]
mysql_native_password default_authentication_plugin=mysql_native_password
server-id=1
bind-address=0.0.0.0
#开启binlog日志
log-bin=mysql-bin
binlog_format = ROW
[mysql]
#设置mysql客户端默认字符集
default-character-set=utf8mb4
[client]
#设置mysql客户端连接服务端时默认使用的端口
port=3306
default-character-set=utf8mb4

配置canal.deployer.1.1.3\conf\example\instance.properties

#position info
canal.instance.master.address=127.0.0.1:3306
canal.instance.master.journal.name=
canal.instance.master.position=
canal.instance.master.timestamp=
canal.instance.master.gtid=

#rds oss binlog
canal.instance.rds.accesskey=
canal.instance.rds.secretkey=
canal.instance.rds.instanceId=

#table meta tsdb info
canal.instance.tsdb.enable=true
#canal.instance.tsdb.url=jdbc:mysql://127.0.0.1:3306/canal_tsdb
#canal.instance.tsdb.dbUsername=canal
#canal.instance.tsdb.dbPassword=canal

配置canal.deployer.1.1.3\conf\canal.properties

#本地IP192.168.31.1:3306
canal.manager.jdbc.url=jdbc:mysql://192.168.31.1:3306/canal_manager?useUnicode=true&characterEncoding=UTF-8
#canal.manager.jdbc.username=root
#canal.manager.jdbc.password=121212
canal.destinations=example
#与my.ini内的server id= 不同即可
canal.id = 111111
canal.ip =
canal.port = 11111
canal.metrics.pull.port = 11112

#table meta tsdb info
canal.instance.tsdb.enable = true
canal.instance.tsdb.dir = canal.file.data.dir:../conf/{canal.file.data.dir:../conf}/canal.file.data.dir:../conf/{canal.instance.destination:}
canal.instance.tsdb.url = jdbc:h2:${canal.instance.tsdb.dir}/h2;CACHE_SIZE=1000;MODE=MYSQL;
canal.instance.tsdb.dbUsername = canal
canal.instance.tsdb.dbPassword = canal
#dump snapshot interval, default 24 hour
canal.instance.tsdb.snapshot.interval = 24
#purge snapshot expire , default 360 hour(15 days)
canal.instance.tsdb.snapshot.expire = 360

#aliyun ak/sk , support rds/mq
canal.aliyun.accessKey =
canal.aliyun.secretKey =

#################################################
######### destinations #############
#################################################
canal.destinations = example
#conf root dir
canal.conf.dir = …/conf
#auto scan instance dir add/remove and start/stop instance
canal.auto.scan = true
canal.auto.scan.interval = 5

重启mysql,登录mysql内

创建canal用户和授权;
// 新增用户
CREATE USER ‘canal’@’%’ IDENTIFIED BY ‘canal’;
// 授权
GRANT SHOW VIEW, SELECT, REPLICATION SLAVE, REPLICATION CLIENT ON . TO ‘canal’@’%’;
// 刷新
FLUSH PRIVILEGES;

开启canal.deployer.1.1.3\bin\start.bat

cmd界面:
在这里插入图片描述查看:canal.deployer.1.1.3\logs\canal\canal.log
在这里插入图片描述

canal配置的其他参数以及解释:

参考:写的很详细,在此感谢大神的辛苦创作
https://blog.youkuaiyun.com/u012758088/article/details/78789616?depth_1-utm_source=distribute.pc_relevant.none-task&utm_source=distribute.pc_relevant.none-task

javacanal连接。代码

注意事项一:下面的代码需要保证mysql与oracle导入导出的数据库名称和表名称完全一致,而且在mysql端创建删除表,oracle也会有对应的操作,创建表之后就可以插入数据,
因为Oracle与mysql的sql语句不通,而且拿到sql语句不支持oracle直接操作,因此该代码不支持delete,insert,update,create,drop之外的操作,需要另外开发(没必要)
注意事项二:因为拿到的数据均为string,所以在对数据进行操作时,除了基本数据类型和String类型,其他类型均要转换成oracle支持的数据类型,date的已经做了转换,基本数据类型和string不需要装换,如果有其他数据类型时,请先校验转换,参考date类型的处理方式,除date外,sql语句拼接的都是string(oracle可以用string数据导入基本数据类型的字段,例如 “1”等同于int 1)
注意事项3:如果有其他数据类型而且不能做转换,请联系QQ:1078442730,有另外的处理方式,但是要牺牲灵活性,所有的表都要事先创建对象,如果表有100个字段,就要创建100个属性,重复代码太多,灵活性太低,但是可以保证所有数据类型在mysql端和oracle端是一致的。

canla连接:通过配置文件连接
package com.zzw.Conn;

import com.alibaba.otter.canal.client.CanalConnector;
import com.alibaba.otter.canal.client.CanalConnectors;

import java.io.FileInputStream;
import java.io.IOException;
import java.net.InetSocketAddress;
import java.util.Properties;

public class CanalConn {
   
   
    static String hostname = null;
    static int    port = 0;
    static String destination = null;
    static String username = null;
    static String password = null;

    static {
   
   
        Properties properties = new Properties();
        try {
   
   
         properties.load(newFileInputStream("D:\\idea_code\\CanalMysqlToOrcal\\lib\\canal"));
            hostname = properties.getProperty("hostname");
            port = Integer.parseInt(properties.getProperty("port"));
            destination = properties.getProperty("destination");
            username = properties.getProperty("username");
            password = properties.getProperty("Cpassword");

        } catch (IOException e) {
   
   
            e.printStackTrace();
        }
    }
    public static CanalConnector getconn(){
   
   
        InetSocketAddress isa= new InetSocketAddress(hostname,port);
        CanalConnector connector = CanalConnectors.newSingleConnector(isa,destination,username,password);
        System.out.println("connection Successfully");
        return connector;
    }
}

Canal的java配置文件:
hostname=192.168.31.1 canal运行的客户端IP
port=11111 canal的conf下的配置文件中配置的port
destination=example canal的conf下的配置文件中配置的destination
username=canal 第四步创建授权的canal用户与密码,与canal的conf下的
配置文件中配置的保持一致
Password=canla

CanalMysqlToOrcal下的代码部分详解



package com.zzw.RunSoft;

import com.alibaba.otter.canal.client.CanalConnector;
import com.alibaba.otter.canal.protocol.Message;
import com.beimingsoft.Conn.CanalConn;
import com.beimingsoft.Conn.OracleConn;
import com.beimingsoft.actiontooracle.ActionToOracle;

import java.sql.Connection;
import java.sql.PreparedStatement;

/**
 * long batchId = message.getId();此参数类似于KAFKA的偏移量,当操作成功时,偏移量增加,否则回滚
 * connector.ack(batchId):提交偏移量
 * connector.rollback(batchId):回滚偏移量
 * tips: batchid=message.getId(),指的是同一个库同一个表的偏移量,例如如果操作的表未在目标库创建,则在创建后消费对应的message.getId()
 * 也就是:每个表都有对应的message.getId(),并且相互之间互不影响
 */
public class MysqlToOracle {
   
   
    public static void main(String[] args)  {
   
   
        //获取oracle连接
        Connection conn = OracleConn.getConnection();
        //创建PreparedStatement
        PreparedStatement ps = null;
        //创建GetTabFileds 对象
        //获取canal的连接
        CanalConnector connector = CanalConn.
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值