msyql数据库数据迁移oracle数据库

由于甲方限制,不能使用Navicat、SqlDevelop等工具,尝试了sqlldr后无果,无奈采用本文方法,主要是基于项目当中的内容,本身可能不具有代表性,大家可以借鉴使用。

1、首先必须保证mysql、oracle数据库表结构一致,如果不一致的情况下,则可能会出现相关问题,当然顺序也至关重要。
原因:字段顺序如果不一样的话,那么插入数据到oracle的时候,指定字段名称即可,但是会有一个问题,就是mysql当中用了oracle关键字的字段,则指定名称的时候,会报关键字错误。如下图:候补。
2、采用的多环境打包服务,使用sh脚本执行指定环境启动迁移数据的服务。
3、代码采用的gitee网站托管,代码地址:https://gitee.com/yarcl/mysql2oracle
4、项目结构如下:
在这里插入图片描述

a、贴出run.sh脚本:

#!/usr/bin/env bash

binDir="$( cd "$( dirname "${BASH_SOURCE[0]}" )" && pwd )"
cd ${binDir} && cd ../
curDir=`pwd`

if [ ! -n "$PRO_PATH" ]; then
    export PRO_PATH="${curDir}"
fi

profiles=$2
rootDir=${curDir}
libPath=${rootDir}/lib
sourcePath=${rootDir}/conf
logPath=${rootDir}/logs

export PRO_PATH="${curDir}"
export ModuleName="haizhi"

if [ ! -d ${logPath} ]; then
    mkdir -p ${logPath}
fi
packageName=${curDir##*/}

start() {
    echo "start ${ModuleName}..."
    java -Dloader.path=${libPath},${sourcePath}  -jar  ${libPath}/${packageName}.jar ${profiles}
}

start

说明:
如果出现如下问题:图候补。
则vim该文件、执行如下命令:

set ff=unix

b、贴出Utils代码:

package com.mysql2oracle;

import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.sql.*;
import java.util.Properties;

/**
 * Hello world!
 *
 */
public class Utils
{
    public static String mysql_jdbc_url;
    public static String user;
    public static String password;

    public static String jdbc_url;
    public static String jdbc_user;
    public static String jdbc_password;

    public void startProcess(String tableName) throws Exception {
        // 创建到两个数据库的连接
        Class.forName("org.gjt.mm.mysql.Driver");
        Connection connSource = DriverManager.getConnection(mysql_jdbc_url, user, password);

        Class.forName("oracle.jdbc.driver.OracleDriver");
        Connection connDest = DriverManager.getConnection(jdbc_url, jdbc_user, jdbc_password);

        // 打开源数据库中相关表
        StringBuilder sb = new StringBuilder();
        if(!"tag_category".equals(tableName)) {
            sb.append("insert into " + tableName + "(");
        } else {
            sb.append("insert into " + tableName);
        }
        Statement stmt = connSource.createStatement();
        ResultSet rs = stmt.executeQuery("select * from " + tableName);

        // 显示共计有多少条记录
        rs.last();
        System.out.println(tableName + "表共计有:" + rs.getRow() + "条记录,正在处理......");
        rs.beforeFirst();

        // 先计算目标数据库的PreparedStatement的SQL语句
        ResultSetMetaData rsmd = rs.getMetaData();
        int numberOfColumns = rsmd.getColumnCount();
        if(!"tag_category".equals(tableName)) {
            for (int i = 1; i <= numberOfColumns; i++) {
                sb.append(rsmd.getColumnName(i) + ",");
            }
            sb.deleteCharAt(sb.length() - 1);
            sb.append(")values(");
        } else {
            sb.append(" values(");
        }
        for (int i = 1; i <= numberOfColumns; i++) {
            sb.append("?,");
        }
        sb.deleteCharAt(sb.length() - 1);
        sb.append(")");
        System.out.println(sb.toString());

        // 给PreparedStatement赋值,然后更新;如果是大数量的情况,可以考虑Batch处理。因为这里的数据量小,直接单条更新了。
        PreparedStatement pstmt = connDest.prepareStatement(sb.toString());
        while (rs.next()) {
            for (int i = 1; i <= numberOfColumns; i++) {
                pstmt.setObject(i, rs.getObject(i));
            }

            pstmt.executeUpdate();
        }
        System.out.print("---更新完成---");

        // 关闭各资源
        rs.close();
        stmt.close();
        pstmt.close();

        connSource.close();
        connDest.close();
    }

    public static void main( String[] args ) throws Exception {
        if(args.length != 1) {
            System.out.println("参数不正确");
            return;
        }
        Utils.loadProperties(args[0]);
        Utils ins = new Utils();
        String[] tableNames = new String[]{"tag", "tag_schema"};
        for(String tableName : tableNames) {
            ins.startProcess(tableName);
        }

    }

    public static void loadProperties(String profile) {
        System.out.println("开始load properties.....");
        InputStream is = Utils.class.getClassLoader()
                .getResourceAsStream("jdbc-" + profile + ".properties");
        Properties properties = new Properties();
        try {
            properties.load(new InputStreamReader(is));
        } catch (IOException e) {
            e.printStackTrace();
        }
        System.out.println("读取properties profile配置成功: "
                + properties.getProperty("profile"));
        mysql_jdbc_url = properties.getProperty("mysql.url");
        user = properties.getProperty("mysql.user");
        password = properties.getProperty("mysql.pwd");
        jdbc_url = properties.getProperty("oracle.url");
        jdbc_user = properties.getProperty("oracle.user");
        jdbc_password = properties.getProperty("oracle.pwd");

        System.out.println("结束load properties.....");
    }
}

c、build中是编译后的代码包:
主要使用的haizhi-1.0-SNAPSHOT
其中bin是run.sh
conf是配置文件,依据生产上进行调整即可。
lib是Utils打成的jar和依赖的jar包。

d、其他代码请查看gitee代码地址。

e、本文参考博文:https://www.cnblogs.com/telwanggs/p/7263653.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值