Kettle教程之不同数据库之间实现自动迁移备份Data Integration

database | 2019-09-13 10:02:39

有时候我们有需要在两个数据库之间进行备份迁移更新,这样的需求场景很多,比如我要转数据库了,mysql不够用,我要转到sqlserver,又或者,我就是要做一个简单的备份到另一个数据库,又或者,我从服务每天要备份一次到我的本地来进行数据分析等等。那么Data Integration - Kettle为此而生可以拖拽方式定制很多不同的场景!下面就学习记录一下!官方下载地址:https://community.hds.com/docs/DOC-1009855
是绿色的,和tomcat一样,可以随意在linux和windows上启动,然后执行

很重要的一点就是:要把对应数据库连接的驱动文件jar包下载后放到安装目录的lib里面和libswt/win64里面再重启应用。

一、主要概念
1.作业,负责将[转换]组织在一起进而完成某一块工作,通常我们需要把一个大的任务分解成几个逻辑上隔离的作业,当这几个作业都完成了,也就说明这项任务完成了。
2.转换,定义对数据操作的容器,数据操作就是数据从输入到输出的一个过程,可以理解为比作业粒度更小一级的容器,我们将任务分解成作业,然后需要将作业分解成一个或多个转换,每个转换只完成一部分工作。

3.主对象树就是你当前的编辑的工程
4.核心对象就是系统所有的对象,可以添加到你工程中的对象

二、简单的迁移备份,通过软件自带的向导

1.下载安装完点击Spoon.bat打开软件,我打开就是中文版的。
新建一个job作业,创建两个DB连接:source、target(源数据库和目标数据库连接)
菜单栏-工具-向导-复制多表向导,(当然也可以复制单表)。

1.png


2.选择源数据库和目标数据库,还有要迁移备份的表

2.png


3.png


3.点击三角运行,运行后目标数据库就会出现的表,当然你的数据库配置要对哈!

3.png

三、自定义控件,生成备份流程

先啰嗦一下,所谓自定义 这个可以很几单,也可以很麻烦,你可以写很多sql来控制备份更新,也可以写很多java代码,比如判断表存在啊等,更可以弄很复杂的步骤和业务,当然根据自己需求来扩展,这里讲一个基本的思路

1.创建一个主job:数据库迁移.kjb

1.png

2.创建转换:获取表名称.ktr

2.png

        1) 创建一个DB连接:oraclesource(源数据库连接)

3.png

        2)  表输入

4.png

        注:oracle中获取表名SQL:select * from user_tables,mysql中为:show tables

        3) 字段选择,点击【获取选择的字段】,添加新的字段,选中"TABLE_NAME"并改名成“tablename”,将其余字段删除

5.png

        4)添加一个【复制记录到结果字符串】

6.png

3.新建一个job:抽取表.kjb

7.png

        1) 新建一个DB连接:mysqltarget

8.png

4. 新建一个转换:表名称变量设置.ktr

8.png

        1) 添加一个【从结果获取记录】

10.png

        2)添加一个【设置变量】

11.png

5.添加一个【检查表是否存在】

12.png

6.新建一个转换:创建目标库表结构.ktr

13.png

        1) 新建两个DB连接:oraclesource,mysqltarget

    创建过程同上

        2)添加一个【表输入】

14.png

        

        3)添加一个【Java代码】,代码如下



public boolean processRow(StepMetaInterface smi, StepDataInterface sdi) throws KettleException
{
           Object[] r = getRow();
        //本地连接获取数据库元数据
        //org.pentaho.di.core.database.DatabaseMeta dbmeta = getTransMeta().findDatabase("target");
        //资源库连接获取数据库元数据
        org.pentaho.di.core.database.DatabaseMeta dbmeta = null;
        
        java.util.List list = getTrans().getRepository().readDatabases();
        
        if(list != null && !list.isEmpty())
        {
                for(int i=0;i<list.size();i++)
                {
                        dbmeta = (org.pentaho.di.core.database.DatabaseMeta)list.get(i);
                        if("target".equalsIgnoreCase(dbmeta.getName()))
                        {                                
                                break;
                        }
                }
        }
        if(dbmeta!=null)
        {
                org.pentaho.di.core.database.Database db=new org.pentaho.di.core.database.Database(dbmeta);
                
                try
                {
                        db.connect();
                        String tablename = getVariable("TABLENAME");
                        //在日志中显示创建表名
                        logBasic("开始创建表:" + tablename);
                        
                        if(tablename!=null && tablename.trim().length()>0)
                        {
                                                                
                                //获取表名称和输入行数据
                                String sql =  db.getDDLCreationTable(tablename ,getInputRowMeta());
                                db.execStatement(sql.replace(";", ""));
                                //在日志中显示sql语句
                                logBasic(sql);
                        }
                }
                catch(Exception e)
                {                        
                        logError("创建表出现异常",e);
                        
                }finally{
                        db.disconnect();
                }
        }
        return false;
}


7. 新建一个转换:表抽取.ktr

15.png

        1)新建两个DB连接:oraclesource,mysqltarget。

     创建过程同上

        2) 添加一个【表输入】

        3)添加一个表输出

16.png

8.运行数据库迁移.kjb

在mysql数据库test2中成功生成迁移的所有表,可以直接在目标数据库看到迁移进来的表


9.定时任务定时执行迁移备份双击start 设置 重复 和时间间隔

17.png


登录后即可回复 登录 | 注册
    
关注编程学问公众号