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

52 篇文章 0 订阅
38 篇文章 1 订阅

需求:
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. 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. }
[java]  view plain  copy
  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下完成的,附件里面可下载完整流程。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值