下面是试验的主要步骤:

在上一篇文章中LZ已经介绍了,实验的环境和实验目的。

在本篇文章中主要介绍侧重于对Kettle ETL的相应使用方法,

在这里LZ需要说明一下,LZ成为了避免涉及索引和表连接等操作,

在数据库mysql中重新创建一个不带有索引和外键约束的 customers数据库表。

但数据集合不变。

所以在后文中国使用,mysql.customers来代替前篇文章中的test.customers。

下面的截图是使用Spoon工具来整体对这个流程的描述:

(图)

首先需要使用Kettle来建立两个对数据库数据源的连接:

如图所示: 其中我们所使用的:classicmodels.customers(数据库名.表名)

这张表对应的数据源连接名称是: MysqlConn1 创建数据源连接MysqlConn1如下图所示:

而需要与classicmodels.customers做数据同步的表mysql.customers(数据库名.表名) 这个对应的连接是:

MysqlConn2。 在Spoon中创建MysqlConn2的截图如下所示:

在创建数据库连接之后,需要在相应的transformation中 拽入表输入这一个step。

因为是关于不同数据库中的数据表做数据同步,

所以数据流的流动方向是,

从mysql.customers表中出来,

一一与classicmodels.customers表中的每个记录进行比较等等操作。

而它们来自于不同的数据源的两张表, 所以需要两个表输入(step),

每一个step对应的是kettle源码中的 不同的类,而你从工具栏中将相应的step拖到工作区间的时候,

实质上是完成了,对类对象的实例化操作。

为了方便记忆,把classicmodels.customers对应的那个表输入命名为 classicmodels.customers;

而把mysql.customers对应的那个表输入step重新命名为mysql.customers(这里命名是随意的,是为了方便记忆,

当然读者还可以根据个人的习惯,比如顺便标志出哪一个是 旧数据源,哪一个是新数据源,等等)

具体的操作如下图所示:

在这里仅选取针对于classicmodels.customers这一个表输出进行讲述(二者的设置过程是一样的):

在这里需要注意的是,首先应该从下拉菜单中选取与之对应的数据源连接,

然后千万不能忘到此仅仅完成的是对数据库的选取,

接下来需要点击“获取SQL查询语句”

一次来选取这个数据源主要是针对数据库的那个表进行抽取数据的。

然后呢,从核心对象工具栏中选择出来,合并记录的Step,

将其拖拽到对应的工作区域,并将俩个表输入step与之相连接

(hop指的是用于连接两个step的矢量连线)。

接下来就是根据实验要求对合并记录进行相应的设定,具体的操作请看截图:

在这里面需要说明的是, 弹出窗口的第一个选项: 旧数据源应该是需要被同步的,就是里面的数据比较陈旧, 需要根据新数据源中的数据进行调整。

而新数据源,在实际的应用中指的是每天或是定期获取的最新数据所对应的数据源。

旧数据源通常是根据新数据源进行相应的增、删、改等一系列操作的。

对于所测试的数据,我是这样想的, 首先应该自己先想好,测试的情况应该大致分为几种情况。

然后根据相应的情况来自己来写一些少量的几条简单的数据集合。

进行测试, 待到得到想要的结果之后,这个时候基本上你的step设计已经完成了, 这样再在这个transformation上面来跑比较大的数据集的话就比较能考到结果了。

跑大的数据集

一个是可以找到一些你自己之前没有考虑到的情况,

二就是可以可以很容易看出来到底数据是在哪一个step的上面 耗费的时间比较长,

可以针对耗时比较长的step作相应的优化处理。

进行step替换或是其他的一些脚本什么的(抱歉,这里LZ暂时也不没有亲自试验验证)预先处理的方法。

其实提高同步数据效率它的主旨就是减少需要处理的数据,

所以在进行同步数据处理之前,

可以调用一些分支step来过滤或是删除一些重复的数据等等。

具体情况是需要具体的分析的。

