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