用Kettle的一套流程完成对整个数据库迁移
2015-12-16 00:00
344 查看
摘要: 用Kettle的一套流程完成对整个数据库迁移
KETTLE
数据交换
KETTLE
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。
下面代码是创建目标库表。
Java代码
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的一套流程完成对整个数据库迁移
博客分类:KETTLE
数据交换
KETTLE
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。
下面代码是创建目标库表。
Java代码
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,即可,本人亲测。
相关文章推荐
- ClassNotFoundException:com.mysql.jdbc.Driver
- redis学习笔记---redis的哨兵Sentinel
- PostgreSQL 使用心得(1)
- ORACLE会使索引失效的条件
- mongodb使用备忘
- django 连接mysql
- 数据库技术的产生与发展
- 数据库索引
- 删除EM,强制结束EM进程后,启动数据库ORA-00119,ORA-00132报错的解决方法
- redis相关
- ORACLE 查询被锁住的对象,并结束其会话的方法
- oracle ORA-00031:session marked for kill(标记要终止的会话)解决方法
- SQL注入与防范(PreparedStatement的优点)----JDBC-3
- 安卓sqlite数据库中sql语句的问题
- sql server中区分大小写问题
- 关于重命名sql server数据库名的错误
- OS X下安装Redis及配置开机启动
- MySQL安装--ubuntu
- My SQL ON DUPLICATE KEY UPDATE
- 数据库的配置文件注释