原地址 :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。 
 
下面代码是创建目标库表。

  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. org.pentaho.di.core.database.DatabaseMeta dbmeta = null;
  7. java.util.List list = getTrans().getRepository().readDatabases();//3.x中获取资源库的所有数据库连接信息用getDatabases();
  8. if(list != null && !list.isEmpty())
  9. {
  10. for(int i=0;i<list.size();i++)
  11. {
  12. dbmeta = (org.pentaho.di.core.database.DatabaseMeta)list.get(i);
  13. //下面是目标库的数据库连接,大家可根据需要修改
  14. if("mysql_test".equalsIgnoreCase(dbmeta.getName()))
  15. {
  16. break;
  17. }
  18. }
  19. }
  20. if(dbmeta!=null)
  21. {
  22. org.pentaho.di.core.database.Database db=new org.pentaho.di.core.database.Database(dbmeta);
  23. try
  24. {
  25. db.connect();
  26. String tablename = getVariable("TABLENAME");
  27. logBasic("开始创建表:" + tablename);
  28. if(tablename!=null && tablename.trim().length()>0)
  29. {
  30. String sql = db.getDDL(tablename, data.inputRowMeta);//${TABLENAME}
  31. db.execStatement(sql.replace(";", ""));
  32. logBasic(sql);
  33. }
  34. }
  35. catch(Exception e)
  36. {
  37. logError("创建表出现异常",e);
  38. }finally{
  39. db.disconnect();
  40. }
  41. }
  42. return false;
  43. }

7.表数据迁移。 
 

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

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

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

用Kettle的一套流程完成对整个数据库迁移 费元星的更多相关文章

  1. kettle 遇到 解决Incorrect integer value: '' for column 'id' at row 1 完美解决-费元星

    最近自己在测试一个开源的程序,测试中发现.该程序都添加和更新的时候回出现 Incorrect integer value: '' for column 'id' at row 1类是的错误! 后来我自 ...

  2. Kettle实现数据库迁移

    Kettle实现数据库迁移 需求: 做数据仓库时,需要将业务系统CRM抽取到数据仓库的缓冲层,业务系统使用的是SqlServer数据库,数据仓库的缓冲层使用的是mysql数据库,为实现数据库的迁移,即 ...

  3. kettle 通用的数据库迁移流程

    需求: 1.你是否遇到了需要将mysql数据库中的所有表与数据迁移到Oracle. 2.你是否还在使用kettle重复的画着:表输入-表输出.创建表,而烦恼. 下面为你实现了一套通用的数据库迁移流程. ...

  4. java 实现一套流程管理、流转的思路(伪工作流)

    在做某个管理项目时,被要求实现一套流程管理,比如请假的申请审批流程等,在参考了很多资料,并和同事讨论后,得到了一个自主实现的流程管理. 以下提供我的设计思路,知道了思路,实现起来就简单很多了. 首先我 ...

  5. java 实现一套流程管理、流转的思路(伪工作流) 【仅供参考】

    转: java 实现一套流程管理.流转的思路(伪工作流) 在做某个管理项目时,被要求实现一套流程管理,比如请假的申请审批流程等,在参考了很多资料,并和同事讨论后,得到了一个自主实现的流程管理. 以下提 ...

  6. kettle实现数据库迁移----多表复制向导

    kettle实现数据库迁移----多表复制向导 需求: 做数据仓库时,需要将业务系统CRM抽取到数据仓库的缓冲层,业务系统使用的是SqlServer数据库,数据仓库的缓冲层使用的是mysql数据库,为 ...

  7. Oracle 数据库迁移到MySQL (kettle,navicate,sql developer等工具

    Oracle 数据库迁移到MySQL (kettle,navicate,sql developer等工具 1 kettle --第一次使用kettle玩迁移,有什么不足之处和建议,请大家指正和建议. ...

  8. KETTLE实现复杂的流程

    KETTLE是一款将数据从来源端经过抽取(extract).转换(transform).加载(load)至目的端的非常好用的一款ETL工具.学会它,对于跨数据库的表处理或者定时生成文本,excel等常 ...

  9. 不难懂-----git一套流程

    001.初始化仓库,创建git仓库 git init 002.配置个人信息 git config --global user.name <名字> --------->:配置用户名 g ...

随机推荐

  1. 多层感知机MLP的gluon版分类minist

    MLP_Gluon .caret, .dropup > .btn > .caret { border-top-color: #000 !important; } .label { bord ...

  2. Spark Streamming 基本输入流I(-) :File/Hdfs

    Spark Streamming 基本输入流I(-):从文件中进行读取 文件读取1:本地文件读取 这里我只给出实现代码及操作步骤 1.在本地目录下创建目录,这里我们创建目录为~/log/ 2.然后手动 ...

  3. HDU 5723 Abandoned country 【最小生成树&&树上两点期望】

    任意门:http://acm.hdu.edu.cn/showproblem.php?pid=5723 Abandoned country Time Limit: 8000/4000 MS (Java/ ...

  4. Centos安装VMware

    转载:http://www.mamicode.com/info-detail-2171464.html

  5. Python—面向对象02

    1.抽象类与归一化 ​ 接口,即提供给使用者来调用自己功能的方式.方法.入口 为什么要使用接口? 接口提取了一类共同的函数,可以把接口看做一个函数的集合 然后让子类去实现接口中的函数 这么做的意义在于 ...

  6. UGUI防止点击穿透

    if (!IsPointerOverGameObject(Input.mousePosition)) { } public static bool IsPointerOverGameObject(Ve ...

  7. js点赞效果图

    点赞时点赞图标会发生变化. html部分: <img src="img/icon_thumb_up.png" id="imgs1" style=" ...

  8. SecureCRT 个人使用爱好配置。

    1.设置默认启动会话设置. 2.设置执行 ls命令显示文件夹,各种文件,不同的对比颜色 2.1 设置前: 2.2 设置后: 3. 如果出现会话框中文乱码 ,设置以下选项 4 . 更改 命令 ls -a ...

  9. ABAP术语-Purchase Order

    Purchase Order 原文:http://www.cnblogs.com/qiangsheng/archive/2008/03/07/1094717.html Request or instr ...

  10. WebMagic 启动例子报错

    报错内容: Exception in thread "main" java.lang.NoClassDefFoundError: org/apache/http/conn/Http ...