當前位置:名人名言大全網 - 端午節短信 - kettle數據導出到另壹個數據庫時,必須先建立表結構嗎?

kettle數據導出到另壹個數據庫時,必須先建立表結構嗎?

需求:

1.妳遇到過需要將mysql數據庫中的所有表和數據遷移到Oracle的情況嗎?

2.妳還在用kettle反復畫:表輸入-表輸出,創建表,發愁嗎?

這是壹個通用的數據庫遷移過程。

技術指導:

在實現之初,在kettle提供的示例中發現了壹個類似的示例(samples\jobs\process all tables)。

通過相關改造,最終達到目的。

實施流程剖析:

整個過程分為兩個作業和四個運輸。

使用的Trans插件:表格輸入、字段選擇、將記錄復制到結果、從結果中獲取記錄、設置變量、定制java腳本、表格輸出。

1.大工程。

2.獲取要遷移的源庫表的名稱,並將其設置為以下作業的結果集。

3.將子作業配置為對每個先前的記錄(即每個表)執行壹次子作業。

4.以下是子作業。

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

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

因為只需要獲取要抽取的表的結構信息,其中1=2加在sql之後。

以下代碼用於創建目標庫表。

Java代碼

public boolean processRow(step meta interface SMI,StepDataInterface sdi)引發KettleException

{

//首先,從默認輸入躍點獲取壹行

//

object[]r = getRow();

org . pentaho . di . core . database . database meta db meta = null;

java.util.List list = getTrans()。getRepository()。read databases();//用getDatabases()獲取//3.x中資源庫的所有數據庫連接信息;

如果(列表!= null & amp& amp!list.isEmpty())

{

for(int I = 0;我& ltlist . size();i++)

{

db meta =(org . pentaho . di . core . database . database meta)list . get(I);

//下面是目標庫的數據庫連接,可以根據需要修改。

if("mysql_test "。equalsIgnoreCase(db meta . getname()))

{

打破;

}

}

}

if(dbmeta!=空)

{

org . pentaho . di . core . database . database db = new org . pentaho . di . core . database . database(db meta);

嘗試

{

db . connect();

string TABLENAME = get variable(" TABLENAME ");

LogBasic("開始創建表:"+tablename);

if(tablename!= null & amp& amptablename.trim()。length()>;0)

{

String sql = db.getDDL(tablename,data . input rowmeta);//${TABLENAME}

db . exec語句(SQL . replace(";", ""));

log basic(SQL);

}

}

捕捉(例外e)

{

LogError("創建表時出現異常",e);

}最後{

db . disconnect();

}

}

返回false

}

7.表數據遷移。

8.差不多夠了。我用mysql測試mysql和oracle都沒有問題。但是在測試過程中,我發現如果源表中有blob的表,就會出現問題,可能是因為表輸出中沒有指定字段。具體解決方案沒想太多,以後有時間再完善。

以上整個過程都是在kettle4.3下完成的,完整的過程可以在附件中下載。下載地址如下:

/blog/1735434