kettle7.0下實現資料庫整體遷移
一、採用軟體自帶方式
1.新建一個job,建立兩個DB連線:source、target(源資料庫和目標資料庫連線),在選單中找到【複製多表嚮導】,點選進行相關操作:
2.選擇源資料庫和目標資料庫
3.選擇所需遷移的表
4.編輯生成的job檔名:qy.kjb,和檔案目錄,編輯好後【Finish】
5.執行qy.kjb,可在test2資料庫中看到成功生成遷移來的表。
二、自定義資料庫遷移(oracle >> mysql)
1.建立一個主job:資料庫遷移.kjb
2.建立轉換:獲取表名稱.ktr
1) 建立一個DB連線:oraclesource(源資料庫連線)
2) 表輸入
注:oracle中獲取表名SQL:select * from user_tables,mysql中為:show tables
3) 欄位選擇
點選【獲取選擇的欄位】,新增新的欄位,選中"TABLE_NAME"並改名成“tablename”,將其餘欄位刪除
4)新增一個【複製記錄到結果字串】
3.新建一個job:抽取表.kjb
1) 新建一個DB連線:mysqltarget
4. 新建一個轉換:表名稱變數設定.ktr
1) 新增一個【從結果獲取記錄】
2)新增一個【設定變數】
5.新增一個【檢查表是否存在】
6.新建一個轉換:建立目標庫表結構.ktr
1) 新建兩個DB連線:oraclesource,mysqltarget
建立過程同上
2)新增一個【表輸入】
3)新增一個【Java程式碼】,程式碼如下:
7. 新建一個轉換:表抽取.ktrpublic boolean processRow(StepMetaInterface smi, StepDataInterface sdi) throws KettleException { Object[] r = getRow(); //本地連接獲取資料庫元資料 //org.pentaho.di.core.database.DatabaseMeta dbmeta = getTransMeta().findDatabase("target"); //資源庫連接獲取資料庫元資料 org.pentaho.di.core.database.DatabaseMeta dbmeta = null; java.util.List list = getTrans().getRepository().readDatabases(); if(list != null && !list.isEmpty()) { for(int i=0;i<list.size();i++) { dbmeta = (org.pentaho.di.core.database.DatabaseMeta)list.get(i); if("target".equalsIgnoreCase(dbmeta.getName())) { break; } } } if(dbmeta!=null) { org.pentaho.di.core.database.Database db=new org.pentaho.di.core.database.Database(dbmeta); try { db.connect(); String tablename = getVariable("TABLENAME"); //在日誌中顯示建立表名 logBasic("開始建立表:" + tablename); if(tablename!=null && tablename.trim().length()>0) { //獲取表名稱和輸入行資料 String sql = db.getDDLCreationTable(tablename ,getInputRowMeta()); db.execStatement(sql.replace(";", "")); //在日誌中顯示sql語句 logBasic(sql); } } catch(Exception e) { logError("建立表出現異常",e); }finally{ db.disconnect(); } } return false; }
1)新建兩個DB連線:oraclesource,mysqltarget。
建立過程同上
2) 新增一個【表輸入】
3)新增一個表輸出
8.執行資料庫遷移.kjb
在mysql資料庫test2中成功生成遷移的所有表
注:1.此方案是在資源庫環境下建立並執行的,需要登陸資源庫。
2.此方案下載地址:點選開啟連結
存在問題:當源資料庫中存在空表時,會報以下錯誤:
2017/04/19 14:57:05 - 建立表結構.0 - 開始建立表:KFYQGX
2017/04/19 14:57:05 - 建立表結構.0 - ERROR (version 7.0.0.0-25, build 1 from 2016-11-05 15.35.36 by buildguy) : 建立表出現異常
2017/04/19 14:57:05 - 建立表結構.0 - ERROR (version 7.0.0.0-25, build 1 from 2016-11-05 15.35.36 by buildguy) : java.lang.NullPointerException
2017/04/19 14:57:05 - 建立表結構.0 - at org.pentaho.di.core.database.DatabaseMeta.quoteReservedWords(DatabaseMeta.java:2352)
2017/04/19 14:57:05 - 建立表結構.0 - at org.pentaho.di.core.database.Database.getDDLCreationTable(Database.java:4441)
2017/04/19 14:57:05 - 建立表結構.0 - at Processor.processRow(Processor.java:45)
2017/04/19 14:57:05 - 建立表結構.0 - at org.pentaho.di.trans.steps.userdefinedjavaclass.UserDefinedJavaClass.processRow(UserDefinedJavaClass.java:1018)
2017/04/19 14:57:05 - 建立表結構.0 - at org.pentaho.di.trans.step.RunThread.run(RunThread.java:62)
2017/04/19 14:57:05 - 建立表結構.0 - at java.lang.Thread.run(Thread.java:745)
此問題還未解決,要是哪位仁兄解決了還望告知一下,共同探討下