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