详解MySQL实时同步到Oracle解决方案

yizhihongxing

详解MySQL实时同步到Oracle解决方案

前言

当今互联网时代,数据作为数字时代最重要的资产,不论是海量大数据还是小而精细的数据,都非常宝贵。在企业级应用中,多数据库间数据的同步一直是一个难题。本文详细讲解了如何采用MySQL实时同步到Oracle的解决方案。

解决方案

MySQL与Oracle都是业内常用的数据库系统。MySQL的优势在于易安装、易配置、易扩展,而Oracle则更善于处理复杂商业逻辑、拥有更强大的高可用性和高性能等特点。

同步MySQL到Oracle的解决方案,常常采用以下两种方式。

利用第三方工具进行同步

借助第三方工具,利用其提供API或配置文件来实现MySQL数据同步到Oracle。

常用第三方工具:

  • Apache Nifi:Web UI可视化管理,支持多种数据源,支持批量/流式处理;
  • Debezium:开源工具,基于Apache Kafka,支持MySQL、PostgreSQL等数据源多样化(也支持Oracle),支持增量更新;
  • Maxwell:开源工具,依赖于MySQL二进制日志(binlog),支持Kafka和Kinesis等订阅器;

示例:使用Maxwell同步MySQL数据到Oracle。

使用如下命令下载并安装Maxwell。

$ curl -L https://github.com/zendesk/maxwell/releases/download/v1.19.1/maxwell-1.19.1.tar.gz | tar zxvf -

编辑maxwell.properties文件。

# 同步MySQL连接配置
maxwell.host = 127.0.0.1
maxwell.port = 3306
maxwell.user = maxwell
maxwell.password = XXXXX
maxwell.schemas = pcmall

# Oracle连接配置
maxwell.target.type = oracle
maxwell.target.host = 127.0.0.1
maxwell.target.port = 1521
maxwell.target.user = maxwell
maxwell.target.password = XXXXX
maxwell.target.database = maxwell
maxwell.target.sid = sid

# ID字段设置,将MySQL的id字段,在Oracle中命名为syc_id
producer.request.required.acks = 0
producer.request.timeout.ms = 5000
producer.flush.interval.ms = 1000
#bootstrap.servers=localhost:9092
producer.type = sync
producer.kafka.bootstrap.servers = localhost:9092
producer.kafka.topic = maxwell
producer.kafka.compression.type = snappy
producer.kafka.client.id = maxwell-1
producer.kafka.max.request.size = 31457280
#producer.ddl.kafka.bootstrap.servers = localhost:9092
producer.ddl = true
producer.include-tables = taskflow_chokes,taskflows
producer.exclude-tables = amx_task_instances,offline_task_flows
column.includes=.*
# 经过重命名的列到列名映射关系
column.rename.id = sync_id
filter.ddl = true

运行以下命令启动同步服务。

./bin/maxwell --config ./config/config.properties

自定义同步插件

MySQL的binlog技术,可以轻松地获取MySQL中的数据变化,同时维护了数据传输的可靠性和高效性。针对mysql的binlog,社区已经提供很多基于binlog的工具,如Canal、开源的Ali-DataX,业界都有一些企业级同步插件,如阿里云的DTS、腾讯云的DTX、华为云的DMS SQL server等。

基于Canal进行自定义插件同步的好处是:

  • 针对自己的业务可以做定制化开发;
  • 依托于Canal已经做好的binlog解析,不需要重复造轮子;
  • Canal官方提供丰富的插件应用案例,可直接参考学习。

示例:使用Canal+自定义插件同步MySQL数据到Oracle。

首先使用以下命令拉取Canal项目源码。

$ git clone https://github.com/alibaba/canal.git canal
$ cd canal && mvn clean install -DskipTests

编辑Canal的启动脚本bin/startup.sh,将其修改为如下配置

#!/usr/bin/env bash

cd `dirname $0`/..
CURRENT_DIR=`pwd`
MODULES_DIR=${CURRENT_DIR}/modules

# pidfile do not change line
pidfile=${CURRENT_DIR}/logs/canal.pid

# JAVA_OPTS do not change line
JAVA_OPTS="-server -Xms2g -Xmx4g -Djava.awt.headless=true -Dfile.encoding=UTF-8"
JAVA_DEBUG_OPTS=""
if [ "$1" = "debug" ]; then
    JAVA_DEBUG_OPTS=" -Xdebug -Xrunjdwp:transport=dt_socket,address=8787,server=y,suspend=n "
fi
CANAL_CONF_DIR=${CURRENT_DIR}/conf/
if [ -z "$LOG_HOME" ];then
    LOG_HOME=${CURRENT_DIR}/logs
