《用Kettle的一套流程完成对整个数据库迁移》由会员分享,可在线阅读,更多相关《用Kettle的一套流程完成对整个数据库迁移(6页珍藏版)》请在金锄头文库上搜索。
1、用Kettle的一套流程完成对整个数据库迁移需求:1. 你是否遇到了需要将mysql数据库中的所有表与数据迁移到Oracle。2. 你是否还在使用kettle重复的画着:表输入-表输出、创建表,而烦恼。下面为你实现了一套通用的数据库迁移流程。技术引导:实现之初,在kettle提供的例子中找到了一个类似的(samplesjobsprocess all tables)。通过相关改造,终于达到目标。实现过程解剖:整套流程分为:2个job,4个trans。使用到的Trans插件:表输入、字段选择、复制记录到结果、从结果获取记录、设置变量、 自定义java脚本、表输出。1.大 job。STAET表名称获
2、取流程表数据抽取作业Success2.要迁移的源库表名称获取,并设置到结果集,为下面的job使用。3. 配置子job为前面的每一条记录(即每个表)执行一次该子job4.下面是子job。5.获取记录中的表名称,并设置为到变量。6.读取当前表的结果信息,并在目标库中创建表(这个是难点)。表输人创建入库表结构因为只需要获取抓取要抽取表的结构信息,故在sql后面加上where 1=2。下面代码是创建目标库表。Java代码两1.2.3.4.5.6.7.public boolean processRow(StepMetaInterface smi, StepDatalnterface sdi) thro
3、ws KettleException / First, get a row from the default input hop/Object r = getRow();org.pentaho.di.core.database.DatabaseMeta dbmeta = null;8.9.10.11.12.13.14.15.16.17.18.19.20.21.22.23.24.25.26.27.28.29.30.31.32.33.34.35.36.37.38.39.40.41.42.43.44.45.46.47.48.java.util.List list = getTrans().getRe
4、pository().readDatabases();/3.x 中 获取资源库的所有数据库连接信息用getDatabases();if(list != null & !list.isEmpty()for(int i=0;i0)String sql = db.getDDL(tablename, data.inputRowMeta);/$TAB LENAMEdb.execStatement(sql.replace(;, );logBasic(sql);catch(Exception e)logError(创建表出现异常,e);49.finally50.db.disconnect();51.52.5
5、3.return false;54. 7.表数据迁移。步骤名称数据库连接目标稹式目标表表输出|ny5qL_tEmtjJ蹒|螭. |1等浏览祖|HTAELE1TAME夺浏览匝|iooo提交记录数星裁野表忽略插入绪误Mai it opt i on.5 DataTiaze 1 elds lFinills to insert;Tablfi fi eld.巨川Ti f i 1 iEnt er i e_d m:ipjiin氏由于字段是动态的,刮不需要设置 与来源字段名称一样即定匚只有保证入库表字段确定回取消隹)8.差不多就行了,本人使用mysql到mysql、oracle的测试是没有问题的不过在测试过程中, 发现源表若存在有blob的表,会有问题,可能是由于表输出没有指定字段的原因,具体解 决办法,也没有去多想,以后有时间在完善把。上面的整套流程的是在kettle4.3下完成的,附件里面可下载完整流程。5.x运行到创建表结构步骤报错,原因data.inputRowMeta为空,因为在第6步在sql后面加上where 1=2,导致表输入步骤没有抽取到记录,5.x里结构也变成了 null。 解决:把where 1=2去掉,然后,在表输入的限制行设置为1,即可,本人亲测。