利用excel文件增量同步一个库的数据并自动校正两端数据库条数不一致

利用excel文件增量同步一个库的数据并自动校正两端数据库条数不一致

现在有sqlserver和mysql两个库上的表在进行同步,sqlserver上的是源表,mysql上是目标表。
我们就把sqlserver上的数据同步到mysql上
mysql 是没有数据的。


sqlserver的三个表只是创建了表,没有数据的
在这里插入图片描述


1. 获取excel需要同步的表名(读取excel文件)

先创建一个excel内容格式如下:
在这里插入图片描述

保存好后,新建一个作业文件命名为"配置文件同步增量数据",在这个作业文件里创建一个转换控件命名为"获取excel里需要同步的表名",用来获取excel里需要同步的表信息在这里插入图片描述
接着创建一个转换文件命名为"1.读取需要同步的表数据",在这个转换文件里创建一个Excel输入控件和一个 复制记录到结果 控件 。excel输入的表格类型选择"Excel 2007 XLSX (Apache POI)"
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
将名为"1.读取需要同步的表数据"的转换文件保存后,回到名为"配置文件同步增量数据"的作业文件里选择名为"获取excel里需要同步的表名"的转换控件的具体路径
在这里插入图片描述


2. 循环处理每个表的增量数据同步

在名为"配置文件同步增量数据"的作业文件里再创建一个作业控件命名为"循环处理每个表增量同步"
在这里插入图片描述
然后我们就需要新建一个作业文件了,因为一个转换控件对应一个转换文件,一个作业控件对应一个作业文件。
这个作业控件我们可以命名为 “2.表数据增量同步”,内容如下6个步骤:
在这里插入图片描述


在2.1获取上一步的表名这个对应的文件里:

在这里插入图片描述

这个从结果获取记录需要我们去之前的excel输入控件里去复制粘贴,
这个设置变量可以直接点获取字段
在这里插入图片描述


在2.2获取上一次同步的时间这个对应的文件里:

---查询目标库上对应表在数据同步记录这张表上的最近一次同步日期
---这里是mysql的写法,其他数据库的写法照着改
---之前从excel输入控件里读取后就把记录复制到结果里了,excel的表头就成为了变量
SELECT IFNULL(MAX(TBSJ),'1990-01-01') AS TBSJ FROM SYSTEM_SJTBJL A 
WHERE TABLE_NAME='${TARGET_TABLE_NAME}' AND BCSLSFYZ='Y'

在这里插入图片描述

然后把查出来的每个表的对应的最新同步时间设置为变量。


在2.3同步表数据这个对应的文件里:

有一个表输入和表输出,我们不用更新插入的方式。因为更新插入的方式需要获取具体的表字段写死,每个表都不一样,所以我们使用表输入和表输出来同步。

---表输入:(这是sqlserver的语法)
---查出源表里更新日期大于目标表的最新一次同步时间的数据
SELECT * FROM ${SOURCE_TABLE_NAME} 
WHERE ${TIME_KEY}>CONVERT(varchar(100),substring('${TBSJ}',1,19),20)

在这里插入图片描述

在这里插入图片描述


在2.3.1获取sqlserver端表条数并设置变量里

在这里插入图片描述
count下sqlserver对应的表的条数设置变量
在这里插入图片描述


在2.3.2.获取mysql端表条数并设置变量里

在这里插入图片描述
count下mysql同步后对应的表的条数设置变量
在这里插入图片描述


在2.4记录每次同步的情况到数据同步日志表 这个对应的文件里:

在这里插入图片描述
这个转换里我们先把刚同步的记录写进SYSTEM_SJTBJL里,两端的数据表条数一不一致都不重要,我们只需要记录刚才同步表时的信息,一致为Y,不一致为N:

insert into SYSTEM_SJTBJL values(
'${TARGET_TABLE_NAME}',
now(),
if('${ts_sqlserver}'='${ts_mysql}','Y','N'),
'${ts_mysql}',
'${ts_sqlserver}'
);

在这里插入图片描述

插入了同步信息日志后,我们进到SYSTEM_SJTBJL里找此次同步表的最新一条同步记录的同步时间对应的bcslsfyz本次数量是否一致 的内容:

with t1 as(
select max(tbsj) sj
from SYSTEM_SJTBJL where table_name='${TARGET_TABLE_NAME}')select bcslsfyz from SYSTEM_SJTBJL a,t1 b
where table_name='${TARGET_TABLE_NAME}' and a.tbsj=b.sj

在这里插入图片描述

接下来找到后我们把它bcslsfyz设置成一个变量,让它bcslsfyz可以被switch控件使用:
在这里插入图片描述

在switch控件里:
在这里插入图片描述


不正确时清空表删除记录信息重新同步

