需求:

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代码

kettle 导入MySQL 忽略外键 kettle数据库迁移_数据库连接

kettle 导入MySQL 忽略外键 kettle数据库迁移_数据库连接_02

kettle 导入MySQL 忽略外键 kettle数据库迁移_创建表_03

1. public boolean processRow(StepMetaInterface smi, StepDataInterface sdi) throws
2. {  
3. // First, get a row from the default input hop
4. //
5.     Object[] r = getRow();  
6.   
7.  null;  
8.       
9. //3.x中获取资源库的所有数据库连接信息用getDatabases();
10.       
11. if(list != null
12.     {  
13. for(int i=0;i<list.size();i++)  
14.         {  
15.             dbmeta = (org.pentaho.di.core.database.DatabaseMeta)list.get(i);  
16. //下面是目标库的数据库连接,大家可根据需要修改
17. if("mysql_test".equalsIgnoreCase(dbmeta.getName()))  
18.             {                 
19. break;  
20.             }  
21.         }  
22.     }  
23.   
24. if(dbmeta!=null)  
25.     {  
26. new
27.           
28. try
29.         {  
30.             db.connect();  
31.   
32. "TABLENAME");  
33.   
34. "开始创建表:"
35.               
36. if(tablename!=null && tablename.trim().length()>0)  
37.             {  
38. //${TABLENAME}
39.                               
40. ";", ""));  
41.   
42.                 logBasic(sql);  
43.             }  
44.         }  
45. catch(Exception e)  
46.         {             
47. "创建表出现异常",e);   
48.               
49. finally{  
50.             db.disconnect();  
51.         }  
52.     }  
53. return false;  
54. }

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下完成的,附件里面可下载完整流程。