数据迁移实战:基于Kettle的Mysql到DB2的数据迁移

From:https://my.oschina.net/simpleton/blog/525675

一、什么是ETL

ETL,是英文 Extract-Transform-Load 的缩写,用来描述将数据从来源端经过抽取(extract)、转换(transform)、加载(load)至目的端的过程。ETL一词较常用在数据仓库,但其对象并不限于数据仓库。

二、Kettle简单说明

Kettle是一款国外开源的ETL工具,纯java编写,可以在Window、Linux、Unix上运行,数据抽取高效稳定。

三、需求

1、 Mysql 5.X数据迁移到 DB2 8.X

2、 主键自增改成32位UUID

三、准备工作

1、 源数据库:Mysql 5.6

2、 目标数据库:DB2 8.X

3、 数据迁移工具:Kettle6.0.0.0-353

四、实战开始

1、说明一下省略掉的步骤

在开始使用Kettle前,我使用了PowerDesigner18.6建立数据模型,然后导出对应数据库的建表脚本,这里我导出了DB2 8.X的建表脚本,然后首先在DB2中将目标表建立好。其实在Kettle中也可以在执行过程中来建立表,我也是初学Kettle,所以选择了一种相对简单的方式来操作,毕竟关注重点在于数据迁移这方面上。

2、安装JDK

因为Kettle是纯JAVA写的,所以依赖JDK,至于JDK的安装不是本文的重点,请读者自行百度完成。

3、 安装Kettle

下载pdi-ce-6.0.0.0-353.zip,我已经上传至百度云,下载地址:http://pan.baidu.com/s/1jGjMoXw

Kettle是绿色免安装的,将下载的压缩文件解压,找到程序启动文件Spoon.bat(Linux的Spoon.sh),双击则可以启动。不过在这一步操作之前,还有重要的一步需要做,就是拷贝我们的数据库驱动JAR包到指定目录。我是windows 7 x64,所以我将mysql和DB2对应的驱动包拷贝到了data-integration\libswt\win64目录下,因为拷贝进去之后,需要重启程序才能生效,所以建议解压后,首先拷贝驱动JAR包到指定目录。

然后点击Spoon.bat,启动应用程序。

程序启动完成后,进入到欢迎页面,在页面左边有一棵树,在“主对象数”下分别是“转换”和“作业”两个功能节点,另外还有“核心对象”菜单,这个是用得比较多的,稍后会谈到。

至此,Kettle的安装已经完成,下面就进入到实战的重要环节了。

3、开始使用Kettle做数据迁移

这里我不讲太多理论知识,毕竟我对Kettle也是初探,所以本文重点还是放在如何操作Kettle完成一次数据迁移。

第一步:建立转换(Transformation)

双击Spoon.bat启动Kettle,点击界面左上角的“文件” – “新建” – “转换”,并保存为demo.ktr。

第二步:添加“表输入”

在左侧的“核心对象”下面找到“输入 – 表输入”,将其拖入到右侧编辑区域中。

第三步:编辑“表输入”

双击编辑区域的“表输入”,进入编辑界面。

在弹出窗口中,可以编辑信息,点击“新建”

在弹出窗口中录入源数据库(mysql)的服务器信息,点击测试按钮,测试连接是否成功。

注意:如果前面没有将数据库的JAR包拷贝到指定文件目录下,这里会抛出异常说找不到驱动程序。只需要拷贝JAR包到指定文件(根据系统不同而有所不同,请看Kettle的安装部分),然后重启程序,就可以解决该问题。

测试连接成功,点击“确定”,然后在“数据库链接”处选择我们新建的连接。

点击“获取SQL查询语句”

在弹出窗口中选择要迁移的数据表,每次只能操作一个表

选择“是”

点击“确定”,源数据则配置好了。

第四步:添加和编辑 “字段选择”(可选)

如果你的数据类型在迁移过程中会发生变化,那么需要添加“字段选择”步骤。比如我在迁移过程中,需要将自增的整形字段改成32位的UUID,至于为什么会出现这样的需求,是因为我在迁移过程中发现如果在目标数据库中设置主键自增,那么数据迁移的过程中,无法插入主键,只能由数据库去操作自增,这样的话,会导致我原来的关联数据无法完成迁移。从这次的教训中得到经验,以后数据库主键设计时,会发生主外键关联的,尽量设计成UUID。

