当前位置 博文首页 > sunggff的博客:kettle7.0下实现数据库整体迁移

    sunggff的博客:kettle7.0下实现数据库整体迁移

    作者:[db:作者] 时间:2021-09-12 12:02

    一、采用软件自带方式

    1.新建一个job,创建两个DB连接:source、target(源数据库和目标数据库连接),在菜单中找到【复制多表向导】,点击进行相关操作:


    2.选择源数据库和目标数据库


    3.选择所需迁移的表


    4.编辑生成的job文件名:qy.kjb,和文件目录,编辑好后【Finish】


    5.运行qy.kjb,可在test2数据库中看到成功生成迁移来的表。



    二、自定义数据库迁移(oracle >> mysql)

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

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

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

    2)? 表输入

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

    3) 字段选择

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

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

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

    1) 新建一个DB连接:mysqltarget

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

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

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

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

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

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

    ??? 创建过程同上

    2)添加一个【表输入】

    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

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

    ???? 创建过程同上

    2) 添加一个【表输入】

    3)添加一个表输出

    8.运行数据库迁移.kjb

    在mysql数据库test2中成功生成迁移的所有表


    注:1.此方案是在资源库环境下创建并运行的,需要登陆资源库。

    ? ? ? ? 2.此方案下载地址:点击打开链接

    存在问题:当源数据库中存在空表时,会报以下错误:

    2017/04/19 14:57:05 - 创建表结构.0 - 开始创建表:KFYQGX
    2017/04/19 14:57:05 - 创建表结构.0 - ERROR (version 7.0.0.0-25, build 1 from 2016-11-05 15.35.36 by buildguy) : 创建表出现异常
    2017/04/19 14:57:05 - 创建表结构.0 - ERROR (version 7.0.0.0-25, build 1 from 2016-11-05 15.35.36 by buildguy) : java.lang.NullPointerException
    2017/04/19 14:57:05 - 创建表结构.0 - ?at org.pentaho.di.core.database.DatabaseMeta.quoteReservedWords(DatabaseMeta.java:2352)
    2017/04/19 14:57:05 - 创建表结构.0 - ?at org.pentaho.di.core.database.Database.getDDLCreationTable(Database.java:4441)
    2017/04/19 14:57:05 - 创建表结构.0 - ?at Processor.processRow(Processor.java:45)
    2017/04/19 14:57:05 - 创建表结构.0 - ?at org.pentaho.di.trans.steps.userdefinedjavaclass.UserDefinedJavaClass.processRow(UserDefinedJavaClass.java:1018)
    2017/04/19 14:57:05 - 创建表结构.0 - ?at org.pentaho.di.trans.step.RunThread.run(RunThread.java:62)
    2017/04/19 14:57:05 - 创建表结构.0 - ?at java.lang.Thread.run(Thread.java:745)


    此问题还未解决,要是哪位仁兄解决了还望告知一下,共同探讨下


    cs