一、背景
上一篇文章(单表数据迁移)用kettle实现了一张表的数据迁移。但实际情况中,数据库会有几百,几千张表,而kettle的表输入和表输出只能选择一张表,我们不可能一个个地填写表名。这时候,我们要考虑 通过循环实现多表的数据迁移。
二、前期准备
与单表数据迁移类似
准备好两个数据库 ,一个数据库要有数据,一个不要数据
电脑可以连接数据库,
下载好kettle,并把对应数据库的驱动包放在kettle文件夹的lib目录下。
如果第一次使用kettle,建议先看上一篇文章 ,上一篇很详细地介绍了新建转换、新建节点、新建数据库连接等问题。
三、多表数据迁移(400张表)
1.读取需要迁移的表(获取所有表名称.ktr)
点击文件—新建—转换,在左侧的 核心对象 标签下选择 输入 下的 表输入,双击添加到右侧的转换面板,再选择 作业 下的 复制记录到结果 ,双击添加到右侧的转换面板。
接下来配置表输入,双击 表输入 的图标,
// mysql查询该数据库的所有表select table_name from information_schema.tables where table_schema=当前数据库名 and table_type='base table';
新建mysql的数据库连接,数据库连接的配置参考上一篇文章(注意是mysql的连接),新建好连接,记得测试一下是否连接成功。
SQL语句填写的就是mysql查询所有表的语句,table_schema 为你的mysql数据库名。
配置好点击下方的预览,看一下查出来的表名对不对。
字段选择中吧字段名称设置成TABLE_NAME。
现在已经把mysql中的表名都查出来,最后会根据这些表名查询数据库。
复制记录到结果 不需要配置。
保存这个转换为“获取所有表名称.ktr”。
2.把这些表名设置成变量(设置变量.ktr)
新建转换,在左侧的 核心对象 标签下选择 作业 下的 从结果获取记录,双击添加到右侧的转换面板,再选择 作业 下的 设置变量 ,双击添加到右侧的转换面板。
接下来配置这两个节点。
双击 从结果获取记录,填写字段名称和类型(获取表名时,两种方法的字段都写成了table_name,就是为了这里读取字段时可以统一)。
双击 设置变量,字段名称仍然是table_name,为取到的字段取一个变量名,比如“TNAME”,变量活动类型如下。
把这个转换保存成设置变量.ktr。
3.根据变量设置表输入和表输出(迁移数据.ktr)
这个步骤和单表迁移的步骤相同,新建一个转换,添加表输入和表输出节点。
表输入 的配置仍然是新建mysql的数据库连接,填写sql查询语句。与单表迁移不同,查询语句from后不填表名,填写上一步设置的变量名 TNAME,这个变量保存了所有的表名。因为还没有把这些步骤关联起来,所以现在不能预览数据。
表输出 的配置另一个mysql的数据库连接,但目标表需要填写与表输入一致的变量名 TNAME,提交记录数量是指每插入1000条记录commit一次。
注意:kettle中变量的写法是 ${变量名}。
把这个转换保存成迁移数据.ktr。
4.把以上的三个转换连接
到此为止,我们新建了是三个转换,分别是:
1、从数据库读取表名并复制到结果(获取所有表名称.ktr)
2、从结果获取记录并设置成变量(设置变量.ktr)
3、根据变量进行表输入和表输出(迁移数据.ktr)
接下来把这些转换连接成作业(JOB)。
5、第一个作业(job2.kjb)
首先把第设置变量、迁移数据这两个转换结合起来。点击 文件——新建——作业,在左侧的 核心对象 标签下选择 通用,双击添加一个 start ,两个 转换 到右侧的作业面板,这些作业项都可以改名字。把这个作业保存为job.kjb。
点击两个转换可以修改作业项名称,点击浏览选择对应的转换。第一个转换对应 设置变量.ktr
第二个转换对应 迁移数据.ktr
6、最后一个作业,也是最后执行的文件(job1.kjb)
接下来把第一个转换与第一个作业结合。点击 文件——新建——作业,在左侧的 核心对象 标签下选择 通用,双击添加一个 start ,一个 转换 ,一个 作业 和一个 成功 到右侧的作业面板,这些作业项都可以改名字。
配置转换和作业,把转换对应到 获取所有表数据.ktr。
把作业对应到 job2.kjb,同时在execution那里选择 执行每一个输入行 用于循环。
这个作业就是最终需要的作业。
7、开始数据迁移
点击作业面板左上角的三角形,运行这个作业。
点击执行即可。
执行过程如下,日志记录了迁移的过程。
成功会有提示,过程中出错会终止,执行完作业可以去查看mysql的表。
8、总结
1、在mysql里查找当前库下有哪些表格,或者从整理好的Excel读取,输出到结果记录
2、从结果记录里面每次取一行,设置成变量vtable
3、针对每次使用的变量值,去oracle数据源里生成对应的表输入(通过变量生成)
4、把变量赋给表输出的表名,其他配置不变,因为表名和字段都和源端oracle是一样的
5、针对每个“输出到结果记录”做循环,插入每个oracle表的数据到mysql