zoukankan      html  css  js  c++  java
  • 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,即可,本人亲测。

    转载于:https://www.cnblogs.com/feiyuanxing/p/4955808.html

  • 相关阅读:
    在C#代码中应用Log4Net(二)典型的使用方式
    在C#代码中应用Log4Net(一)简单使用Log4Net
    Windows Azure Active Directory (2) Windows Azure AD基础
    Windows Azure Virtual Network (6) 设置Azure Virtual Machine固定公网IP (Virtual IP Address, VIP) (1)
    Windows Azure Active Directory (1) 前言
    Azure China (6) SAP 应用在华登陆 Windows Azure 公有云
    Microsoft Azure News(3) Azure新的基本实例上线 (Basic Virtual Machine)
    Microsoft Azure News(2) 在Microsoft Azure上运行SAP应用程序
    Microsoft Azure News(1) 新的数据中心Japan East, Japan West and Brazil South
    Windows Azure HandBook (2) Azure China提供的服务
  • 原文地址:https://www.cnblogs.com/purple5252/p/14636414.html
Copyright © 2011-2022 走看看