kettle完成一個數據庫到另一個數據的整體遷移


問題:在做不同數據庫的遷移時候,單個的表還很好操作如果是多個數據庫的表呢。如果是一個個的去創建那簡直太麻煩了。
解決辦法: 讀取數據庫中表->創建表->表數據抽取
整個抽取過程包括一個job和兩個trans,先來看看整個job吧:

 

1、首先是數據庫的表名抽取trans:作用是讀取數據庫的表名並以此記錄。

1.1配置表輸入。可以查看到mysql的所有的表名已經獲取。

 

 

 

 

mysql : show  tables    oracle : select table_name from user_tables
1.2配置 字段選擇,把獲取的字段修改成為制定的字段tablename。

 

1.3 復制記錄到結果,直接連接就行。

2表名稱傳給變量

 

2.1從結果獲取記錄

 

2.2設置環境變量

 

3、 獲取對應的表結構

 

3.1其中表輸入

 

3.2java 代碼如下

 

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("mysqldb".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;
}
 4.表數據抽取

 

4.1表輸入

 

4.2表輸出,這里不需要制定數據庫字段。

 

然后運行查看。得到對應的表和數據。

 
————————————————
版權聲明:本文為CSDN博主「小蜜蜂love」的原創文章,遵循CC 4.0 BY-SA版權協議,轉載請附上原文出處鏈接及本聲明。
原文鏈接:https://blog.csdn.net/qq_24388807/article/details/103044645


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM