用Kettle的一套流程完成对整个数据库迁移 费元星
原地址 :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。
下面代码是创建目标库表。
- 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,即可,本人亲测。
用Kettle的一套流程完成对整个数据库迁移 费元星的更多相关文章
- kettle 遇到 解决Incorrect integer value: '' for column 'id' at row 1 完美解决-费元星
最近自己在测试一个开源的程序,测试中发现.该程序都添加和更新的时候回出现 Incorrect integer value: '' for column 'id' at row 1类是的错误! 后来我自 ...
- Kettle实现数据库迁移
Kettle实现数据库迁移 需求: 做数据仓库时,需要将业务系统CRM抽取到数据仓库的缓冲层,业务系统使用的是SqlServer数据库,数据仓库的缓冲层使用的是mysql数据库,为实现数据库的迁移,即 ...
- kettle 通用的数据库迁移流程
需求: 1.你是否遇到了需要将mysql数据库中的所有表与数据迁移到Oracle. 2.你是否还在使用kettle重复的画着:表输入-表输出.创建表,而烦恼. 下面为你实现了一套通用的数据库迁移流程. ...
- java 实现一套流程管理、流转的思路(伪工作流)
在做某个管理项目时,被要求实现一套流程管理,比如请假的申请审批流程等,在参考了很多资料,并和同事讨论后,得到了一个自主实现的流程管理. 以下提供我的设计思路,知道了思路,实现起来就简单很多了. 首先我 ...
- java 实现一套流程管理、流转的思路(伪工作流) 【仅供参考】
转: java 实现一套流程管理.流转的思路(伪工作流) 在做某个管理项目时,被要求实现一套流程管理,比如请假的申请审批流程等,在参考了很多资料,并和同事讨论后,得到了一个自主实现的流程管理. 以下提 ...
- kettle实现数据库迁移----多表复制向导
kettle实现数据库迁移----多表复制向导 需求: 做数据仓库时,需要将业务系统CRM抽取到数据仓库的缓冲层,业务系统使用的是SqlServer数据库,数据仓库的缓冲层使用的是mysql数据库,为 ...
- Oracle 数据库迁移到MySQL (kettle,navicate,sql developer等工具
Oracle 数据库迁移到MySQL (kettle,navicate,sql developer等工具 1 kettle --第一次使用kettle玩迁移,有什么不足之处和建议,请大家指正和建议. ...
- KETTLE实现复杂的流程
KETTLE是一款将数据从来源端经过抽取(extract).转换(transform).加载(load)至目的端的非常好用的一款ETL工具.学会它,对于跨数据库的表处理或者定时生成文本,excel等常 ...
- 不难懂-----git一套流程
001.初始化仓库,创建git仓库 git init 002.配置个人信息 git config --global user.name <名字> --------->:配置用户名 g ...
随机推荐
- 【[SCOI2012]喵星球上的点名】
好题啊 \(SA+ST\text{表}+\text{莫队}\) 我们先强行把所有的串连起来,串与串之间插入特殊字符,姓和名之间也插入特殊字符 之后跑一遍\(SA\),求出\(sa\)和\(het\) ...
- c#类的练习
类部分练习题 - dijiaxing1234的博客 - CSDN博客 https://blog.csdn.net/dijiaxing1234/article/details/81230811 真好啊
- 远程桌面连接(连接服务器)报错Oracle修正
解决方案: 开始——运行——gpedit.msc——计算机配置——管理模版——系统——凭据分配——加密oracle修正——易受攻击 ok
- 【luogu P2746 [USACO5.3]校园网Network of Schools】 题解
题目链接:https://www.luogu.org/problemnew/show/P2812 注意:判断出入度是否为0的时候枚举只需到颜色的数量. 坑点:当只有一个强连通分量时,不需要再添加新边. ...
- java.lang.IllegalStateException: Circular dependencies cannot exist in RelativeLayout
<TextView android:layout_width="fill_parent" android:layout_height="wrap_content&q ...
- WebApiConfig设置返回json并且对于get,post可以重名
webapi2默认返回的是xml格式的,并且一个控制器中的方法名不能重名,列如:一个get,一个post这个也是不允许的,这些我们都可以进行设置. 下面设置:返回json格式,并且一个控制器中的方法可 ...
- 与select2有关的知识点总结
1.多选下拉框设置提示 var datass = [ { id:0, text: '你好' }, { id:1, text: '好久不见' }, { id:2, text: '好想你' } ]; va ...
- C#添加二维码带加密带logo
#region 生成QR码,加密与logo在此处修改 public static void CreateQr(string strQrContent, DataTable myTable) { Qr ...
- iOS之ShareSDK各社交平台申请AppKey的网址及申请流程汇总
平台 开放平台地址 APPkey 申请流程 新浪微博 http://open.weibo.com http://bbs.mob.com/thread-89-1-4.html 新浪微博开放平台接入tip ...
- js实现图片点击弹出放大效果
点击图片,显示蒙板,放大图片的简单案例 HTML代码: <div> <img height=" src="https://img-blog.csdn.net/20 ...