最近碰到個(gè)需求:
將其他系統(tǒng)的數(shù)據(jù)庫(kù)信息遷移到本系統(tǒng)的MySQL數(shù)據(jù)庫(kù)【定時(shí)】

解決邏輯:
1、獲取到各類(lèi)型數(shù)據(jù)庫(kù)的建表語(yǔ)句,將其轉(zhuǎn)換成MySQL建表語(yǔ)句,在MySQL中建表
2、讀取各數(shù)據(jù)庫(kù)的數(shù)據(jù)信息
3、INSERT 進(jìn)入目標(biāo)系統(tǒng)的數(shù)據(jù)庫(kù)
實(shí)際操作
1、前端頁(yè)面進(jìn)行數(shù)據(jù)庫(kù)信息的配置和需要讀取的表信息配置,或者頁(yè)面配置了部分,通過(guò)其他手段讀取到其他信息
必傳信息:host、port、db_type、schema、database。
其他信息:【定時(shí)訪問(wèn)周期】,用戶(hù)名、密碼最好也在前臺(tái)配置【不過(guò)這邊是寫(xiě)在文件中讀取的】,配置需要拉取數(shù)據(jù)的表。
2、使用原始的JDBC方式和JDBCTemplate去進(jìn)行操作。
當(dāng)我們拿到上述的信息之后即可獲取該數(shù)據(jù)庫(kù)的數(shù)據(jù)庫(kù)連接。
3、在上一步中獲取到了數(shù)據(jù)庫(kù)連接。接下來(lái)要分不同類(lèi)型數(shù)據(jù)庫(kù)進(jìn)行處理。
MySQL【這里可能會(huì)涉及到版本問(wèn)題,主要是utf8mb4的問(wèn)題,寫(xiě)文時(shí)未考慮】:
由于本次源數(shù)據(jù)庫(kù)中有MySQL,而目標(biāo)數(shù)據(jù)庫(kù)就是MySQL。同時(shí)MySQL有這樣的語(yǔ)句來(lái)獲取建表語(yǔ)句。
show create table TABLE_NAME
當(dāng)獲取到這個(gè)語(yǔ)句后,取出該建表語(yǔ)句,然后在目標(biāo)庫(kù)中執(zhí)行即可。
其他【Pg、Hive】:
使用JDBC去讀取元數(shù)據(jù)信息,來(lái)獲取各字段的名稱(chēng)、類(lèi)型、注釋....還有表的注釋信息。
之后使用字符串去進(jìn)行拼接MySQL建表語(yǔ)句?!局饕枰⒁獾氖亲侄晤?lèi)型的轉(zhuǎn)換】
代碼部分
<p>
這個(gè)代碼只是展示下我的執(zhí)行順序,JdbcVO就是前端所傳的一些數(shù)據(jù)庫(kù)信息,我這邊的需求我需要轉(zhuǎn)一下這個(gè)數(shù)據(jù)
<p>
@Resource
DatabaseUtils databaseUtils;
/**
* 調(diào)用jdbcjob
* <p>
* 這個(gè)代碼只是展示下我的執(zhí)行順序,JdbcVO就是前端所傳的一些數(shù)據(jù)庫(kù)信息,我這邊的需求我需要轉(zhuǎn)一下這個(gè)數(shù)據(jù)
* <p>
* @param sysJob 系統(tǒng)工作
* @throws Exception 異常
*/
public void invokeJDBCJob(JdbcVO jdbcVO) throws Exception{
// 1、創(chuàng)建JDBC基礎(chǔ)連接信息對(duì)象
JDBCInfo jdbcInfo = databaseUtils.createJdbcInfo(jdbcVO);
jdbcInfo.setUser(username);
jdbcInfo.setPassword(password);
// 2、判斷表是否已在本系統(tǒng)庫(kù)存在
if (!databaseUtils.isExistTable(jdbcVO.getTableName())) {
// 3.1 生成本系統(tǒng)MySQL庫(kù)建表語(yǔ)句
String ddl = databaseUtils.getDdl(jdbcInfo);
System.out.println("————————開(kāi)始建表————————");
System.out.println(ddl);
// 3.2 建表
databaseUtils.createTable(ddl);
System.out.println("————————建表完成—————————");
System.out.println("————————開(kāi)始接入數(shù)據(jù)——————");
// 3.3 第一次建表,全量遷移數(shù)據(jù)
databaseUtils.transferAllData(jdbcInfo);
System.out.println("—————————接入完成—————————");
}else {
log.info("{}", "表存在進(jìn)行更新");
databaseUtils.transferUpdate(jdbcInfo, jdbcVO);
}
}
DataBaseUtils行數(shù)太多,放到GitHub上
代碼地址:數(shù)據(jù)庫(kù)遷移工具:https://github.com/201811050890/database-tranfer-easy-use.git