數(shù)據(jù)庫(kù)信息動(dòng)態(tài)遷移:Pg、Hive、MySQL遷移到MySQL,

最近碰到個(gè)需求:

將其他系統(tǒng)的數(shù)據(jù)庫(kù)信息遷移到本系統(tǒng)的MySQL數(shù)據(jù)庫(kù)【定時(shí)】


image.png

解決邏輯:

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

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容