实现oracle数据批量同步到mysql(一)

发布时间:2024-04-01 09:01

实现oracle数据批量定时同步到mysql(一)

一、需求背景

整体项目为数据统计类系统,源数据库为oracle,考虑到法律风险和成本控制,需要落库为mysql,并实现定时更新功能。

二、具体实操

多的不说,具体看操作过程。
这个过程中,找了很多种实现方式和工具,目前能基本实现项目的需求,不过便利程度上还是需要斟酌。

1、主要使用到的工具

1)navicat15(这个版本能控制单次执行插入语句的数量,分批执行)
2)kettle(开源的etl工具)
3)结合些部分自己处理的工具和代码

2、实践过程

首先用navicat的数据传输功能进行异构数据库的传输
1、先配置oracle和mysql数据库的连接
mysql比较简单,oracle的话主要要下载对应操作系统(一般是x64)的oracle client客户端,把oci.dll这个文件添加进来,选择工具—选项。
\"实现oracle数据批量同步到mysql(一)_第1张图片\"
好了后,选择数据传输,选择连接,这里也可以选择导出为文件(sql文件)
\"实现oracle数据批量同步到mysql(一)_第2张图片\"
然后点击选项,这里有几个地方需要的
1)创建表去掉索引,外键这些
2)使用扩展插入,这样速度会比较快(但是如果全量插入,数据量比较大的话会有问题),这里我一开始操作,数据量几十万的表,一次性扩展插入,导致内存溢出,一开始是8g内存,后来加了内存到32g,就没出问题了。这里选择高级,单次1000次(这个数值可以改),但是如果表比较多的话一个个改也是个麻烦事,so后来发现有个配置文件,可以手动批量修改好,看图
\"实现oracle数据批量同步到mysql(一)_第3张图片\"

\"实现oracle数据批量同步到mysql(一)_第4张图片\"
\"实现oracle数据批量同步到mysql(一)_第5张图片\"
这里是保存的配置文件路径
\"实现oracle数据批量同步到mysql(一)_第6张图片\"

找到s.ndtfpremium文件打开看
\"实现oracle数据批量同步到mysql(一)_第7张图片\"

可以发现每个表的设置就是这里的一个列表的一个元素
\"实现oracle数据批量同步到mysql(一)_第8张图片\"

主要的不同也就是如下框出来的地方,我这里用excel和程序进行批量处理的
\"实现oracle数据批量同步到mysql(一)_第9张图片\"
先查出oracle所有表名

SELECT table_name  from all_tab_comments
where table_type=\'TABLE\'
and owner=\'CSRC\'
order by table_name

\"实现oracle数据批量同步到mysql(一)_第10张图片\"
复制所有表名到excel中,然后给定函数

=CONCATENATE(\"\"\"\"&A1&\"\"\"\",\",\")

\"实现oracle数据批量同步到mysql(一)_第11张图片\"
,在用java程序处理这些表名,生成列表内容,复制s.ndtfpremium
的头部和尾部,形成这些表配置文件

import java.io.File;
import java.io.FileWriter;
import java.io.IOException;

/**
 * @Description: TODO
 * @author: wangchi
 * @date: 2022年05月31日 15:17
 */
public class Test1 {
    public static void main(String[] args) throws IOException {
        String[] s1 = {
                \"RMI_LOG_201804\",
                \"RMI_LOG_201805\"
        };

        fun1(s1);  //拼接字符串
    }


public static void fun1(String[] s1) throws IOException {
        StringBuilder s2=new StringBuilder();

        for (int i = 0; i <s1.length ; i++) {
            String s3=\"{\\n\" +
                    \"        \\\"Name\\\": \\\"\";

            String s4=\"\\\",\\n\" +
                    \"        \\\"ObjectType\\\": \\\"TableNormal_ORA\\\",\\n\" +
                    \"        \\\"Advanced\\\": {\\n\" +
                    \"          \\\"TargetTableName\\\": \\\"\";

            String s5=\"\\\",\\n\" +
                    \"          \\\"UseAllFields\\\": true,\\n\" +
                    \"          \\\"FieldMappings\\\": [],\\n\" +
                    \"          \\\"UseAllRows\\\": true,\\n\" +
                    \"          \\\"EnableNumberOfRowsPerBatch\\\": true,\\n\" +
                    \"          \\\"NumberOfRowsPerBatch\\\": 100,\\n\" +
                    \"          \\\"RecordsetConditions\\\": [],\\n\" +
                    \"          \\\"UseTransactionForEachRecordset\\\": true\\n\" +
                    \"        }\\n\" +
                    \"      },\";

            s2.append(s3);
            s2.append(s1[i]);
            s2.append(s4);
            s2.append(s1[i]);
            s2.append(s5);
            s2.append(\"\\n\");

        }

        System.out.println(s2);  // 输出拼接后的结果


    fileWriterMethod(\"D:\\\\bigdata_work\\\\javaWorkspace\\\\jeecgboot\\\\批量拼接字符串_navicat配置\\\\src\\\\file/s.ndtfpremium\",s2.toString());  //将文件流重写到路径文件中

    }


    public static void fileWriterMethod(String filepath, String content) throws IOException {
        // 文件不存在则新建
        File file = new File(filepath);
        if (!file.exists()) {
            file.createNewFile();
        }

        try (FileWriter fileWriter = new FileWriter(filepath)) {
            fileWriter.append(content);
        }
    }

    }


\"实现oracle数据批量同步到mysql(一)_第12张图片\"
点击下一步开始就ok了,不过在实际运行的过程中,发现仍然会导致内存很高,跑了一段时间后,我想可能还是跟navicat本身的机制有关,可以分多次处理(比如500张表分50张表跑一次批),这样可能会好点

三、最终效果

基本的表结构和数据都能正常拿到,只不过部分类型的字段会不太美观,比如主键的number类型转化,但是也不影响开发使用就是
\"实现oracle数据批量同步到mysql(一)_第13张图片\"
\"实现oracle数据批量同步到mysql(一)_第14张图片\"
目前已有的条件下,只做到这样的异构数据批量同步,大家有好的实现思路和方法,也欢迎一起探讨!
后续会继续看下其他方式的更新

ItVuer - 免责声明 - 关于我们 - 联系我们

本网站信息来源于互联网,如有侵权请联系:561261067@qq.com

桂ICP备16001015号