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

本文涉及的产品
云数据库 RDS MySQL,集群系列 2核4GB
推荐场景:
搭建个人博客
RDS MySQL Serverless 基础系列,0.5-2RCU 50GB
云数据库 RDS MySQL,高可用系列 2核4GB
简介:

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

相关实践学习
如何在云端创建MySQL数据库
开始实验后,系统会自动创建一台自建MySQL的 源数据库 ECS 实例和一台 目标数据库 RDS。
全面了解阿里云能为你做什么
阿里云在全球各地部署高效节能的绿色数据中心,利用清洁计算为万物互联的新世界提供源源不断的能源动力,目前开服的区域包括中国(华北、华东、华南、香港)、新加坡、美国(美东、美西)、欧洲、中东、澳大利亚、日本。目前阿里云的产品涵盖弹性计算、数据库、存储与CDN、分析与搜索、云通信、网络、管理与监控、应用服务、互联网中间件、移动服务、视频服务等。通过本课程,来了解阿里云能够为你的业务带来哪些帮助 &nbsp; &nbsp; 相关的阿里云产品:云服务器ECS 云服务器 ECS(Elastic Compute Service)是一种弹性可伸缩的计算服务,助您降低 IT 成本,提升运维效率,使您更专注于核心业务创新。产品详情: https://www.aliyun.com/product/ecs
目录
相关文章
|
3月前
|
弹性计算 关系型数据库 数据库
手把手带你从自建 MySQL 迁移到云数据库,一步就能脱胎换骨
阿里云瑶池数据库来开课啦!自建数据库迁移至云数据库 RDS原来只要一步操作就能搞定!点击阅读原文完成实验就可获得一本日历哦~
|
3月前
|
关系型数据库 MySQL 数据库
|
3月前
|
关系型数据库 MySQL 数据库
RDS MySQL灾备服务协同解决方案构建问题之数据库备份数据的云上云下迁移如何解决
RDS MySQL灾备服务协同解决方案构建问题之数据库备份数据的云上云下迁移如何解决
|
21天前
|
算法 大数据 数据库
云计算与大数据平台的数据库迁移与同步
本文详细介绍了云计算与大数据平台的数据库迁移与同步的核心概念、算法原理、具体操作步骤、数学模型公式、代码实例及未来发展趋势与挑战。涵盖全量与增量迁移、一致性与异步复制等内容,旨在帮助读者全面了解并应对相关技术挑战。
32 3
|
2月前
|
存储 SQL 关系型数据库
一篇文章搞懂MySQL的分库分表,从拆分场景、目标评估、拆分方案、不停机迁移、一致性补偿等方面详细阐述MySQL数据库的分库分表方案
MySQL如何进行分库分表、数据迁移?从相关概念、使用场景、拆分方式、分表字段选择、数据一致性校验等角度阐述MySQL数据库的分库分表方案。
391 15
一篇文章搞懂MySQL的分库分表,从拆分场景、目标评估、拆分方案、不停机迁移、一致性补偿等方面详细阐述MySQL数据库的分库分表方案
|
2月前
|
SQL Java 数据库连接
数据库迁移不再难:Flyway 与 Liquibase 大比拼,哪个才是你的真命天子?
【9月更文挑战第3天】数据库迁移在软件开发中至关重要,尤其在使用 ORM 框架如 Hibernate 时。为确保部署时能顺利应用最新的数据库变更,开发者常使用自动化工具。Flyway 和 Liquibase 是当前流行的两种选择,均能有效管理数据库版本控制。Flyway 采用 SQL 脚本表示变更,简单易用;Liquibase 支持多种脚本格式,功能更强大,适合复杂项目。本文将对比这两种工具的特点,并通过示例展示各自的优缺点,帮助开发者根据项目需求做出合适的选择。
455 1
|
2月前
|
SQL 关系型数据库 MySQL
Python操作pymysql数据库的流程与技巧
在现代软件开发中,Python作为一门高效且易于学习的编程语言,广泛应用于各种场景,其中包括数据库操作。**PyMySQL** 是一个流行的Python数据库接口,用于连接和操作MySQL数据库。它提供了一种简便的方法来执行SQL语句、处理数据和管理数据库事务。以下是使用PyMySQL操作MySQL数据库的流程与技巧,旨在为开发者提供一个清晰、实用的指南。
54 0
|
3月前
|
JSON NoSQL Ubuntu
在Ubuntu 14.04上如何备份、恢复和迁移MongoDB数据库
在Ubuntu 14.04上如何备份、恢复和迁移MongoDB数据库
88 1
|
3月前
|
API Java 开发框架
【从零到精通】如何用Play Framework快速构建RESTful API?看完这篇你就懂了!
【8月更文挑战第31天】《Play Framework快速入门:从零开始构建RESTful API》介绍了如何使用高性能Web开发框架Play Framework构建简单的RESTful API。从环境搭建到项目创建,再到实现用户列表的增删查功能,本文档详细指导每个步骤,并解释核心概念。适合初学者快速上手。首先确保已安装JDK和sbt,然后通过sbt创建Play项目,接着定义控制器、模型及路由,最后运行应用进行测试。通过本教程,你将掌握构建RESTful API的基础知识,为进一步学习Play Framework打下坚实基础。
50 0
|
3月前
|
SQL Oracle 关系型数据库
Entity Framework Core 实现多数据库支持超厉害!配置连接、迁移与事务,开启多元数据库之旅!
【8月更文挑战第31天】在现代软件开发中,为了满足不同业务需求及环境要求,常需支持多个数据库系统。Entity Framework Core(EF Core)作为一款强大的对象关系映射(ORM)框架,通过数据库提供程序与多种数据库如SQL Server、MySQL、PostgreSQL、Oracle等交互。开发者可通过安装相应NuGet包并配置`DbContextOptionsBuilder`来指定不同数据库连接,从而实现多数据库支持。
182 0