1. 程式人生 > >用Kettle的一套流程完成對整個資料庫遷移

用Kettle的一套流程完成對整個資料庫遷移

需求: 
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.     org.pentaho.di.core.database.DatabaseMeta dbmeta = null;  
  7.     java.util.List list = getTrans().getRepository().readDatabases();//3.x中獲取資源庫的所有資料庫連線資訊用getDatabases();  
  8.     if(list != null && !list.isEmpty())  
  9.     {  
  10.         for(int i=0;i<list.size();i++)  
  11.         {  
  12.             dbmeta = (org.pentaho.di.core.database.DatabaseMeta)list.get(i);  
  13.                         //下面是目標庫的資料庫連線,大家可根據需要修改  
  14.             if("mysql_test".equalsIgnoreCase(dbmeta.getName()))  
  15.             {                 
  16.                 break;  
  17.             }  
  18.         }  
  19.     }  
  20.     if(dbmeta!=null)  
  21.     {  
  22.         org.pentaho.di.core.database.Database db=new org.pentaho.di.core.database.Database(dbmeta);  
  23.         try  
  24.         {  
  25.             db.connect();  
  26.             String tablename = getVariable("TABLENAME");  
  27.             logBasic("開始建立表:" + tablename);  
  28.             if(tablename!=null && tablename.trim().length()>0)  
  29.             {  
  30.                 String sql = db.getDDL(tablename, data.inputRowMeta);//${TABLENAME}  
  31.                 db.execStatement(sql.replace(";"""));  
  32.                 logBasic(sql);  
  33.             }  
  34.         }  
  35.         catch(Exception e)  
  36.         {             
  37.             logError("建立表出現異常",e);  
  38.         }finally{  
  39.             db.disconnect();  
  40.         }  
  41.     }  
  42.     return false;  
  43. }  


7.表資料遷移。 
 
 

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

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

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