在“核心对象 – 转换”下找到“字段选择”,将其拖入到右侧编辑区域。

按住“shift”,然后从“表输入”到“字段选择”,拖一条线

双击“字段选择”,进入编辑界面

选择“元数据”

点击“获取改变的字段”

在这个地方,你可以修改源数据表字段,用以匹配目标数据表。我在这里需要将原来的主外键都改成32位的UUID,因为我已经事先在目标数据表(DB2)定义了主外键为VARCHAR(32),所以这里我需要修改源数据表的主外键为String,长度不用管。

点击确定

第五步:添加“表输出”

在“核心对象 – 输出”下面选择“表输出”,拖到右侧编辑区域

按住“shift”从“字段选择”往“表输出”拖一个箭头,并选择“主输出步骤”(拖线过程中,鼠标点击“表输出”的时候会出现该选项)。

双击“表输出”,选择“新建”

和前面类似,在弹出窗口中输入数据库的地址信息,点击测试

测试连接成功,点击确定,在“数据库链接”处选择新建的DB2的目标数据库连接

选择“目标模式”(这里我不太懂,总之DB2的话,出现的是schema),然后选择“目标表”,点击确定

勾选“指定数据库字段”,然后点击“输入字段映射”

在弹出窗口中,选择源数据表字段和目标数据表字段的匹配方式,点击“猜一猜”可以一键分配,但是它的分配规则我不了解,可能根据名字的相似度吧,如果名字相同或者相似,可以使用,很方便。

点击确定。

第六步:“校验这个转换”

点击“校验这个转换”,可以校验刚才我们定义的这个转换是否有问题。

如果没有问题,则表示我们定义的这个转换可以执行

第七步:“运行这个转换”

点击“运行这个转换”,则开始执行数据迁移了,可以在窗口下面看到执行日志,如果没有错误,那么表示我们完成了一个表的数据迁移工作。

批量操作

如果还有更多的表,可以在这一个转换中定义多个上图所示的“表输入”-“字段选择”-“表输出”步骤,一次批量执行。但是这样的执行是不保证执行顺序的,如果有主外键关联的话,这样批量执行会出问题。所以可以将有主外键关联的表的数据迁移工作做成多个“转换”,然后通过作业将他们串起来,这样就能够保证执行顺序了,至于作业的建立,本文不再累述,以后有时间再开一篇文章单独写,读者也可以自己找资料看看,简单的操作的话,一看就会了。

大概的作业我用图展示一下,详细的我就不写了。

时间: 2024-12-24 17:09:19

数据迁移实战:基于Kettle的Mysql到DB2的数据迁移的相关文章

sqoop数据迁移(基于Hadoop和关系数据库服务器之间传送数据)

1:sqoop的概述: (1):sqoop是apache旗下一款“Hadoop和关系数据库服务器之间传送数据”的工具.(2):导入数据:MySQL,Oracle导入数据到Hadoop的HDFS.HIVE.HBASE等数据存储系统:(3):导出数据:从Hadoop的文件系统中导出数据到关系数据库 (4):工作机制: 将导入或导出命令翻译成mapreduce程序来实现: 在翻译出的mapreduce中主要是对inputformat和outputformat进行定制: (5):Sqoop的原理: Sq

用Nodejs+Express搭建web,nodejs路由和Ajax传数据并返回状态,nodejs+mysql通过ajax获取数据并写入数据库

小编自学Nodejs,看了好多文章发现都不全,而且好多都是一模一样的 当然了,这只是基础的demo,经供参考,但是相信也会有收获 今天的内容是用Nodejs+Express搭建基本的web,然后呢nodejs路由和Ajax之间的数据传输,也就是表单提交,然后在用nodejs把数据写入mysql数据库 用到的东西比较多,但是还是很有趣的 1.安装node.js 安装node.js,直接去官网下载然后根据需求点击下一步就好了 Node.js安装包及源码下载地址为:https://nodejs.org

Spark大型项目实战:电商用户行为分析大数据平台

