一、背景

上一篇文章(单表数据迁移)用kettle实现了一张表的数据迁移。但实际情况中,数据库会有几百,几千张表,而kettle的表输入和表输出只能选择一张表,我们不可能一个个地填写表名。这时候,我们要考虑 通过循环实现多表的数据迁移。

二、前期准备

与单表数据迁移类似
  准备好两个数据库 ,一个数据库要有数据,一个不要数据
  电脑可以连接数据库,
  下载好kettle,并把对应数据库的驱动包放在kettle文件夹的lib目录下。

如果第一次使用kettle,建议先看上一篇文章 ,上一篇很详细地介绍了新建转换、新建节点、新建数据库连接等问题。

三、多表数据迁移(400张表)

1.读取需要迁移的表(获取所有表名称.ktr)

点击文件—新建—转换,在左侧的 核心对象 标签下选择 输入 下的 表输入,双击添加到右侧的转换面板,再选择 作业 下的 复制记录到结果 ,双击添加到右侧的转换面板。

kettle多表数据迁移-kettle的使用_kettle

 接下来配置表输入,双击 表输入 的图标,

// mysql查询该数据库的所有表select table_name from information_schema.tables where table_schema=当前数据库名 and table_type='base table';

kettle多表数据迁移-kettle的使用_多表数据迁移_02

新建mysql的数据库连接,数据库连接的配置参考上一篇文章(注意是mysql的连接),新建好连接,记得测试一下是否连接成功。

SQL语句填写的就是mysql查询所有表的语句,table_schema 为你的mysql数据库名。

配置好点击下方的预览,看一下查出来的表名对不对。

kettle多表数据迁移-kettle的使用_kettle_03

字段选择中吧字段名称设置成TABLE_NAME。

kettle多表数据迁移-kettle的使用_多表数据迁移_04

现在已经把mysql中的表名都查出来,最后会根据这些表名查询数据库。

复制记录到结果 不需要配置。

保存这个转换为“获取所有表名称.ktr”。

2.把这些表名设置成变量(设置变量.ktr)

新建转换,在左侧的 核心对象 标签下选择 作业 下的 从结果获取记录,双击添加到右侧的转换面板,再选择 作业 下的 设置变量 ,双击添加到右侧的转换面板。

 kettle多表数据迁移-kettle的使用_kettle_05

接下来配置这两个节点。

双击 从结果获取记录,填写字段名称和类型(获取表名时,两种方法的字段都写成了table_name,就是为了这里读取字段时可以统一)。

kettle多表数据迁移-kettle的使用_多表数据迁移_06

双击 设置变量,字段名称仍然是table_name,为取到的字段取一个变量名,比如“TNAME”,变量活动类型如下。

kettle多表数据迁移-kettle的使用_kettle_07

把这个转换保存成设置变量.ktr。

3.根据变量设置表输入和表输出(迁移数据.ktr)

这个步骤和单表迁移的步骤相同,新建一个转换,添加表输入和表输出节点。

kettle多表数据迁移-kettle的使用_多表数据迁移_08

 表输入 的配置仍然是新建mysql的数据库连接,填写sql查询语句。与单表迁移不同,查询语句from后不填表名,填写上一步设置的变量名 TNAME,这个变量保存了所有的表名。因为还没有把这些步骤关联起来,所以现在不能预览数据。

kettle多表数据迁移-kettle的使用_多表数据迁移_09

 表输出 的配置另一个mysql的数据库连接,但目标表需要填写与表输入一致的变量名 TNAME,提交记录数量是指每插入1000条记录commit一次。

kettle多表数据迁移-kettle的使用_kettle_10

 注意:kettle中变量的写法是 ${变量名}。

把这个转换保存成迁移数据.ktr。

4.把以上的三个转换连接

到此为止,我们新建了是三个转换,分别是:

1、从数据库读取表名并复制到结果(获取所有表名称.ktr)

kettle多表数据迁移-kettle的使用_kettle

2、从结果获取记录并设置成变量(设置变量.ktr)

kettle多表数据迁移-kettle的使用_多表数据迁移_12

3、根据变量进行表输入和表输出(迁移数据.ktr)

kettle多表数据迁移-kettle的使用_kettle_13

 接下来把这些转换连接成作业(JOB)。

5、第一个作业(job2.kjb)

首先把第设置变量、迁移数据这两个转换结合起来。点击 文件——新建——作业,在左侧的 核心对象 标签下选择 通用,双击添加一个 start ,两个 转换  到右侧的作业面板,这些作业项都可以改名字。把这个作业保存为job.kjb。

kettle多表数据迁移-kettle的使用_多表数据迁移_14

 点击两个转换可以修改作业项名称,点击浏览选择对应的转换。第一个转换对应 设置变量.ktr

kettle多表数据迁移-kettle的使用_kettle_15

第二个转换对应 迁移数据.ktr

 kettle多表数据迁移-kettle的使用_kettle_16

6、最后一个作业,也是最后执行的文件(job1.kjb)

接下来把第一个转换与第一个作业结合。点击 文件——新建——作业,在左侧的 核心对象 标签下选择 通用,双击添加一个 start ,一个 转换 ,一个 作业 和一个 成功 到右侧的作业面板,这些作业项都可以改名字。

kettle多表数据迁移-kettle的使用_kettle_17

 配置转换和作业,把转换对应到 获取所有表数据.ktr。

kettle多表数据迁移-kettle的使用_kettle_18

 把作业对应到 job2.kjb,同时在execution那里选择 执行每一个输入行 用于循环。

kettle多表数据迁移-kettle的使用_kettle_19

 这个作业就是最终需要的作业。

7、开始数据迁移

点击作业面板左上角的三角形,运行这个作业。

kettle多表数据迁移-kettle的使用_多表数据迁移_20

 点击执行即可。

kettle多表数据迁移-kettle的使用_kettle_21

 执行过程如下,日志记录了迁移的过程。

kettle多表数据迁移-kettle的使用_kettle_22

 成功会有提示,过程中出错会终止,执行完作业可以去查看mysql的表。

8、总结
1、在mysql里查找当前库下有哪些表格,或者从整理好的Excel读取,输出到结果记录
2、从结果记录里面每次取一行,设置成变量vtable
3、针对每次使用的变量值,去oracle数据源里生成对应的表输入(通过变量生成)
4、把变量赋给表输出的表名,其他配置不变,因为表名和字段都和源端oracle是一样的
5、针对每个“输出到结果记录”做循环,插入每个oracle表的数据到mysql