原地址 :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。
下面代碼是創建目標庫表。
- public boolean processRow(StepMetaInterface smi, StepDataInterface sdi) throws KettleException
- {
- // First, get a row from the default input hop
- //
- Object[] r = getRow();
- org.pentaho.di.core.database.DatabaseMeta dbmeta = null;
- java.util.List list = getTrans().getRepository().readDatabases();//3.x中獲取資源庫的所有數據庫連接信息用getDatabases();
- if(list != null && !list.isEmpty())
- {
- for(int i=0;i<list.size();i++)
- {
- dbmeta = (org.pentaho.di.core.database.DatabaseMeta)list.get(i);
- //下面是目標庫的數據庫連接,大家可根據需要修改
- if("mysql_test".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.getDDL(tablename, data.inputRowMeta);//${TABLENAME}
- db.execStatement(sql.replace(";", ""));
- logBasic(sql);
- }
- }
- catch(Exception e)
- {
- logError("創建表出現異常",e);
- }finally{
- db.disconnect();
- }
- }
- return false;
- }
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