在这里插入图片描述
在上面不正确时的操作接下来需要清空表 删除记录 然后重新同步:
在这里插入图片描述
删除SYSTEM_SJTBJL里数据不一致:

delete from SYSTEM_SJTBJL where table_name='${TARGET_TABLE_NAME}';

在这里插入图片描述
truncate清空表数据:

truncate table ${TARGET_TABLE_NAME};

在这里插入图片描述

在这里插入图片描述
2.6重新记录再次同步后的情况 这个文件里就只需要执行一个sql脚本

insert into SYSTEM_SJTBJL values(
'${TARGET_TABLE_NAME}',
now(),
if('${ts_sqlserver1}'='${ts_mysql1}','Y','N'),
'${ts_mysql1}',
'${ts_sqlserver1}'
);

在这里插入图片描述


最后

记得检查转换控件和作业控件的文件位置对不对,只有循环处理每个表增量同步这个作业控件要勾选"执行每一个输入行",因为每个表在excel里是一行一行保存读取的,所以这个相当是个循环处理,这也是为什么我们在循环处理每个表增量同步这个作业里写的都是变量来代替表名和字段名的。而获取excel需要同步的表名时不需要勾选,循环处理每个表增量同步这个作业控件对应的作业文件底下的转换控件也不用勾选。

在这里插入图片描述


所有都保存了后

在这里插入图片描述

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

我们执行主作业后
在这里插入图片描述

数据都有了 然后我们看到同步后的pep:
在这里插入图片描述

我们增加一条数据:
在这里插入图片描述
并把SYSTEM_SJTBJL里的pep数据改成N,条数也改成不一致:
在这里插入图片描述

此时kettle再获取时就会进入到不一致的流程删除所有关于这个表的数据,清空表再重新同步全量数据:
在这里插入图片描述

在这里插入图片描述

就可以看到执行了两次,一次是空表同步,然后增加了表数据使两端条数不一致,并模拟是正常不一致导致的使SYSTEM_SJTBJL的为N(手动修改模拟)。然后再执行同步程序,之后数据量就正常,且刚才被模拟的表数据记录同步的就只有一条,其他正常同步没有不一致条数的就都有两条。说明这个方案是可行的。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/720124.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

利用Python自动化日常任务

在快节奏的现代生活中,时间就是一切。幸运的是,Python提供了一系列强大的库和工具,可以帮助我们自动化那些乏味且重复的任务,从而释放我们的时间,让我们可以专注于更有创造性和有意义的工作。下面,我们将探…

【十】【SQL】合并查询和内连接

在实际应用中,为了合并多个select的执行结果,可以使用集合操作符 union ,union all Union 该操作符用于取得两个结果集的并集。当使用该操作符时,会自动去掉结果集中的重复行。 Union all 该操作符用于取得两个结果集的并集。…

【C++】 6-2 用动态分配空间的方法计算Fibonacci数列的前n项 分数 10

