1. 程式人生 > >kettle7.0下實現資料庫整體遷移

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程式碼】,程式碼如下:

public 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;
}
7. 新建一個轉換:表抽取.ktr

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)

此問題還未解決,要是哪位仁兄解決了還望告知一下,共同探討下