这里需要说明一下的就是:Kettle中的合并记录这一个Step是这样的:

源库是不提供保存增删改信息的,

而Kettle会提供一种用于 对比输入的新旧两个数据源,

通过关键字进行逐个比较每条记录。

会根据具体的比对的出一下的四种返回值, 而且这四个返回值的类型是String字符串类型, 是的,没错,因为Kettle就是使用Java实现的,

所以一些变量直接与Java中的数据类型是直接对应的。

1、"identical":它对应的是关键字在新旧数据源中, 都是一致的,并且该关键字所在的记录的各个字段的域值相同的话,

则对旧数据源所对应的数据表不做任何处理。

2."changed":关键字在新旧数据源中都是存在的,但是关键字所对应的 记录的域值是不相同的,

这是要将旧数据源依照新数据源做更新操作。

3."new": 旧数据源所对应的数据表中没有与新数据源表中出现的关键字匹配的话,

则将该新数据源关键字对应的记录插入到旧数据源对应的数据表中。

4."deleted": 在旧数据源数据表中的关键字与新数据源表中的所有关键字都是不匹配的。

这种情况就需要把旧数据源中的该关键字对应的那条记录从旧数据源表中删除。

所需要进行匹配的关键字段是新旧记录源的主键所在字段, 而所要进行修改和更新的字段是旧数据库中的所有字段。

为了确保程序的正常进行, 可以先针对合并记录这个step先快速启动一下,

下图是启动合并记录之后,相应的返回值截图:

由于记录有点长,所以只截取了对应的changed、deleted、identical、 这四个所对应的字段。

刚刚好和设想的是一致的。(也就是说与LZ设计的数据表中的数据值,详情请看前一篇实验环境搭建,其实说不上是设计,就是简单修改几个数吧...呵呵)

而就像上面所讲述的一样,合并记录在执行之后返回{identical,changed,deleted,new}这四种String的值。

而后续的synchronize after merge 这个step会根据接收到的 这四种不同的String做出相应的对旧数据源的{增、删除、更新、或是不动} 这四种操作。

既然这一步得到了与设想一直的结果, 那么继续向下使能合并记录到同步数据之间的hop吧~

正如想象的一样, 数据被成功的从新数据源对应的classicmodel.customers中 同步到旧数据源对应的mysql.customers数据表中。

下图是整体的运行时间截图:

你看,mysql.customers对应写的是10条LZ改写的数据。

而classicmodel.customers对应的是我们从第三方下载的数据集合进行简化之后,

所得到的的数据集中的记录数目。

接下来将要实验的是,针对有索引和外键还有各种约束进行数据同步中所需要采用的方法。

其实,数据库中的数据表在实际的情况下,真的是各种关联,并且是牵一发而动全身的。

所以,还是继续学习吧,加油啦,米娜~