6-2 用动态分配空间的方法计算Fibonacci数列的前n项 分数 10 全屏浏览 切换布局 作者 刘利 单位 惠州学院 用动态分配空间的方法计算Fibonacci数列的前n项并存储到动态分配的存储空间中,然后按每行5个数列的格式输出结果 函数接口定义: void Fib ( …

6、Linux-服务管理、权限管理和授权(sudo权限)

一、服务管理 systemctl list-unit-files:查看服务systemctl start 服务名:启动服务systemctl stop 服务名:关闭服务systemctl restart 服务名:重启服务systemctl status 服务名:查看服务状态systemctl enable 服务名…

phpspreadsheet 读取excel 获取日期时间变成浮点数

Excel存储日期和时间作为小数值。 日期是从 1900 年开始的天数,时间是一天的部分,右边的小数部分。 为了将这种形式的日期和时间转换为 PHP 日期和时间,我们可以使用 PhpSpreadsheet 提供的一个工具方法:PhpOffice\PhpSpreadshee…

BioTech - 药物晶型预测与剂型设计 概述

欢迎关注我的CSDN:https://spike.blog.csdn.net/ 本文地址:https://blog.csdn.net/caroline_wendy/article/details/136441046 药物晶型预测与剂型设计是指利用计算机模拟和优化药物分子在固态形式下的结构、性质和稳定性,以及与制剂工艺和质…

Python实现微信电脑版微信支付收款监听及支付回调通知

摘要 为什么要监听收款?那是因为现在还有人在使用微信的收款码、商业码、赞赏码实现免签支付,这类实现方法的最终方案还是监听收款结果。 技术原理 通过Python实时解析微信电脑版控件的文本内容来获取信息。不需要Hook和抓包,也不是走任何…

[DevOps云实践] 跨AWS账户及Region调用Lambda

[DevOps云实践] 跨AWS账户及Region调用Lambda 本文將幫大家理清一下幾個問題: 如何跨不同AWS賬戶,不同Region來調用Lambda? 不同Lambda之間如何互相調用?有時我們希望我們的Lambda脚本能夠運行在多個AWS賬戶中的不同Region下,但是,我們還不希望每個下面都去建立一個運行…

[python] dataclass 快速创建数据类

在Python中,dataclass是一种用于快速创建数据类的装饰器和工具。自Python 3.7起,通过标准库中的dataclasses模块引入。它的主要目的是简化定义类来仅存储数据的代码量。通常,这样的类包含多个初始化属性,但没有复杂的方法&#xf…

剑指offer面试题23 从上往下打印二叉树

考察点 树的遍历知识点 题目 分析 题目要求从上到下打印二叉树,类似这种题目的思路就是用归纳法,通过一些例子找到数据的规律找一个合适的数据结构,这道题目很明显不能按照树的三种遍历方式去解,要按照6,10&#xf…

【NR 定位】3GPP NR Positioning 5G定位标准解读(二)

目录 前言 2. UE定位方法的作用 3. 标准UE定位方法 3.1 引言 3.2 网络辅助的GNSS方法 3.3 OTDOA定位 3.4 增强小区ID方法 3.5 气压传感器定位 3.6 WLAN定位 3.7 蓝牙定位 3.8 TBS定位 3.9 运动传感器定位 3.10 NR增强小区ID方法 3.11 多RTT定位 3.12 DL-AoD定位…

大厂求职者必看!如何用简单工厂模式征服面试官?

「面试官」: 您好!今天我们将探讨简单工厂模式。首先,您能解释一下什么是简单工厂模式吗? 「求职者」: 当然,简单工厂模式是一种创建对象的设计模式,「它通过一个单独的工厂类来决定实例化哪一个继承类。这个模式能够解…

Qt程序设计-批量读取文本文件并修改保存

本文实例演示Qt中如何批量读取文本文件并修改保存。 创建控制台项目添加如下代码 #include <QCoreApplication> #include <QDirIterator> #include <QTextStream>int main(int argc, char *argv[]) {QCoreApplication a(argc, argv);// 设置要处理的目录路…

温湿度传感器SHT21

SHT21是一款基于IIC的温湿度传感器&#xff0c;它的引脚及定义如下&#xff1a; 标准的IIC器件&#xff0c;没有其他多余的引脚&#xff0c;应用框图如下&#xff1a; 温度的测量范围是-40到125℃&#xff0c;湿度测量范围0-100%RH&#xff0c;具体参数及采样精度见下图&#x…

HM_2019在面积不变情况下编辑网格

首先&#xff0c;应该保存其形状&#xff0c;计算他的面积。让面积不变作为一个约束&#xff0c;然后进行网格的形变。

面试官:你知道几种数组扁平化的方法?

面试官&#xff1a;你知道几种数组扁平化的方法&#xff1f; 数组扁平化相信不少掘友在一些面试中被问到过&#xff0c;这在我们日常编程中也是一个常规操作&#xff0c;它需要我们将一个多维数组转化成一个一维数组。当然&#xff0c;我相信很多掘友都能回答上这个问题&#x…

【网站项目】154大学生创新创业平台竞赛管理子系统

&#x1f64a;作者简介&#xff1a;拥有多年开发工作经验&#xff0c;分享技术代码帮助学生学习&#xff0c;独立完成自己的项目或者毕业设计。 代码可以私聊博主获取。&#x1f339;赠送计算机毕业设计600个选题excel文件&#xff0c;帮助大学选题。赠送开题报告模板&#xff…

uniapp+node.js前后端做帖子模块:分享帖子和分享页面(社区管理平台的小程序)

目录 0前提1.一些准备1.1表帖子表 post 1.2总体思路 2.前端3.后端 &#x1f44d; 点赞&#xff0c;你的认可是我创作的动力&#xff01; ⭐️ 收藏&#xff0c;你的青睐是我努力的方向&#xff01; ✏️ 评论&#xff0c;你的意见是我进步的财富&#xff01; 0前提 温馨提示…

d2-crud-plus 使用小技巧(二)—— 路由跳转查询

需求 项目中要在a.vue界面点击表格中数据&#xff0c;携带参数跳转到b.vue界面&#xff0c;并进行查询。需要在d2-crud-plus框架下实现。 解决方法 使用插槽将要点击的数据添加上点击事件&#xff0c;在点击事件中添加路由跳转&#xff0c;并携带参数。 在目标界面使用对外…

单页面应用的优缺点

单页面应用&#xff08;SPA&#xff0c;Single Page Application&#xff09;是一种特殊的Web应用&#xff0c;其所有页面操作和交互都通过JavaScript、AJAX、HTML5和CSS3等前端技术在浏览器中完成&#xff0c;无需每次请求都重新加载整个页面。这种应用的设计模式在近年来越来…