本项目主要讲解了一套应用于互联网电商企业中,使用Java.Spark等技术开发的大数据统计分析平台,对电商网站的各种用户行为(访问行为.页面跳转行为.购物行为.广告点击行为等)进行复杂的分析.用统计分析出来的数据,辅助公司中的PM(产品经理).数据分析师以及管理人员分析现有产品的情况,并根据用户行为分析结果持续改进产品的设计,以及调整公司的战略和业务.最终达到用大数据技术来帮助提升公司的业绩.营业额以及市场占有率的目标. 1.课程研发环境 开发工具: Eclipse Linux:CentOS 6

PHP MySQL 插入多条数据

PHP MySQL 插入多条数据 使用 MySQLi 和 PDO 向 MySQL 插入多条数据 mysqli_multi_query() 函数可用来执行多条SQL语句. 以下实例向 "MyGuests" 表添加了三条新的记录: 实例 (MySQLi - 面向对象) <?php$servername = "localhost";$username = "username";$password = "password";$d

基于radius的Mysql计费系统数据迁移

radius计费系统向蓝海计费系统数据迁移技术总结 本文仅供参考,在实际环境中测试成功.欢迎大家提出问题. 1.    首先要有一个清晰的思路和明确的目标. 本次计费迁移主要将老计费radius management系统的用户,迁移到蓝海计费系统.由于老计费系统和蓝海计费有相似性.同时具有一定的差异性.所以要修正老计费系统数据格式符合蓝海计费的要求(蓝海计费已经提供了数据导入的标准格式).这样才能将老计费平安的导入蓝海系统,顺利进行计费系统迁移. 2.    准备工作 2-1首先要收集新老计费系

Python3网络爬虫实战-32、数据存储:关系型数据库存储:MySQL

关系型数据库基于关系模型的数据库,而关系模型是通过二维表来保存的,所以它的存储方式就是行列组成的表,每一列是一个字段,每一行是一条记录.表可以看作是某个实体的集合,而实体之间存在联系,这就需要表与表之间的关联关系来体现,如主键外键的关联关系,多个表组成一个数据库,也就是关系型数据库. 关系型数据库有多种,如 SQLite.MySQL.Oracle.SQL Server.DB2等等. 在本节我们主要介绍 Python3 下 MySQL 的存储. 在 Python2 中,连接 MySQL 的库大多是

MySQL 分区表原理及数据备份转移实战

1.分区表含义 分区表定义指根据可以设置为任意大小的规则,跨文件系统分配单个表的多个部分.实际上,表的不同部分在不同的位置被存储为单独的表.用户所选择的.实现数据分割的规则被称为分区函数,这在MySQL中它可以是模数,或者是简单的匹配一个连续的数值区间或数值列表,或者是一个内部HASH函数,或一个线性HASH函数. 分表与分区的区别在于:分区从逻辑上来讲只有一张表,而分表则是将一张表分解成多张表. 2.分区表优点 1)分区表更容易维护.对于那些已经失去保存意义的数据,通常可以通过删除与那些数据有

从MySQL到Redis 提升数据迁移的效率

场景是从MySQL中将数据导入到Redis的Hash结构中.当然,最直接的做法就是遍历MySQL数据,一条一条写入到Redis中.这样可能没什么错,但是速度会非常慢.而如果能够使MySQL的查询输出数据直接能够与Redis命令行的输入数据协议相吻合,可能就省事多了.根据测试800w的数据迁移,时间从90分钟缩短到2分钟.具体案例如下:MySQL数据表结构: CREATE TABLE events_all_time (id int(11) unsigned NOT NULL AUTO_INCREM

走在大数据的边缘 基于Spark的机器学习-智能客户系统项目实战(项目实战)

38套大数据,云计算,架构,数据分析师,Hadoop,Spark,Storm,Kafka,人工智能,机器学习,深度学习,项目实战视频教程 视频课程包含: 38套大数据和人工智能精品高级课包含:大数据,云计算,架构,数据挖掘实战,实时推荐系统实战,电视收视率项目实战,实时流统计项目实战,离线电商分析项目实战,Spark大型项目实战用户分析,智能客户系统项目实战,Linux基础,Hadoop,Spark,Storm,Docker,Mapreduce,Kafka,Flume,OpenStack,Hiv