首页 > 数据库 >6.kettle对整个数据库迁移

6.kettle对整个数据库迁移

时间:2023-03-13 16:02:45浏览次数:32  
标签:dbmeta db 数据库 kettle tablename job sql 迁移 null

需求:  将mysql数据库中的所有表与数据迁移到Oracle。     技术引导:  实现之初,在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.发现源表若存在有blob的表,会有问题,可能是由于表输出没有指定字段的原因,待解决。    5.x运行到创建表结构步骤报错,原因data.inputRowMeta为空,因为在第6步  在sql后面加上 where 1=2,导致表输入步骤没有抽取到记录,5.x里结构也变成了null。  解决:  把where 1=2去掉,然后,在表输入的限制行设置为1,即可

标签:dbmeta,db,数据库,kettle,tablename,job,sql,迁移,null
From: https://www.cnblogs.com/zhangdapangzo/p/17211725.html

相关文章

  • SQL SERVER PROFILER监听指定数据库
    SQLSERVERPROFILER监听指定数据库SQLServerProfiler监听指定数据库查询数据库IDSQLServerProfiler工具启动监听指定id的数据库 SQLSERVERPROFILER......
  • 数据库查询语句执行原理
    当程序猿输入一条查询语句的时候,具体MySQL数据库是如何处理的呢?如何使其能达到更快更好的查询呢?接下来这篇文章将为你解释这个原理。1.基本路线​ 首先假定我们使用了......
  • 2.kettle命令行使用说明
    Kettle命令行使用说明1.Kitchen——作业执行器(后缀名:kjb)是一个作业执行引擎,用来执行作业。这是一个命令行执行工具,参数说明如下。-rep:Repositoryname任务包所在存储......
  • 3.kettle使用
    Kettle遇到的问题Kettle基础kettle有两种保存方式:一种是资源库方式(数据库),一种是文件格式(XML)kettle有两种类型Transformation和Job,Transformation完成针对数据的基础转......
  • 5.kettle集群配置
    kettle安装配置http://wiki.pentaho.com/display/BAD/Extracting+Data+from+HDFS+to+Load+an+RDBMS安装Kettle需先安装jdk,配置环境变量,安装JDK时jdkbin和jre要在一个JD......
  • 4.kettle将数据加载到hadoop集群
    kettle将数据加载到hadoop集群1..将数据加载到HDFSa)启动Hadoop,创建Job,把文件放进Hadoopb)在桌面上打开PDI(kettle):选择“文件(file)”-“新建(new)”-“job”c)添加启动项......
  • 16.MySQL数据库之mysql-5.7 show engine innodb status 详解,常用的地方一、死锁分析 
     一、show engine innodb status 简介:show engine innodb status 是mysql提供的一个用于查看innodb引擎时间信息的工具,就目前来说有两处比较常用的地......
  • 傻瓜式Java操作MySQL数据库备份(使用mysqldump命令)
    傻瓜式Java操作MySQL数据库备份(使用mysqldump命令)注释都是由chatGPT生成,有什么问题可以评论交流@Value("${backup.sql.database}")privateStringdatabases;......
  • 达梦数据库linux下误删数据文件恢复
    达梦数据库linux下误删数据文件恢复数据找回分为两种方式,一种是利用数据迁移工具将数据迁移到新的正常的数据库实例上,一种是将删除的数据文件找回进行恢复,前提条件:数据文......
  • laravel 数据库原生使用方法DB 增删改查
    引入DB类ILLumnate\Support\Facades\DBdb查询语句DB::select("select*fromuser")db删除语句DB::delete("delete*fromuser")db修改语句DB::update("updateset......