先来说说需求吧,这次设计的迁移脚本是oracle2mysql的一套脚本。由于公司使用的分布式数据库中间件,在确保能使用kettle的批量导入功能下需要对数据进行一个分片的导入(这次脚本采用的是讲oracle表直接分片,再导入每张分片表到mysql内,也可考虑单表导入的时候才用对分片键取模的方式进行导入)这里提供一个设计的思路,小伙伴们可以根据自己的实际情况进行脚本的修改;
首先脚本文件如下:
除去一些kettle的转换及任务文件,添加了一个配置文件用来记录分片表后缀编号,和前缀(结合自身业务);
内容就是列名和实际要传入的内容,可以根据需求自己进行修改设计;这个设计是基于分片表横向切分而做的,比如说我有100张分片表,则可以使用完全相同的kettle文件,仅需在这个配置文件中,录入不同的分片表前缀及编号。做到横向切分,并行多个kettle脚本进行数据迁移。
然后看一下整个脚本的流程:
首先是主流程:
之后是传输流程:
之所以使用两条job是想使用kettle特性,节省一个循环的设计;
这个流程中需要注意的比较重要的一点数据传输任务,设置项里需要在执行每个输入行上打钩,这样就很简单的完成了一个循环设计;
那么说一下具体转换,首先是获取分片数量
我们从这个转换中,获取Excel中配置的信息,并将它放在结果集里。比较简单这里就不多做说明;
之后是数据传输的主进程,首先是从结果集中取出前缀及编号,设置为变量
由于kettle的特性,同一个转换里设置的变量要在下个转换中正常引入。
然后关于续传的设计,如果脚本再运行过程中异常断开,那么我们需要一个断点续传的过程,防止每次都从配置文件初始分片一条一条进行传输;为了实现这样的功能,我们需要在oracle源库中创建一张trans_record传输记录表,每次循环结束后,讲此次传输的表名进行记录,而检查是否传输就是检查记录表中是否有此次传输的表名;
所以实现这个功能我们总共使用了三个转换进行实现,分别是检查是否已进行传输,检验字段的值,以及updateMark更新此次传输到trans_record表;
之后是传输流程,导入中不可避免的可能存在脏数据,导致导入失败,由于由于是批量导入,一条错误数据会导致一个批次的数据都无法正确导入,所以这里我们通过一个中间的文本文件进行记录,首先批量导入,如果错误文件存在则,输出到文本文件中,再进行一次单条插入,从文本文件中获取数据;而最终的脏数据我们再oracle源库中创建一个log表存放它的主键,便于我们进行数据定位,错误分析和清洗;
为了实现上面的功能,我们总共使用两个转换tabTrans批量传输,trans单条筛选,如下:
那么整个脚本设计实现思路就是这么多,有什么问题或者哪里有错误或者可以有更好的改进欢迎大家给我留言,我也是个kettle萌新,分享期待进步。
附上脚本 https://download.csdn.net/download/reifwww/10542362