ETL工具实现不同数据库迁移

    xiaoxiao2021-04-12  26

    本人转载于  http://ainidehsj.iteye.com/blog/1735434

    需求: 

    1.你是否遇到了需要将mysql数据库中的所有表与数据迁移到Oracle。  2.你是否还在使用kettle重复的画着:表输入-表输出、创建表,而烦恼。  下面为你实现了一套通用的数据库迁移流程。  技术引导:  实现之初,在kettle提供的例子中找到了一个类似的(samples\jobs\process all tables)。  通过相关改造,终于达到目标。  实现过程解剖:  整套流程分为:2个job,4个trans。  使用到的Trans插件:表输入、字段选择、复制记录到结果、从结果获取记录、设置变量、自定义java脚本、表输出。  1.大job。    2.要迁移的源库表名称获取,并设置到结果集,为下面的job使用。    3.配置子job为前面的每一条记录(即每个表)执行一次该子job  4.下面是子job。    5.获取记录中的表名称,并设置为到变量。    6.读取当前表的结果信息,并在目标库中创建表( 这个是难点 )。    因为只需要获取抓取要抽取表的结构信息,故在sql后面加上 where 1=2。    下面代码是创建目标库表。  Java代码   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("mysql_test".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;   }   7.表数据迁移。      8.差不多就行了,本人使用mysql到mysql、oracle的测试是没有问题的不过在测试过程中,发现源表若存在有blob的表,会有问题,可能是由于表输出没有指定字段的原因,具体解决办法,也没有去多想,以后有时间在完善把。 上面的整套流程的是在kettle4.3下完成的,附件里面可下载完整流程。  5.x运行到创建表结构步骤报错,原因data.inputRowMeta为空,因为在第6步  在sql后面加上 where 1=2,导致表输入步骤没有抽取到记录,5.x里结构也变成了null。  解决:  把where 1=2去掉,然后,在表输入的限制行设置为1,即可,本人亲测。
    转载请注明原文地址: https://ju.6miu.com/read-668244.html

    最新回复(0)