fi

# rm log soft link
if [ -L ${CURRENT_DIR}/logs/canal.log ];then
    rm -f ${CURRENT_DIR}/logs/canal.log
fi

# root 处理
if [ "`whoami`" = "root" ]; then
    echo "canal can't be start as root!"
    echo "canal can't be start as root!" > ${LOG_HOME}/canal.log 2>&1
    exit 1
fi

# set env
if [ -f /etc/profile ];then
    . /etc/profile
fi
. ${CURRENT_DIR}/bin/env.sh

#set JAVA_HOME directory,if JAVA_HOME have set in environment variable,it will use it.
if [ "$JAVA_HOME" = "" ];then
    JAVA_HOME=${HOME}/public/app/jdk1.8.0_121
fi

if [ ! -d "$JAVA_HOME" ]; then
    echo "JAVA_HOME $JAVA_HOME not exists, please set right."
    echo "JAVA_HOME $JAVA_HOME not exists, please set right." > ${LOG_HOME}/canal.log 2>&1
    exit 1
fi

if [ "$1" = "start" ]; then
    if [ -f "${pidfile}" ]; then
            if kill -0 `cat "${pidfile}"` > /dev/null 2>&1; then
                echo $command already running as process `cat "${pidfile}"`.
                echo $command already running as process `cat "${pidfile}"`. > ${LOG_HOME}/canal.log 2>&1
                exit 1
            fi
    fi

    if [ ! -d "$LOG_HOME" ]; then
        mkdir "$LOG_HOME"
    fi

    # check dir ,if not exists create dir
    if [ ! -d "$MODULES_DIR" ]; then
        mkdir "$MODULES_DIR"
    fi

    if [ -z "$CANAL_CONF_DIR" ];then
        CANAL_CONF_DIR=${CURRENT_DIR}/conf/
    fi

    CLASSPATH="."
    for i in "$CANAL_CONF_DIR"/lib/*.jar;do
        CLASSPATH="$CLASSPATH":"$i"
    done

    for i in "$CURRENT_DIR"/lib/*.jar;do
        CLASSPATH="$CLASSPATH":"$i"
    done

    for i in "$MODULES_DIR"/*/lib/*.jar;do
        CLASSPATH="$CLASSPATH":"$i"
    done

    echo "using CLASSPATH:":$CLASSPATH

    export CLASSPATH

    # 启动server
    nohup ${JAVA_HOME}/bin/java ${JAVA_OPTS} ${JAVA_DEBUG_OPTS} \
    -Dlog4j.configurationFile=file:${CANAL_CONF_DIR}/log4j2.xml \
    -Dcanal.instance.global.mode=${mode} \
    -Dcanal.conf.dir=${CANAL_CONF_DIR} \
    -Dcanal.instance.mysql.slaveId=${slaveId} \
    -Dcanal.instance.master.address=${master} \
    -Dcanal.instance.dbUsername=${dbUsername} \
    -Dcanal.instance.dbPassword=${dbPassword} \
    -Dcanal.instance.connectionCharset=${connectionCharset} \
    -Dcanal.instance.tsdb.enable=${tsdb_enable} \
    -Dcanal.instance.gtidon=${gtidon} \
    -Dcanal.instance.filter.regex=${filter_regex} \
    -Dcanal.instance.filter.black.regex=${filter_black_regex} \
    -Dcanal.instance.binlog.sniffer=false \
    com.alibaba.otter.canal.deployer.CanalLauncher > "$LOG_HOME"/canal.log 2>&1 &

    if [ $? -eq 0 ]; then
        if /bin/echo -n $! > "${pidfile}"; then
            sleep 1
            echo "start OK"
            echo "start OK" > ${LOG_HOME}/canal.log 2>&1
        else
            echo "start failed"
            echo "start failed" > ${LOG_HOME}/canal.log 2>&1
            exit 1
        fi
    else
        echo "start failed"
        echo "start failed" > ${LOG_HOME}/canal.log 2>&1
        exit 1
    fi
fi

Canal启动后默认使用文件存储方式存储instance配置信息。但该方式不利于在生产环境中对配置进行修改和维护。因此,选择使用Canal Admin管理Canal实例。

使用以下命令下载并安装Canal Admin。

$ curl -L https://github.com/yinanfang/canal-admin-bin/releases/download/1.0.11/canal.admin-1.0.11.tar.gz | tar zxvf -
$ cd canal.admin-1.0.11/bin/
$ sh startup.sh

在Canal Admin页面创建实例,将MySQL和Oracle的相关配置填写。

创建完成后添加相应的自定义插件进行同步操作。

总结

以上就是解决MySQL实时同步到Oracle的完整攻略。本文介绍了两种常用的解决方案,其中第一种采用第三方工具,通过配置文件或API实现数据同步,第二种则是基于binlog技术,由开发人员自主开发。无论您选择哪种方案,一定要注意保证数据同步的可靠性和安全性,确保数据的准确性和完整性。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:详解MySQL实时同步到Oracle解决方案 - Python技术站

(0)
上一篇 2023年5月19日
下一篇 2023年5月19日

相关文章

  • JDBC数据库的使用操作总结

    JDBC数据库的使用操作总结 什么是JDBC? JDBC(Java Database Connectivity)是Java语言操作数据库的标准规范之一,是一种用于执行SQL语句的Java API,可以访问各种关系型数据库,如Oracle、MySQL、SQL Server等。 使用JDBC可以连接数据库、执行SQL语句、处理结果集等,它能够让Java程序与各种…

    database 2023年5月19日
    00
  • 敏捷框架和极限编程的区别

    敏捷框架和极限编程都是敏捷开发方法中的一种,它们有很多相似之处,但也有一些明显的区别。 敏捷框架 敏捷框架是一个大型的,完整的敏捷方法,它包含了很多个不同的过程和实践。例如Scrum、Kanban、XP等,在敏捷框架中,每个团队都可以选择最适合自己的方法,不同的方法可以有不同的实践,但都遵循了敏捷的原则和价值观,主要体现在以下几个方面: 持续交付 敏捷方法强…

    database 2023年3月27日
    00
  • Go http client 连接池不复用的问题

    Go HTTP client 连接池不复用的问题可能会导致应用程序性能下降,因此需要进行及时的优化和解决。下面将介绍一些应对该问题的具体步骤。 1. 使用全局变量保存HttpClient对象 在已知 HttpClient 对象的场景下,建议将其存储在全局变量中,并在需要使用时从该变量中获取。这样可以确保多次使用同一个 HTTP 域名时复用连接池。以下是示例代…

    database 2023年5月22日
    00
  • MongoDB 使用Skip和limit分页

    当我们需要查询一些结果时,通常情况下,会获得所有的数据然后通过程序筛选出需要的部分,但是在数据量巨大的时候,这样的方法显然会增加很多系统开销,降低系统性能。因此,在这种情况下,我们通常会采用分页查询的方式,每次只获取一定数量的数据。 MongoDB作为一种NoSQL数据库,自然也提供了方便的分页操作,主要依靠skip和limit这两个方法实现。 接下来我将详…

    database 2023年5月21日
    00
  • Mybatis中的动态SQL语句解析

    关于MyBatis中的动态SQL语句解析攻略,主要包括以下内容: 1. 动态SQL语句概述 MyBatis是一种基于Java的持久层框架,采用的是将SQL语句与Java代码进行分离的方法,目的是在业务开发时避免直接操作数据库,从而增加程序的可维护性和可扩展性。在MyBatis中,动态SQL语句是一种能够根据不同条件拼接不同SQL语句的机制,具有很高的灵活性和…

    database 2023年5月22日
    00
  • 使用Oracle跟踪文件的问题详解

    下面是关于使用Oracle跟踪文件的问题详解的完整攻略。 问题背景 在使用Oracle数据库过程中,有时候会遇到一些性能问题或者其它问题,此时可以使用Oracle跟踪文件来帮助我们进行分析和定位问题。但是在实际使用过程中,有很多人并不是很了解如何正确地使用Oracle跟踪文件。接下来我们将详细讲解如何使用Oracle跟踪文件。 解决方案 使用Oracle跟踪…

    database 2023年5月21日
    00
  • Python中经常使用的代码片段

    当在Python中进行编码时,有一些常见的代码片段是经常使用的。下面是一些常见的代码片段以及说明: 1. 处理列表 1.1. 在列表中查找元素 下面的代码段可以在一个列表中查找一个给定的元素,并返回它的下标(如果找到的话): if element in my_list: index = my_list.index(element) 其中 element 是你…

    database 2023年5月22日
    00
  • Linux系统彻底卸载MySQL数据库详解

    Linux系统彻底卸载MySQL数据库详解 如果你曾经在Linux系统上面安装过MySQL数据库,那么在彻底卸载MySQL之前,你需要执行以下步骤: 步骤一:卸载MySQL服务 在Linux系统上,我们可以使用以下命令来卸载MySQL服务: sudo apt-get remove mysql-server 该命令会将MySQL数据库从系统中卸载,并且会删除M…

    database 2023年5月22日
    00
合作推广
合作推广
分享本页
返回顶部