用Kettle的一套流程完成對整個數據庫遷移

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

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

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

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


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

注意:mysql

針對MySql,以上「表輸入」的SQL語句爲 show tables,可是該語句查詢出的結果包含視圖(View),所以後續步驟向該語句查詢出的表中插入數據時會報錯。sql

若是所要遷移的庫中存在視圖,可使用如下語句來查詢全部須要遷移的表:數據庫

select TABLE_NAME
  from information_schema. TABLES
 where TABLE_SCHEMA = '數據庫名'
   and TABLE_TYPE = 'BASE TABLE'


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


4.下面是子job。


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


6.讀取當前表的結果信息,並在目標庫中建立表( 這個是難點)。

由於只須要獲取抓取要抽取表的結構信息,故在sql後面加上 where 1=2。

下面代碼是建立目標庫表。
oracle

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,便可,本人親測。
測試


Kettle 數據庫遷移示例.rar  115網盤禮包碼:5lbd26pc02pj spa

相關文章
相關標籤/搜索