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

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

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

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

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

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

注意:

针对MySql,以上“表输入”的SQL语句为 show tables,但是该语句查询出的结果包含视图(View),因此后续步骤向该语句查询出的表中插入数据时会报错。

如果所要迁移的库中存在视图,可以使用以下语句来查询所有需要迁移的表:

select TABLE_NAME
  from information_schema. TABLES
 where TABLE_SCHEMA = ‘数据库名‘
   and TABLE_TYPE = ‘BASE TABLE‘

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,即可,本人亲测。

Kettle 数据库迁移示例.rar  115网盘礼包码:5lbd26pc02pj

时间: 2024-08-14 03:34:34

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

kettle插件加载流程

kettle插件加载流程 1.前言 kettle遵循着插件机制,基于插件使得kettle整个结构非常清晰,耦合性低,移植性强,特别是对kettle进行二次开发尤其方便,根据个人了解,扩展step类型的插件比较多,具体步骤可以参考:http://blog.csdn.net/d6619309/article/details/50020977  .通过了解插件的加载流程,不仅kettle的原理有深一层的认识,还有助于在进行二次开发遇到问题的时候进行定位(例如,最近遇到个情况就是通过kettle api

ZKWebFramework数据库迁移流程

主框架(ZKWebFramework)是根据程序集中DbContext进行数据库迁移的.例如YiMei.Main程序集:DbContext名称为:YiMeiMigrationDbContextYiMeiMigrationDbContext那类中有一个静态初始化函数{static YiMeiMigrationDbContext()} 函数中存有数据迁移的配置.Database.SetInitializer(            new MigrateDatabaseToLatestVersion

不难懂-----git一套流程

001.初始化仓库,创建git仓库 git init 002.配置个人信息 git config --global user.name <名字> --------->:配置用户名 git config --global user.email <邮箱>--------->:配置邮箱 git config --list --------->:查看配置信息 git config --global user.name --------->:查看用户名 git con

软件项目开发的一套流程

依据软件工程瀑布模型,软件开发步骤如下: 确定目标 明确需求 进行原型设计(包括交互设计.UI设计.美工等) 确定技术方案(如前后端接口设计.数据存储方案) 代码开发(涉及前端.后端.数据库) 前后端联调 系统测试(包括功能测试.性能测试) 项目上线部署运行 后期运维 原文地址:https://www.cnblogs.com/eslovez/p/12117907.html

ETL工具—Kettle数据的导入导出—Excel表到数据库

案例目的:当Excel中有几万条记录或者更多数据时,使用Kettle导入到数据库中.速度就能感到比复制粘贴快很多. 这里我会演示将"data.xlsx"表中数据有15万多条记录,使用Kettle导入到oracle数据库的testuser用户下. 准备工作:1.data.xlsx表: 2.testuser用户下要有一个与data.xlsx表结构(列数与字段类型)相同的表. 开始!!! 1.新建一个"转换",将"Excel输入"."表输出&

ESX环境打通2套SAN存储交换机实现数据迁移

因vmware集群升级,需要将旧集群存储中的数据迁移到新集群的存储中,要求热迁移,尽可能的不中断业务,或短时间中断.有多种实现方式:1.将2套SAN交换机级联,使2个平台主机能看到对方的存储.(部分SAN交换机不支持与外厂交换机互联,像浪潮5800. 支持的型号有浪潮5610,博科交换机等)2.使用一台服务器进行存储中转.3.使用SAN交换机直连对方的存储控制器. 如有其他更好的方式,欢迎留言交流. 原文地址:https://blog.51cto.com/gaodi2002/2353983

kettle将图片转换至二进制存储至数据库

本文就是分享下二进制文件(图片.txt文件等)在oracle和文件系统间的传输的转换示例. 转换示例如下图: 示例本身较简单,但很多人应该还是不太清楚怎么做,很多时候都是上网搜索,网上有关的就是通过javascript脚本入库,整体体验不太好,这里分享的这个示例是我和搞数据的朋友讨论慢慢弄出来的,在windows中文件图片在oracle和文件系统间相互传输都能正常打开.通过kettle自带的控件实现,很简单,主要就是控件属性的设置. 该示例测试mysql的结果是:文件入库没问题,图片入到mysq

移动端开发流程分享

1.由于产品及UI能力限制,不能达到理想状态,从以往项目开发中总结发现,在开发及测试周期中发现需求缺陷问题,需要花费大量的沟通成本,导致项目周期有所影响并严重影响开发效率和开发质量,解决方案:再产品需求.原型设计及UI阶段,开发需要严格把控质量,帮助产品提升交付件的质量 2.由于接口开发人员未讨论确定接口具体细节,接口需求方和接口开发者只通过文档修改,接口开发不按照规范执行,随意性太大,不能保证开发质量按时交付,导致接口需求方工期受到严重影响,从而移动端交付件质量得不到保证.为了解决接口问题:制

自媒体社群运营流程和框架之【定位】

群运营的流程和框架是一套通过自媒体运营项目的模式,它是借助各大自媒体平台的资源,通过专业领域的内容输出去提升自身品牌的知名度与用户的信任度,是一套互联网创业实战模式,是一套流程化的模式,是一套框架运营的模式. 这套模式价值非常巨大,而且很多个人和企业创业者通过套用这套模式,效益实现了数倍甚至数十倍的增长,昨天的文章已经把整套运营模式的流程和框架都分享出来了,如果需要的朋友可以进入我的主页去浏览我的历史纪录. 今天来给大家分享第一个流程之[定位] 所谓定位,针对于卫星定位,就是通过定位系统知道我们