由于甲方限制,不能使用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