文档章节

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

hymanPeng
 hymanPeng
发布于 2015/12/16 17:58
字数 725
阅读 43
收藏 1

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

kettle 

需求:
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代码  收藏代码

  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,即可,本人亲测。
 


本文转载自:http://ainidehsj.iteye.com/blog/1735434

hymanPeng
粉丝 1
博文 13
码字总数 1889
作品 0
深圳
架构师
私信 提问
Kettle实现数据库迁移

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

Zero零_度
2016/11/16
40
0
用Kettle的一套流程完成对整个数据库迁移

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

如月王子
2014/09/17
0
5
ETL利器Kettle实战应用解析系列一【Kettle使用介绍】

一、ETL利器Kettle实战应用解析系列一【Kettle使用介绍】 二、ETL利器Kettle实战应用解析系列二 【应用场景和实战DEMO下载】 三、ETL利器Kettle实战应用解析系列三 【ETL后台进程执行配置方式...

李丁玲
2016/03/04
133
0
Kettle 与 Talend Open Studio 的 ETL 比较

Pentaho Data Integration (Kettle)是Pentaho生态系统中默认的ETL工具。通过非常直观的图形化编辑器(Spoon),您可以定义以XML格式储存的流程。在Kettle运行过程中,这些流程会以不同的方法...

ychenETL
2011/06/13
0
0
Win7下Kettle-7.0安装部署

1、Kettle概念 Kettle是一款国外开源的ETL工具,纯java编写,可以在Window、Linux、Unix上运行,绿色无需安装,数据抽取高效稳定。 Kettle 中文名称叫水壶,该项目的主程序员MATT 希望把各种...

zisheng_wang_data
2017/03/10
0
0

没有更多内容

加载失败,请刷新页面

加载更多

Command模式

https://www.cnblogs.com/devinzhang/archive/2012/01/06/2315235.html

南桥北木
44分钟前
1
0
由于PostgreSQL9.x二进制输出格式默认值改变导致的读取图片错误

今天从社区邮件看到一个这样的问题,感觉很有意思,在这分享给大家~具体如下: 问题现象: 作者有一个很老的Java应用,当时后端采用的PostgreSQL数据库版本为8.x,该系统除了正常的数据增删...

闻术苑
今天
2
0
导入sql时出现Invalid default value for 'create_time'报错处理方法

当运行SQL会出现:[Err] 1067 - Invalid default value for 'create_time',是因为Mysql版本不同,如果版本不 < 5.6请去的话报错的处理方法如下: 方法 :alter table table_name modify cre......

writeademo
今天
1
0
对ssm(spring,springmvc,mybatis)的了解总结

ssm框架现在是java web开发的三个主流框架 ,其实严格来算只算是两个框架,因为springmvc属于spring框架 ,是spring的一个mvc子框架 那么我们下面就来了解一下三大框架把 一 .Spring spring...

咸鱼-李y
今天
2
0
聊聊Elasticsearch的FsProbe

序 本文主要研究一下Elasticsearch的FsProbe FsProbe elasticsearch-7.0.1/server/src/main/java/org/elasticsearch/monitor/fs/FsProbe.java public class FsProbe { private static f......

go4it
今天
2
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部