kettle7.0下实现数据库整体迁移

本文详细介绍了一种从Oracle到MySQL的数据库迁移方法,包括使用软件自带工具和自定义迁移流程,涉及表结构复制、数据抽取等关键步骤。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

一、采用软件自带方式

1.新建一个job,创建两个DB连接:source、target(源数据库和目标数据库连接),在菜单中找到【复制多表向导】,点击进行相关操作:


2.选择源数据库和目标数据库


3.选择所需迁移的表


4.编辑生成的job文件名:qy.kjb,和文件目录,编辑好后【Finish】


5.运行qy.kjb,可在test2数据库中看到成功生成迁移来的表。



二、自定义数据库迁移(oracle >> mysql)

1.创建一个主job:数据库迁移.kjb

2.创建转换:获取表名称.ktr

1) 创建一个DB连接:oraclesource(源数据库连接)

2)  表输入

注:oracle中获取表名SQL:select * from user_tables,mysql中为:show tables

3) 字段选择

     点击【获取选择的字段】,添加新的字段,选中"TABLE_NAME"并改名成“tablename”,将其余字段删除

 4)添加一个【复制记录到结果字符串】

3.新建一个job:抽取表.kjb

1) 新建一个DB连接:mysqltarget

4. 新建一个转换:表名称变量设置.ktr

1) 添加一个【从结果获取记录】

2)添加一个【设置变量】

5.添加一个【检查表是否存在】

6.新建一个转换:创建目标库表结构.ktr

1) 新建两个DB连接:oraclesource,mysqltarget

    创建过程同上

2)添加一个【表输入】

3)添加一个【Java代码】,代码如下:


 
 
  1. public boolean processRow(StepMetaInterface smi, StepDataInterface sdi) throws KettleException
  2. {
  3. Object[] r = getRow();
  4. //本地连接获取数据库元数据
  5. //org.pentaho.di.core.database.DatabaseMeta dbmeta = getTransMeta().findDatabase("target");
  6. //资源库连接获取数据库元数据
  7. org.pentaho.di.core.database.DatabaseMeta dbmeta = null;
  8. java.util.List list = getTrans().getRepository().readDatabases();
  9. if(list != null && !list.isEmpty())
  10. {
  11. for( int i= 0;i<list.size();i++)
  12. {
  13. dbmeta = (org.pentaho.di.core.database.DatabaseMeta)list.get(i);
  14. if( "target".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. //在日志中显示创建表名
  28. logBasic( "开始创建表:" + tablename);
  29. if(tablename!= null && tablename.trim().length()> 0)
  30. {
  31. //获取表名称和输入行数据
  32. String sql = db.getDDLCreationTable(tablename ,getInputRowMeta());
  33. db.execStatement(sql.replace( ";", ""));
  34. //在日志中显示sql语句
  35. logBasic(sql);
  36. }
  37. }
  38. catch(Exception e)
  39. {
  40. logError( "创建表出现异常",e);
  41. } finally{
  42. db.disconnect();
  43. }
  44. }
  45. return false;
  46. }
7. 新建一个转换:表抽取.ktr

1)新建两个DB连接:oraclesource,mysqltarget。

     创建过程同上

2) 添加一个【表输入】

3)添加一个表输出

8.运行数据库迁移.kjb

在mysql数据库test2中成功生成迁移的所有表


注:1.此方案是在资源库环境下创建并运行的,需要登陆资源库。

        2.此方案下载地址:点击打开链接

存在问题:当源数据库中存在空表时,会报以下错误:

2017/04/19 14:57:05 - 创建表结构.0 - 开始创建表:KFYQGX
2017/04/19 14:57:05 - 创建表结构.0 - ERROR (version 7.0.0.0-25, build 1 from 2016-11-05 15.35.36 by buildguy) : 创建表出现异常
2017/04/19 14:57:05 - 创建表结构.0 - ERROR (version 7.0.0.0-25, build 1 from 2016-11-05 15.35.36 by buildguy) : java.lang.NullPointerException
2017/04/19 14:57:05 - 创建表结构.0 -  at org.pentaho.di.core.database.DatabaseMeta.quoteReservedWords(DatabaseMeta.java:2352)
2017/04/19 14:57:05 - 创建表结构.0 -  at org.pentaho.di.core.database.Database.getDDLCreationTable(Database.java:4441)
2017/04/19 14:57:05 - 创建表结构.0 -  at Processor.processRow(Processor.java:45)
2017/04/19 14:57:05 - 创建表结构.0 -  at org.pentaho.di.trans.steps.userdefinedjavaclass.UserDefinedJavaClass.processRow(UserDefinedJavaClass.java:1018)
2017/04/19 14:57:05 - 创建表结构.0 -  at org.pentaho.di.trans.step.RunThread.run(RunThread.java:62)
2017/04/19 14:57:05 - 创建表结构.0 -  at java.lang.Thread.run(Thread.java:745)


此问题还未解决,要是哪位仁兄解决了还望告知一下,共同探讨下


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值