kettle完成一個數據庫到另一個數據的整體遷移


原地址 :http://ainidehsj.iteye.com/blog/1735434

 

需求: 
1.你是否遇到了需要將mysql數據庫中的所有表與數據遷移到Oracle。 
2.你是否還在使用kettle重復的畫着:表輸入-表輸出、創建表,而煩惱。 

下面為你實現了一套通用的數據庫遷移流程。 

技術引導: 
實現之初,在kettle提供的例子中找到了一個類似的(samples\jobs\process all tables)。 
通過相關改造,終於達到目標。 

實現過程解剖: 
整套流程分為:2個job,4個trans。 
使用到的Trans插件:表輸入、字段選擇、復制記錄到結果、從結果獲取記錄、設置變量、自定義java腳本、表輸出。 
1.大job。 
 

2.要遷移的源庫表名稱獲取,並設置到結果集,為下面的job使用。 
 

3.配置子job為前面的每一條記錄(即每個表)執行一次該子job 


4.下面是子job。 
 

5.獲取記錄中的表名稱,並設置為到變量。 
 

6.讀取當前表的結果信息,並在目標庫中創建表(這個是難點)。 
 
因為只需要獲取抓取要抽取表的結構信息,故在sql后面加上 where 1=2。 
 
下面代碼是創建目標庫表。 

Java代碼    收藏代碼
  1. public boolean processRow(StepMetaInterface smi, StepDataInterface sdi) throws KettleException  
  2. {  
  3.     // First, get a row from the default input hop  
  4.     //  
  5.     Object[] r = getRow();  
  6.   
  7.     org.pentaho.di.core.database.DatabaseMeta dbmeta = null;  
  8.       
  9.     java.util.List list = getTrans().getRepository().readDatabases();//3.x中獲取資源庫的所有數據庫連接信息用getDatabases();  
  10.       
  11.     if(list != null && !list.isEmpty())  
  12.     {  
  13.         for(int i=0;i<list.size();i++)  
  14.         {  
  15.             dbmeta = (org.pentaho.di.core.database.DatabaseMeta)list.get(i);  
  16.                         //下面是目標庫的數據庫連接,大家可根據需要修改  
  17.             if("mysql_test".equalsIgnoreCase(dbmeta.getName()))  
  18.             {                 
  19.                 break;  
  20.             }  
  21.         }  
  22.     }  
  23.   
  24.     if(dbmeta!=null)  
  25.     {  
  26.         org.pentaho.di.core.database.Database db=new org.pentaho.di.core.database.Database(dbmeta);  
  27.           
  28.         try  
  29.         {  
  30.             db.connect();  
  31.   
  32.             String tablename = getVariable("TABLENAME");  
  33.   
  34.             logBasic("開始創建表:" + tablename);  
  35.               
  36.             if(tablename!=null && tablename.trim().length()>0)  
  37.             {  
  38.                 String sql = db.getDDL(tablename, data.inputRowMeta);//${TABLENAME}  
  39.                               
  40.                 db.execStatement(sql.replace(";", ""));  
  41.   
  42.                 logBasic(sql);  
  43.             }  
  44.         }  
  45.         catch(Exception e)  
  46.         {             
  47.             logError("創建表出現異常",e);  
  48.               
  49.         }finally{  
  50.             db.disconnect();  
  51.         }  
  52.     }  
  53.     return false;  
  54. }  



7.表數據遷移。 
 
 

8.差不多就行了,本人使用mysql到mysql、oracle的測試是沒有問題的不過在測試過程中,發現源表若存在有blob的表,會有問題,可能是由於表輸出沒有指定字段的原因,具體解決辦法,也沒有去多想,以后有時間在完善把。

上面的整套流程的是在kettle4.3下完成的,附件里面可下載完整流程。 

5.x運行到創建表結構步驟報錯,原因data.inputRowMeta為空,因為在第6步 
在sql后面加上 where 1=2,導致表輸入步驟沒有抽取到記錄,5.x里結構也變成了null。 
解決: 
把where 1=2去掉,然后,在表輸入的限制行設置為1,即可,本人親測。

轉載於:https://www.cnblogs.com/feiyuanxing/p/4955808.html


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM