文档章节

使用Kettle进行数据库迁移操作

影非弦
 影非弦
发布于 2017/07/24 15:51
字数 2356
阅读 16
收藏 0
点赞 0
评论 0

思路:先从源库读取需要迁移的表名,将表明作为变量,并在目标库创建这些表,最后表到表抽取数据

整个迁移流程包括2个job,4个transform。

具体如下:

1.总的Job:

2.获取表名流程的转换:

3.子job表数据抽取作业

3.1转换 表名变量设置

 

3.2转换 创建表结构

表输入如下,注意:这里的查询必须要查询出数据才行,不然后面会无法获取表结构来创建表

(有些人说这里加个条件where 1=2,不需要数据只需要表结构,我自己测试,发现这样无法获取到数据,后面的java脚本中可以打印这些信息,加了条件会报错,打印信息为null)

java脚本:


    public boolean processRow(StepMetaInterface smi, StepDataInterface sdi) throws KettleException
    {
    	// First, get a row from the default input hop
    	//
    	Object[] r = getRow();
		//logBasic("r.size="+r.length);
   		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("testb".equalsIgnoreCase(dbmeta.getName()))
    			{
					logBasic("数据库连接名为:"+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)
    			{
					logBasic("data.inputRowMeta="+data.inputRowMeta);
    				String sql = db.getDDL(tablename, data.inputRowMeta);//${TABLENAME}
					logBasic("sql="+sql);
    				db.execStatement(sql.replace(";", ""));
    				logBasic(sql);
    			}
    		}catch(Exception e){
    			logError("创建表出现异常",e);
    		}finally{
    			db.disconnect();
    		}
    	}
    	return false;
	} 

3.3数据抽取

运行结果:

2017/07/24 15:16:25 - Spoon - 正在开始任务...
2017/07/24 15:16:25 - 数据库迁移作业 - 开始执行任务
2017/07/24 15:16:25 - 数据库迁移作业 - 开始项[获取表名流程]
2017/07/24 15:16:25 - 源表名称获取 - 为了转换解除补丁开始  [源表名称获取]
2017/07/24 15:16:25 - 表输入.0 - Finished reading query, closing connection.
2017/07/24 15:16:25 - 表输入.0 - 完成处理 (I=2, O=0, R=0, W=2, U=0, E=0)
2017/07/24 15:16:25 - 字段选择.0 - 完成处理 (I=0, O=0, R=2, W=2, U=0, E=0)
2017/07/24 15:16:25 - 复制记录到结果.0 - 完成处理 (I=0, O=0, R=2, W=2, U=0, E=0)
2017/07/24 15:16:25 - 数据库迁移作业 - 开始项[表数据抽取作业]
2017/07/24 15:16:25 - 表数据抽取子作业 - 开始项[表明成变量设置]
2017/07/24 15:16:25 - 将记录中的表名设置为变量 - 为了转换解除补丁开始  [将记录中的表名设置为变量]
2017/07/24 15:16:25 - 从结果获取记录.0 - 完成处理 (I=0, O=0, R=1, W=1, U=0, E=0)
2017/07/24 15:16:25 - 设置变量.0 - Setting environment variables...
2017/07/24 15:16:25 - 设置变量.0 - Set variable TABLENAME to value [TESTM]
2017/07/24 15:16:25 - 设置变量.0 - Finished after 1 rows.
2017/07/24 15:16:25 - 设置变量.0 - 完成处理 (I=0, O=0, R=1, W=1, U=0, E=0)
2017/07/24 15:16:25 - 表数据抽取子作业 - 开始项[创建表结构]
2017/07/24 15:16:25 - 创建表结构 - 为了转换解除补丁开始  [创建表结构]
2017/07/24 15:16:26 - 表输入.0 - Finished reading query, closing connection.
2017/07/24 15:16:26 - 创建入库表结构.0 - 数据库连接名为:testb
2017/07/24 15:16:26 - 表输入.0 - 完成处理 (I=1, O=0, R=0, W=1, U=0, E=0)
2017/07/24 15:16:26 - 创建入库表结构.0 - 开始创建表:TESTM
2017/07/24 15:16:26 - 创建入库表结构.0 - data.inputRowMeta=[ID String(10)], [NAME String(200)], [AGE BigNumber], [ADDRESS String(200)]
2017/07/24 15:16:26 - 创建入库表结构.0 - sql=CREATE TABLE TESTM
2017/07/24 15:16:26 - 创建入库表结构.0 - (
2017/07/24 15:16:26 - 创建入库表结构.0 -   ID VARCHAR2(10)
2017/07/24 15:16:26 - 创建入库表结构.0 - , NAME VARCHAR2(200)
2017/07/24 15:16:26 - 创建入库表结构.0 - , AGE NUMBER
2017/07/24 15:16:26 - 创建入库表结构.0 - , ADDRESS VARCHAR2(200)
2017/07/24 15:16:26 - 创建入库表结构.0 - )
2017/07/24 15:16:26 - 创建入库表结构.0 - ;
2017/07/24 15:16:26 - 创建入库表结构.0 - CREATE TABLE TESTM
2017/07/24 15:16:26 - 创建入库表结构.0 - (
2017/07/24 15:16:26 - 创建入库表结构.0 -   ID VARCHAR2(10)
2017/07/24 15:16:26 - 创建入库表结构.0 - , NAME VARCHAR2(200)
2017/07/24 15:16:26 - 创建入库表结构.0 - , AGE NUMBER
2017/07/24 15:16:26 - 创建入库表结构.0 - , ADDRESS VARCHAR2(200)
2017/07/24 15:16:26 - 创建入库表结构.0 - )
2017/07/24 15:16:26 - 创建入库表结构.0 - ;
2017/07/24 15:16:26 - 创建入库表结构.0 - 完成处理 (I=0, O=0, R=1, W=0, U=0, E=0)
2017/07/24 15:16:26 - 表数据抽取子作业 - 开始项[数据抽取]
2017/07/24 15:16:26 - 数据迁移 - 为了转换解除补丁开始  [数据迁移]
2017/07/24 15:16:26 - 表输出.0 - Connected to database [testb] (commit=1000)
2017/07/24 15:16:26 - 表输入.0 - Finished reading query, closing connection.
2017/07/24 15:16:26 - 表输入.0 - 完成处理 (I=3, O=0, R=0, W=3, U=0, E=0)
2017/07/24 15:16:26 - 表输出.0 - 完成处理 (I=0, O=3, R=3, W=3, U=0, E=0)
2017/07/24 15:16:26 - 表数据抽取子作业 - 完成作业项[数据抽取] (结果=[true])
2017/07/24 15:16:26 - 表数据抽取子作业 - 完成作业项[创建表结构] (结果=[true])
2017/07/24 15:16:26 - 表数据抽取子作业 - 完成作业项[表明成变量设置] (结果=[true])
2017/07/24 15:16:26 - 表数据抽取子作业 - 开始项[表明成变量设置]
2017/07/24 15:16:26 - 将记录中的表名设置为变量 - 为了转换解除补丁开始  [将记录中的表名设置为变量]
2017/07/24 15:16:26 - 从结果获取记录.0 - 完成处理 (I=0, O=0, R=1, W=1, U=0, E=0)
2017/07/24 15:16:26 - 设置变量.0 - Setting environment variables...
2017/07/24 15:16:26 - 设置变量.0 - Set variable TABLENAME to value [TESTN]
2017/07/24 15:16:26 - 设置变量.0 - Finished after 1 rows.
2017/07/24 15:16:26 - 设置变量.0 - 完成处理 (I=0, O=0, R=1, W=1, U=0, E=0)
2017/07/24 15:16:26 - 表数据抽取子作业 - 开始项[创建表结构]
2017/07/24 15:16:26 - 创建表结构 - 为了转换解除补丁开始  [创建表结构]
2017/07/24 15:16:26 - 表输入.0 - Finished reading query, closing connection.
2017/07/24 15:16:26 - 表输入.0 - 完成处理 (I=1, O=0, R=0, W=1, U=0, E=0)
2017/07/24 15:16:26 - 创建入库表结构.0 - 数据库连接名为:testb
2017/07/24 15:16:26 - 创建入库表结构.0 - 开始创建表:TESTN
2017/07/24 15:16:26 - 创建入库表结构.0 - data.inputRowMeta=[ID String(10)], [NAME String(200)], [AGE BigNumber], [ADDRESS String(200)]
2017/07/24 15:16:26 - 创建入库表结构.0 - sql=CREATE TABLE TESTN
2017/07/24 15:16:26 - 创建入库表结构.0 - (
2017/07/24 15:16:26 - 创建入库表结构.0 -   ID VARCHAR2(10)
2017/07/24 15:16:26 - 创建入库表结构.0 - , NAME VARCHAR2(200)
2017/07/24 15:16:26 - 创建入库表结构.0 - , AGE NUMBER
2017/07/24 15:16:26 - 创建入库表结构.0 - , ADDRESS VARCHAR2(200)
2017/07/24 15:16:26 - 创建入库表结构.0 - )
2017/07/24 15:16:26 - 创建入库表结构.0 - ;
2017/07/24 15:16:26 - 创建入库表结构.0 - CREATE TABLE TESTN
2017/07/24 15:16:26 - 创建入库表结构.0 - (
2017/07/24 15:16:26 - 创建入库表结构.0 -   ID VARCHAR2(10)
2017/07/24 15:16:26 - 创建入库表结构.0 - , NAME VARCHAR2(200)
2017/07/24 15:16:26 - 创建入库表结构.0 - , AGE NUMBER
2017/07/24 15:16:26 - 创建入库表结构.0 - , ADDRESS VARCHAR2(200)
2017/07/24 15:16:26 - 创建入库表结构.0 - )
2017/07/24 15:16:26 - 创建入库表结构.0 - ;
2017/07/24 15:16:26 - 创建入库表结构.0 - 完成处理 (I=0, O=0, R=1, W=0, U=0, E=0)
2017/07/24 15:16:26 - 表数据抽取子作业 - 开始项[数据抽取]
2017/07/24 15:16:26 - 数据迁移 - 为了转换解除补丁开始  [数据迁移]
2017/07/24 15:16:26 - 表输出.0 - Connected to database [testb] (commit=1000)
2017/07/24 15:16:26 - 表输入.0 - Finished reading query, closing connection.
2017/07/24 15:16:26 - 表输入.0 - 完成处理 (I=3, O=0, R=0, W=3, U=0, E=0)
2017/07/24 15:16:27 - 表输出.0 - 完成处理 (I=0, O=3, R=3, W=3, U=0, E=0)
2017/07/24 15:16:27 - 表数据抽取子作业 - 完成作业项[数据抽取] (结果=[true])
2017/07/24 15:16:27 - 表数据抽取子作业 - 完成作业项[创建表结构] (结果=[true])
2017/07/24 15:16:27 - 表数据抽取子作业 - 完成作业项[表明成变量设置] (结果=[true])
2017/07/24 15:16:27 - 数据库迁移作业 - 开始项[成功]
2017/07/24 15:16:27 - 数据库迁移作业 - 完成作业项[成功] (结果=[true])
2017/07/24 15:16:27 - 数据库迁移作业 - 完成作业项[表数据抽取作业] (结果=[true])
2017/07/24 15:16:27 - 数据库迁移作业 - 完成作业项[获取表名流程] (结果=[true])
2017/07/24 15:16:27 - 数据库迁移作业 - 任务执行完毕
2017/07/24 15:16:27 - Spoon - 任务已经结束.

 