Kettle 实现mysql数据库不同表之间数据同步——实验过程的更多相关文章

  1. Oracle 通过dblink和job方式实现两个数据库表之间数据同步

    需求是需要将Database_A中的dev_test表中的数据同步到Database_B中的dev_test表中. 因为是通过Database_B去同步Database_A库中的数据,所以操作都建立在 ...

  2. [MySQL数据库之表的约束条件:primary key、auto_increment、not null与default、unique、foreign key:表与表之间建立关联]

    [MySQL数据库之表的约束条件:primary key.auto_increment.not null与default.unique.foreign key:表与表之间建立关联] 表的约束条件 约束 ...

  3. Vc数据库编程基础MySql数据库的表增删改查数据

    Vc数据库编程基础MySql数据库的表增删改查数据 一丶表操作命令 1.查看表中所有数据 select * from 表名 2.为表中所有的字段添加数据 insert into 表名( 字段1,字段2 ...

  4. MySQL的入门与使用,sqlyog对数据库,表和数据的管理

    MySQL的入门 1.到mysql官网下载. 2.安装mysql软件(一定要放到英文路径下) 3.使用 验证是否成功 将mySQL的bin路径添加到系统环境变量Path中 打开dos命令窗口 Wind ...

  5. 将MySQL一张表的数据迁移到MongoDB数据库的Java代码示例

    Java代码: package com.zifeiy.snowflake.handle.etl.mongodb; import java.sql.Connection; import java.sql ...

  6. linux mysql 数据库操作导入导出 数据表导出导入

    linux mysql 数据库操作导入导出 数据表导出导入 1,数据库导入 mysql -uroot -p show databases; create database newdb; use 数据库 ...

  7. MySQL数据库如何解决大数据量存储问题

    利用MySQL数据库如何解决大数据量存储问题? 各位高手您们好,我最近接手公司里一个比较棘手的问题,关于如何利用MySQL存储大数据量的问题,主要是数据库中的两张历史数据表,一张模拟量历史数据和一张开 ...

  8. MySQL数据库使用mysqldump导出数据详解

    mysqldump是mysql用于转存储数据库的实用程序.它主要产生一个SQL脚本,其中包含从头重新创建数据库所必需的命令CREATE TABLE INSERT等.接下来通过本文给大家介绍MySQL数 ...

  9. Vc数据库编程基础MySql数据库的表查询功能

    Vc数据库编程基础MySql数据库的表查询功能 一丶简介 不管是任何数据库.都会有查询功能.而且是很重要的功能.上一讲知识简单的讲解了表的查询所有. 那么这次我们需要掌握的则是. 1.使用select ...

随机推荐

  1. linux解压命令

    .tar 解包:tar xvf FileName.tar打包:tar cvf FileName.tar DirName(注:tar是打包,不是压缩!)———————————————.gz解压1:gun ...

  2. ubuntu下virtualbox使用u盘

    1.virtualbox中使用u盘流程 以下是使用U盘的整个流程(参考了网络上其他人的教程,亲测可用): 添加当前用户为vboxusers一员 终端输入:cat /etc/group |grep vb ...

  3. JAVA程序,SESSION没有关闭导致数据库异常

    可以看到连接到数据库的机器名为perass: PROCESS 1234表示是JDBC的进程 查询SQL: select username,         machine,         statu ...

  4. 译文:TransactionScope 与 Async/Await

    你可能不知道这一点,在 .NET Framework 4.5.0  版本中包含有一个关于 System.Transactions.TransactionScope 在与 async/await 一起工 ...

  5. bzoj2064

    这道题初看真的毫无思路,又是合并又是分裂的 但实际上我们知道,当两组和相等的时候才能由一组变成另一组 我们将初始状态和最终状态划分成若干对,每对中的两组元素和相等的 不难发现,最少步骤=n+m-2*对 ...

  6. 关于The APR based Apache Tomcat Native library警告

    今天在Eclipse上配置Tomcat7,启动时看到如下警告信息: The APR based Apache Tomcat Native library which allows optimal pe ...

  7. MYSQL删除以数字开头的字段

    例子: // 删除以0开头的字段 DELETE FROM `week_energy_copy` WHERE openid like '0%'; // 删除以数字开头的字段 DELETE FROM `w ...

  8. 双11不再孤单,结识ECharts---强大的常用图表库

    又是一年双十一,广大单身狗们有没有很寂寞(好把,其实我也是)!但是这次的双十一,我不再孤单,因为结识了一个js的强大的图表库---ECharts. 最近做软件工程项目的时候,由于设计图中有柱状图和饼图 ...

  9. java 打包插件

    是时候闭环Java应用了 原创 2016-08-16 张开涛  你曾经因为部署/上线而痛苦吗?你曾经因为要去运维那改配置而烦恼吗?在我接触过的一些部署/上线方式中,曾碰到过以下一些问题: 1.程序代码 ...

  10. 如何仿写thinkphp的C方法?

    config.php代码如下: <?php return array( 'db_user'=>'root', 'db_pass'=>'root', 'db_name'=>'te ...