`
ainidehsj
  • 浏览: 135829 次
  • 性别: Icon_minigender_1
  • 来自: 长沙
社区版块
存档分类
最新评论

用Kettle的一套流程完成对整个数据库迁移

阅读更多
需求:
1.你是否遇到了需要将mysql数据库中的所有表与数据迁移到Oracle。
2.你是否还在使用kettle重复的画着:表输入-表输出、创建表,而烦恼。

下面为你实现了一套通用的数据库迁移流程。

技术引导:
实现之初,在kettle提供的例子中找到了一个类似的(samples\jobs\process all tables)。
通过相关改造,终于达到目标。

实现过程解剖:
整套流程分为:2个job,4个trans。
使用到的Trans插件:表输入、字段选择、复制记录到结果、从结果获取记录、设置变量、自定义java脚本、表输出。
1.大job。


2.要迁移的源库表名称获取,并设置到结果集,为下面的job使用。


3.配置子job为前面的每一条记录(即每个表)执行一次该子job


4.下面是子job。


5.获取记录中的表名称,并设置为到变量。


6.读取当前表的结果信息,并在目标库中创建表(这个是难点)。

因为只需要获取抓取要抽取表的结构信息,故在sql后面加上 where 1=2。

下面代码是创建目标库表。
public boolean processRow(StepMetaInterface smi, StepDataInterface sdi) throws KettleException
{
    // First, get a row from the default input hop
	//
	Object[] r = getRow();

	org.pentaho.di.core.database.DatabaseMeta dbmeta = null;
	
	java.util.List list = getTrans().getRepository().readDatabases();//3.x中获取资源库的所有数据库连接信息用getDatabases();
	
	if(list != null && !list.isEmpty())
	{
		for(int i=0;i<list.size();i++)
		{
			dbmeta = (org.pentaho.di.core.database.DatabaseMeta)list.get(i);
                        //下面是目标库的数据库连接,大家可根据需要修改
			if("mysql_test".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.getDDL(tablename, data.inputRowMeta);//${TABLENAME}
							
				db.execStatement(sql.replace(";", ""));

				logBasic(sql);
			}
		}
		catch(Exception e)
		{			
			logError("创建表出现异常",e);
			
		}finally{
			db.disconnect();
		}
	}
	return false;
}


7.表数据迁移。



8.差不多就行了,本人使用mysql到mysql、oracle的测试是没有问题的不过在测试过程中,发现源表若存在有blob的表,会有问题,可能是由于表输出没有指定字段的原因,具体解决办法,也没有去多想,以后有时间在完善把。

上面的整套流程的是在kettle4.3下完成的,附件里面可下载完整流程。

5.x运行到创建表结构步骤报错,原因data.inputRowMeta为空,因为在第6步
在sql后面加上 where 1=2,导致表输入步骤没有抽取到记录,5.x里结构也变成了null。
解决:
把where 1=2去掉,然后,在表输入的限制行设置为1,即可,本人亲测。
分享到:
评论
22 楼 skying007 2017-07-18  
好文章!
21 楼 sunggff 2017-04-12  
亲,在迁移空表时出现空指针异常的具体解决办法是怎样的,求解答
20 楼 soft_xiang 2017-04-10  
你好,用的kettle 7.0 在执行的时候,创建表的那句出错

java.util.List list = getTrans().getRepository().readDatabases();
这句里面
getTrans().getRepository()
这个返回了Null

会是什么问题呢?
19 楼 xueyubingsen 2017-01-11  
环境:kettle 6.0 +源和目标都是mysql
报错如下,timestamp数据类型不知道为什么识别成了unknown。。。,改成date类型就好了
2017/01/11 10:45:20 - Java 代码.0 - 开始创建表:msg_log_old
2017/01/11 10:45:20 - Java 代码.0 - CREATE TABLE msg_log_old
2017/01/11 10:45:20 - Java 代码.0 - (
2017/01/11 10:45:20 - Java 代码.0 -   id INT
2017/01/11 10:45:20 - Java 代码.0 - , name TINYTEXT
2017/01/11 10:45:20 - Java 代码.0 - , birthday  UNKNOWN
2017/01/11 10:45:20 - Java 代码.0 - )
2017/01/11 10:45:20 - Java 代码.0 - ;
2017/01/11 10:45:20 - Java 代码.0 - ERROR (version 6.0.1.0-386, build 1 from 2015-12-03 11.37.25 by buildguy) : 创建表出现异常
2017/01/11 10:45:20 - Java 代码.0 - ERROR (version 6.0.1.0-386, build 1 from 2015-12-03 11.37.25 by buildguy) : org.pentaho.di.core.exception.KettleDatabaseException:
2017/01/11 10:45:20 - Java 代码.0 - Couldn't execute SQL: CREATE TABLE msg_log_old
2017/01/11 10:45:20 - Java 代码.0 - (
2017/01/11 10:45:20 - Java 代码.0 -   id INT
2017/01/11 10:45:20 - Java 代码.0 - , name TINYTEXT
2017/01/11 10:45:20 - Java 代码.0 - , birthday  UNKNOWN
2017/01/11 10:45:20 - Java 代码.0 - )
2017/01/11 10:45:20 - Java 代码.0 -
2017/01/11 10:45:20 - Java 代码.0 - You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'UNKNOWN
2017/01/11 10:45:20 - Java 代码.0 - )' at line 5
2017/01/11 10:45:20 - Java 代码.0 -
2017/01/11 10:45:20 - Java 代码.0 - at org.pentaho.di.core.database.Database.execStatement(Database.java:1506)
2017/01/11 10:45:20 - Java 代码.0 - at org.pentaho.di.core.database.Database.execStatement(Database.java:1454)
2017/01/11 10:45:20 - Java 代码.0 - at Processor.processRow(Processor.java:41)
2017/01/11 10:45:20 - Java 代码.0 - at org.pentaho.di.trans.steps.userdefinedjavaclass.UserDefinedJavaClass.processRow(UserDefinedJavaClass.java:1018)
2017/01/11 10:45:20 - Java 代码.0 - at org.pentaho.di.trans.step.RunThread.run(RunThread.java:62)
2017/01/11 10:45:20 - Java 代码.0 - at java.lang.Thread.run(Thread.java:745)
2017/01/11 10:45:20 - Java 代码.0 - Caused by: com.mysql.jdbc.exceptions.jdbc4.MySQLSyntaxErrorException: You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'UNKNOWN
2017/01/11 10:45:20 - Java 代码.0 - )' at line 5
18 楼 yilijun246437 2016-11-25  
java3344520 写道
环境:kettle 6.0 +源和目标都是mysql,
用样例无法运行,改写java代码控件的脚本可以执行成功,但是字段类型不能和源库一样

改写哪个控件?JAVA里面我没改成功。
17 楼 yelangshisan 2016-10-26  
大哥哥,这套能迁移成功,但是表上面的主键 外键,都没添加上 如何做可以把主键什么的添加上    
16 楼 java3344520 2016-02-22  
环境:kettle 6.0 +源和目标都是mysql,
用样例无法运行,改写java代码控件的脚本可以执行成功,但是字段类型不能和源库一样
15 楼 richard_cb 2016-01-05  
有人能成功么,我的不行,在第 5 6 步
14 楼 hosper 2015-10-30  
建表可以,但创建存储过程不行,kettle里面如何创建存储过程?
13 楼 ainidehsj 2014-10-11  
shengsheng215 写道
在第六步的时候报错了呢?2013/05/22 17:01:14 - User Defined Java Class.0 - ERROR (version 4.3.0-stable, build 16786 from 2012-04-24 14.11.32 by buildguy) : Unexpected error
2013/05/22 17:01:14 - User Defined Java Class.0 - ERROR (version 4.3.0-stable, build 16786 from 2012-04-24 14.11.32 by buildguy) : java.lang.NullPointerException
2013/05/22 17:01:14 - User Defined Java Class.0 - ERROR (version 4.3.0-stable, build 16786 from 2012-04-24 14.11.32 by buildguy) : at Processor.processRow(Processor.java:9)
2013/05/22 17:01:14 - User Defined Java Class.0 - ERROR (version 4.3.0-stable, build 16786 from 2012-04-24 14.11.32 by buildguy) : at org.pentaho.di.trans.steps.userdefinedjavaclass.UserDefinedJavaClass.processRow(UserDefinedJavaClass.java:1181)
2013/05/22 17:01:14 - User Defined Java Class.0 - ERROR (version 4.3.0-stable, build 16786 from 2012-04-24 14.11.32 by buildguy) : at org.pentaho.di.trans.step.RunThread.run(RunThread.java:50)
2013/05/22 17:01:14 - User Defined Java Class.0 - ERROR (version 4.3.0-stable, build 16786 from 2012-04-24 14.11.32 by buildguy) : at java.lang.Thread.run(Thread.java:619)
能给看一下吗?谢啦

在新版本中,这个表输入查询不到记录(因为sql有1=2),在第六步的获取表输入输出结构为空!导致了你上面的错误,目前本人没有去研究,建议没有用到新版本功能,还是用4.x较妥。
12 楼 马新浪2011 2014-10-10  
楼主你好,我用这个脚本做数据库的迁移,现在就是到在目标库建表的时候,“当源数据库的表为空的时候”,直接报错误:创建入库表结构.0 - ERROR (version 5.1.0.0, build 1 from 2014-06-19_19-02-57 by buildguy) : java.lang.NullPointerException

向源数据库的空表里面随便写一条数据,就能够在目标数据库建表。能帮忙看看吗?
11 楼 ainidehsj 2014-05-27  
flzhang132 写道
楼主你好,我也是用资源库做的,现在就是到在目标库建表的时候,执行到java程序中取data.inputRowMeta数据总是null,这里面因该是真么数据呀,怎么取出数值呢?

我刚才试了一下5.x里测试这个示例确实出现这个问题。要修改一个地方。
10 楼 flzhang132 2014-05-27  
楼主你好,我也是用资源库做的,现在就是到在目标库建表的时候,执行到java程序中取data.inputRowMeta数据总是null,这里面因该是真么数据呀,怎么取出数值呢?
9 楼 feng123 2014-02-26  
附件下载,求求
8 楼 liuruming 2013-11-13  
创建入库表结构 是怎么建立呀???
7 楼 ainidehsj 2013-10-24  
最近很少上javaeye,有问题上我的kettle群讨论把(227385701)。
6 楼 ainidehsj 2013-10-24  
shengsheng215 写道
在第六步的时候报错了呢?2013/05/22 17:01:14 - User Defined Java Class.0 - ERROR (version 4.3.0-stable, build 16786 from 2012-04-24 14.11.32 by buildguy) : Unexpected error
2013/05/22 17:01:14 - User Defined Java Class.0 - ERROR (version 4.3.0-stable, build 16786 from 2012-04-24 14.11.32 by buildguy) : java.lang.NullPointerException
2013/05/22 17:01:14 - User Defined Java Class.0 - ERROR (version 4.3.0-stable, build 16786 from 2012-04-24 14.11.32 by buildguy) : at Processor.processRow(Processor.java:9)
2013/05/22 17:01:14 - User Defined Java Class.0 - ERROR (version 4.3.0-stable, build 16786 from 2012-04-24 14.11.32 by buildguy) : at org.pentaho.di.trans.steps.userdefinedjavaclass.UserDefinedJavaClass.processRow(UserDefinedJavaClass.java:1181)
2013/05/22 17:01:14 - User Defined Java Class.0 - ERROR (version 4.3.0-stable, build 16786 from 2012-04-24 14.11.32 by buildguy) : at org.pentaho.di.trans.step.RunThread.run(RunThread.java:50)
2013/05/22 17:01:14 - User Defined Java Class.0 - ERROR (version 4.3.0-stable, build 16786 from 2012-04-24 14.11.32 by buildguy) : at java.lang.Thread.run(Thread.java:619)
能给看一下吗?谢啦

你用的不是资源库把,所以才会报空指针异常、
5 楼 spp_1987 2013-10-08  
眼拙 ,刚没看见 附件
4 楼 spp_1987 2013-10-08  
楼主 求 下载附件。
3 楼 hahalaka 2013-08-09  
函数名 getDDL 改为
getDDLCreationTable 即可

相关推荐

    Kettle学习资料分享,附大神用Kettle的一套流程完成对整个数据库迁移方法

    标题中的“Kettle学习资料分享,附大神用Kettle的一套流程完成对整个数据库迁移方法”揭示了本文将深入探讨Kettle这一ETL(Extract, Transform, Load)工具在数据库迁移过程中的应用。Kettle,又称为Pentaho Data ...

    Kettle的一套流程完成对整个数据库迁移.zip

    在这个“Kettle的一套流程完成对整个数据库迁移”的压缩包中,包含了完成数据库迁移所需的所有步骤。数据库迁移通常涉及从一个数据库系统迁移到另一个系统,确保数据的完整性和一致性。 首先,理解Kettle的工作原理...

    Oracle导Mysql适用于百、千万级别数据迁移

    Oracle导Mysql适用于百、千万级别数据迁移,速度是kettle的10倍以上数据库迁移 数据迁移 千万级 亿万级数据,MySQL oracle关系型 现需要开发一套程序用来快速迁移数据库,要求如下: 1.使用人员可以指定迁移数据库...

    kettle数据迁移工具使用文档介绍

    ### Kettle 数据迁移工具使用详解 #### 一、Kettle 概述 Kettle 是一款功能强大的开源 ETL(Extract, Transform, Load)工具,它采用纯 Java 编写,支持在 Windows、Linux 和 Unix 等多种操作系统上运行。Kettle ...

    kettle批量数据库操作流程脚本.rar

    在"Kettle批量数据库操作流程脚本.rar"这个压缩包中,我们可以找到一套实现从多个数据库抽取数据并合并到单一目标数据库的脚本。这个资源对于需要进行大数据集成或者复杂数据迁移的项目非常有用。 1. **ETL过程**:...

    kettle循环抽取表数据.zip

    关于“标签”,“kettle”指代的是Kettle工具本身,它提供了一套图形化的工作流设计界面,让用户无需编写代码就能完成复杂的数据处理任务。“循环”在这里意味着Kettle作业会遍历数据库中的每一个表,逐个进行数据...

    kettle_lib.rar

    总的来说,"kettle_lib.rar"提供了一套全面的数据库连接支持,使得Kettle能够无缝对接多种类型的数据库系统,这对于需要处理多源数据的项目来说是非常宝贵的资源。用户只需要根据自己的需求选择相应的JAR文件,即可...

    kettle.7z在线免费下载

    1. **数据抽取**:Kettle支持从各种数据源(如关系型数据库、文本文件、Excel表格、XML、Web服务等)中提取数据,使得数据迁移和整合变得简单易行。 2. **数据转换**:在Kettle中,用户可以通过拖拽和配置组件来...

    java代码操作数据转移,把一个数据库里的东西移动到另一个数据库,自动建库建表

    在IT行业中,数据库迁移是一项常见的任务,特别是在Java开发中,我们经常需要将数据从一个数据库迁移到另一个数据库,比如从测试环境迁移到生产环境。这个过程不仅涉及数据的复制,还包括了数据库结构(如表、索引等...

    Kettle资料汇总

    - **元数据驱动**:Kettle使用元数据驱动设计,使得ETL流程更加灵活和可重用。 - **工作流管理**:通过作业和转换的组合,可以构建复杂的工作流,支持条件分支、循环、错误处理等控制结构。 - **性能优化**:...

    Kettle - Spoon - 4.1.0 操作手册

    《Kettle Spoon 4.1.0 操作手册》提供了全面的指南,帮助用户了解和掌握Pentaho Data Integration(通常称为Kettle或Spoon)的使用,这是一款强大的ETL(提取、转换、加载)工具。ETL是数据处理的关键部分,用于从不...

    Kettle 7.1 SDK

    这个版本的SDK包含了Kettle 7.1所需的全部开发类库,使得开发人员能够构建自定义的数据处理解决方案,进行数据清洗、转换和迁移。 Kettle,又称为Pentaho Data Integration(PDI),是由社区驱动的,具有强大的图形...

    Kettle的使用基础手册.docx

    Kettle的常见用途非常广泛,如实现不同数据库之间的数据迁移,处理大数据集,进行复杂的数据清洗,以及支持Hadoop环境下的数据处理。它的特性包括跨平台性(Java编写,可在Windows、Linux、Unix上运行)、高数据处理...

    pentaho kettle solutions.zip

    5. **"pentaho kettle solutions.pdf"**:这可能是关于如何使用Kettle解决实际问题的指南或教程。通常,这类文档会包含详细的步骤、最佳实践以及常见问题解答,帮助初学者快速上手,并为有经验的用户提供深入的技术...

    kettle培训技术文档.pdf

    运行此转换,即可完成数据迁移。 此外,Kettle还支持Job的创建,用于协调多个Transformation的执行。例如,可以在Job中调用前面创建的Transformation,并通过“START”和“Transformation”元素定义执行顺序。保存...

    数据库工具大全.pdf

    Kettle 中有两种脚本文件,transformation 和 job,transformation 完成针对数据的基础转换,job 则完成整个工作流的控制。 4. Eclipse SQLExplorer Eclipse SQLExplorer 是 Eclipse 集成开发环境的一种插件,它...

Global site tag (gtag.js) - Google Analytics