© 著作权归作者所有

共有 人打赏支持
影非弦
粉丝 4
博文 5
码字总数 3621
作品 0
海淀
程序员
Kettle实现数据库迁移

需求: 做数据仓库时,需要将业务系统CRM抽取到数据仓库的缓冲层,业务系统使用的是SqlServer数据库,数据仓库的缓冲层使用的是mysql数据库,为实现数据库的迁移,即将SqlServer数据库中的所有...

Zero零_度 ⋅ 2016/11/16 ⋅ 0

数据迁移实战:基于Kettle的Mysql到DB2的数据迁移

一、什么是ETL ETL,是英文 Extract-Transform-Load 的缩写,用来描述将数据从来源端经过抽取(extract)、转换(transform)、加载(load)至目的端的过程。ETL一词较常用在数据仓库,但其对...

十月阳光 ⋅ 2015/11/04 ⋅ 2

使用Kettle导入Excel数据

使用Kettle导入Excel数据 曾静的技术博客2017-08-2022 阅读 导入数据kettleExcel ETL(Extraction, Transformation, and Loading),在日常的工作中我们经常会遇到各种数据的处理,转换,迁移...

曾静的技术博客 ⋅ 2017/08/20 ⋅ 0

数据迁移,急用,请高手指教

通过kettle实现数据库的迁移后,能否使用kettle检查迁移后的数据与源数据库的数据内容相同?

robert.feng ⋅ 2011/12/12 ⋅ 4

ETL利器Kettle实战应用解析系列一【Kettle使用介绍】

一、ETL利器Kettle实战应用解析系列一【Kettle使用介绍】 二、ETL利器Kettle实战应用解析系列二 【应用场景和实战DEMO下载】 三、ETL利器Kettle实战应用解析系列三 【ETL后台进程执行配置方式...

李丁玲 ⋅ 2016/03/04 ⋅ 0

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

需求: 1.你是否遇到了需要将mysql数据库中的所有表与数据迁移到Oracle。 2.你是否还在使用kettle重复的画着:表输入-表输出、创建表,而烦恼。 下面为你实现了一套通用的数据库迁移流程。 ...

如月王子 ⋅ 2014/09/17 ⋅ 5

技术攻关举例

