最近碰到个需求:
将其他系统的数据库信息迁移到本系统的MySQL数据库【定时】
解决逻辑:
1、获取到各类型数据库的建表语句,将其转换成MySQL建表语句,在MySQL中建表
2、读取各数据库的数据信息
3、INSERT 进入目标系统的数据库
实际操作
1、前端页面进行数据库信息的配置和需要读取的表信息配置,或者页面配置了部分,通过其他手段读取到其他信息
必传信息:host、port、db_type、schema、database。
其他信息:【定时访问周期】,用户名、密码最好也在前台配置【不过这边是写在文件中读取的】,配置需要拉取数据的表。
2、使用原始的JDBC方式和JDBCTemplate去进行操作。
当我们拿到上述的信息之后即可获取该数据库的数据库连接。
3、在上一步中获取到了数据库连接。接下来要分不同类型数据库进行处理。
MySQL【这里可能会涉及到版本问题,主要是utf8mb4的问题,写文时未考虑】:
由于本次源数据库中有MySQL,而目标数据库就是MySQL。同时MySQL有这样的语句来获取建表语句。
show create table TABLE_NAME
当获取到这个语句后,取出该建表语句,然后在目标库中执行即可。
其他【Pg、Hive】:
使用JDBC去读取元数据信息,来获取各字段的名称、类型、注释....还有表的注释信息。
之后使用字符串去进行拼接MySQL建表语句。【主要需要注意的是字段类型的转换】
代码部分
<p>
这个代码只是展示下我的执行顺序,JdbcVO就是前端所传的一些数据库信息,我这边的需求我需要转一下这个数据
<p>
@Resource
DatabaseUtils databaseUtils;
/**
* 调用jdbcjob
* <p>
* 这个代码只是展示下我的执行顺序,JdbcVO就是前端所传的一些数据库信息,我这边的需求我需要转一下这个数据
* <p>
* @param sysJob 系统工作
* @throws Exception 异常
*/
public void invokeJDBCJob(JdbcVO jdbcVO) throws Exception{
// 1、创建JDBC基础连接信息对象
JDBCInfo jdbcInfo = databaseUtils.createJdbcInfo(jdbcVO);
jdbcInfo.setUser(username);
jdbcInfo.setPassword(password);
// 2、判断表是否已在本系统库存在
if (!databaseUtils.isExistTable(jdbcVO.getTableName())) {
// 3.1 生成本系统MySQL库建表语句
String ddl = databaseUtils.getDdl(jdbcInfo);
System.out.println("————————开始建表————————");
System.out.println(ddl);
// 3.2 建表
databaseUtils.createTable(ddl);
System.out.println("————————建表完成—————————");
System.out.println("————————开始接入数据——————");
// 3.3 第一次建表,全量迁移数据
databaseUtils.transferAllData(jdbcInfo);
System.out.println("—————————接入完成—————————");
}else {
log.info("{}", "表存在进行更新");
databaseUtils.transferUpdate(jdbcInfo, jdbcVO);
}
}
DataBaseUtils行数太多,放到GitHub上
代码地址:数据库迁移工具:https://github.com/201811050890/database-tranfer-easy-use.git