• 用Kettle的一套流程完成对整个数据库迁移 费元星


    原地址 :http://ainidehsj.iteye.com/blog/1735434

    需求: 
    1.你是否遇到了需要将mysql数据库中的所有表与数据迁移到Oracle。 
    2.你是否还在使用kettle重复的画着:表输入-表输出、创建表,而烦恼。 

    下面为你实现了一套通用的数据库迁移流程。 

    技术引导: 
    实现之初,在kettle提供的例子中找到了一个类似的(samplesjobsprocess all tables)。 
    通过相关改造,终于达到目标。 

    实现过程解剖: 
    整套流程分为:2个job,4个trans。 
    使用到的Trans插件:表输入、字段选择、复制记录到结果、从结果获取记录、设置变量、自定义java脚本、表输出。 
    1.大job。 
     

    2.要迁移的源库表名称获取,并设置到结果集,为下面的job使用。 
     

    3.配置子job为前面的每一条记录(即每个表)执行一次该子job 


    4.下面是子job。 
     

    5.获取记录中的表名称,并设置为到变量。 
     

    6.读取当前表的结果信息,并在目标库中创建表(这个是难点)。 
     
    因为只需要获取抓取要抽取表的结构信息,故在sql后面加上 where 1=2。 
     
    下面代码是创建目标库表。 

    Java代码  收藏代码
    1. public boolean processRow(StepMetaInterface smi, StepDataInterface sdi) throws KettleException  
    2. {  
    3.     // First, get a row from the default input hop  
    4.     //  
    5.     Object[] r = getRow();  
    6.   
    7.     org.pentaho.di.core.database.DatabaseMeta dbmeta = null;  
    8.       
    9.     java.util.List list = getTrans().getRepository().readDatabases();//3.x中获取资源库的所有数据库连接信息用getDatabases();  
    10.       
    11.     if(list != null && !list.isEmpty())  
    12.     {  
    13.         for(int i=0;i<list.size();i++)  
    14.         {  
    15.             dbmeta = (org.pentaho.di.core.database.DatabaseMeta)list.get(i);  
    16.                         //下面是目标库的数据库连接,大家可根据需要修改  
    17.             if("mysql_test".equalsIgnoreCase(dbmeta.getName()))  
    18.             {                 
    19.                 break;  
    20.             }  
    21.         }  
    22.     }  
    23.   
    24.     if(dbmeta!=null)  
    25.     {  
    26.         org.pentaho.di.core.database.Database db=new org.pentaho.di.core.database.Database(dbmeta);  
    27.           
    28.         try  
    29.         {  
    30.             db.connect();  
    31.   
    32.             String tablename = getVariable("TABLENAME");  
    33.   
    34.             logBasic("开始创建表:" + tablename);  
    35.               
    36.             if(tablename!=null && tablename.trim().length()>0)  
    37.             {  
    38.                 String sql = db.getDDL(tablename, data.inputRowMeta);//${TABLENAME}  
    39.                               
    40.                 db.execStatement(sql.replace(";", ""));  
    41.   
    42.                 logBasic(sql);  
    43.             }  
    44.         }  
    45.         catch(Exception e)  
    46.         {             
    47.             logError("创建表出现异常",e);  
    48.               
    49.         }finally{  
    50.             db.disconnect();  
    51.         }  
    52.     }  
    53.     return false;  
    54. }  



    7.表数据迁移。 
     
     

    8.差不多就行了,本人使用mysql到mysql、oracle的测试是没有问题的不过在测试过程中,发现源表若存在有blob的表,会有问题,可能是由于表输出没有指定字段的原因,具体解决办法,也没有去多想,以后有时间在完善把。

    上面的整套流程的是在kettle4.3下完成的,附件里面可下载完整流程。 

    5.x运行到创建表结构步骤报错,原因data.inputRowMeta为空,因为在第6步 
    在sql后面加上 where 1=2,导致表输入步骤没有抽取到记录,5.x里结构也变成了null。 
    解决: 
    把where 1=2去掉,然后,在表输入的限制行设置为1,即可,本人亲测。

  • 相关阅读:
    Enterprise Library 企业库 V4.1
    跨域实现IFRAME自适应高度
    微软企业库4.1学习笔记(二)各功能之间的依赖关系以及对象创建
    微软企业库4.1学习笔记(三)企业库迁移和并行使用,以及企业库的扩展
    微软企业库4.1学习笔记(五)对象创建和依赖注入方法
    判断 iframe 是否加载完成的完美方法
    对JavaScript调用堆栈和setTimeout用法的深入研究
    工作流技术杂谈
    企业流程管理平台V2.0介绍(.NET平台下的工作流)
    c#操作oracle lob字段[转自 芽芽的回收站]
  • 原文地址:https://www.cnblogs.com/feiyuanxing/p/4955808.html
Copyright © 2020-2023  润新知