1、幼儿园接口服务器处理幼儿签到的14种业务 使用了模板设计模式(定义处理流程,类似collection框架)+工厂模式(生产处理器)。数据由一个入口进入业务系统,然后转发器根据每个业务场景的...

十月阳光 ⋅ 2016/01/22 ⋅ 2

Win7下Kettle-7.0安装部署

1、Kettle概念 Kettle是一款国外开源的ETL工具,纯java编写,可以在Window、Linux、Unix上运行,绿色无需安装,数据抽取高效稳定。 Kettle 中文名称叫水壶,该项目的主程序员MATT 希望把各种...

zisheng_wang_data ⋅ 2017/03/10 ⋅ 0

开源 ETL 工具 - Kettle

Kettle 是一款国外开源的 ETL 工具,纯 Java 编写,绿色无需安装,数据抽取高效稳定(数据迁移工具)。Kettle 中有两种脚本文件,transformation 和 job,transformation 完成针对数据的基础转...

匿名 ⋅ 2009/09/10 ⋅ 10

求助kettle数据迁移的时候,怎么动态的在目标数据库中建新表

例如,源数据库有表T,现在需要通过KETTLE迁移到目标数据库中,按照每天保存一张表,如T20141204,T20141205这样,请问在KETTLE中怎么去动态的根据日期建一个新表呢...

小东仔 ⋅ 2014/12/04 ⋅ 0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

个人博客的运营模式能否学习TMALL天猫质量为上?

心情随笔|个人博客的运营模式能否学习TMALL天猫质量为上? 中国的互联网已经发展了很多年了,记得在十年前,个人博客十分流行,大量的人都在写博客,而且质量还不错,很多高质量的文章都是在...

原创小博客 ⋅ 今天 ⋅ 0

JavaScript零基础入门——(十一)JavaScript的DOM操作

JavaScript零基础入门——(十一)JavaScript的DOM操作 大家好,欢迎回到我们的JavaScript零基础入门。最近有些同学问我说,我讲的的比书上的精简不少。其实呢,我主要讲的是我在开发中经常会...

JandenMa ⋅ 今天 ⋅ 0

volatile和synchronized的区别

volatile和synchronized的区别 在讲这个之前需要先了解下JMM(Java memory Model :java内存模型):并发过程中如何处理可见性、原子性、有序性的问题--建立JMM模型 详情请看:https://baike.b...

MarinJ_Shao ⋅ 今天 ⋅ 0

深入分析Kubernetes Critical Pod(一)

Author: xidianwangtao@gmail.com 摘要:大家在部署Kubernetes集群AddOn组件的时候,经常会看到Annotation scheduler.alpha.kubernetes.io/critical-pod"="",以表示这是一个关键服务,那你知...

WaltonWang ⋅ 今天 ⋅ 0

原子性 - synchronized关键词

原子性概念 原子性提供了程序的互斥操作,同一时刻只能有一个线程能对某块代码进行操作。 原子性的实现方式 在jdk中,原子性的实现方式主要分为: synchronized:关键词,它依赖于JVM,保证了同...

dotleo ⋅ 今天 ⋅ 0

【2018.06.22学习笔记】【linux高级知识 14.4-15.3】

14.4 exportfs命令 14.5 NFS客户端问题 15.1 FTP介绍 15.2/15.3 使用vsftpd搭建ftp

lgsxp ⋅ 今天 ⋅ 0

JeeSite 4.0 功能权限管理基础(Shiro)

Shiro是Apache的一个开源框架,是一个权限管理的框架,实现用户认证、用户授权等。 只要有用户参与一般都要有权限管理,权限管理实现对用户访问系统的控制,按照安全规则或者安全策略控制用户...

ThinkGem ⋅ 昨天 ⋅ 0

python f-string 字符串格式化

主要内容 从Python 3.6开始,f-string是格式化字符串的一种很好的新方法。与其他格式化方式相比,它们不仅更易读,更简洁,不易出错,而且速度更快! 在本文的最后,您将了解如何以及为什么今...

阿豪boy ⋅ 昨天 ⋅ 0

Python实现自动登录站点

如果我们想要实现自动登录,那么我们就需要能够驱动浏览器(比如谷歌浏览器)来实现操作,ChromeDriver 刚好能够帮助我们这一点(非谷歌浏览器的驱动有所不同)。 一、确认软件版本 首先我们...

blackfoxya ⋅ 昨天 ⋅ 0

线性回归原理和实现基本认识

一:介绍 定义:线性回归在假设特证满足线性关系,根据给定的训练数据训练一个模型,并用此模型进行预测。为了了解这个定义,我们先举个简单的例子;我们假设一个线性方程 Y=2x+1, x变量为商...

wangxuwei ⋅ 昨天 ⋅ 0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

返回顶部
顶部