利用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提供了一系列强大的库和工具,可以帮助我们自动化那些乏味且重复的任务,从而释放我们的时间,让我们可以专注于更有创造性和有意义的工作。下面,我们将探…

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

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

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下,但是,我們還不希望每個下面都去建立一個運行…

温湿度传感器SHT21

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

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

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

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

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

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

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

GIN与Echo:选择正确Go框架的指南

您是否在Go中构建Web应用?选择正确的框架至关重要!GIN和Echo是两个热门选择,每个都有其优势和特点。本指南将详细介绍每个框架的特性、速度、社区热度以及它们各自擅长的项目类型。最后,您将能够为您的下一个Web项目选择完美的框架…

C++11常用知识分享(一)【列表初始化 || 简化声明 || 范围for || 左右值 || 可变参数模板】

目录 一. 列表初始化 1)用法 2) initializer_list 小节: 二,简化声明 1) ,auto 2) ,decltype类 3),nullptr 三,范围for 四,C11后,STL容器变化 五&#xff0c…

一篇文章教会你如何在IOS真机上完美运行React Native

一篇文章教会你如何在IOS真机上完美运行React Native 项目初始化项目配置可能遇到的问题没有账号也没有Team设备上没有打开开发者模式,也没有信任开发者证书 无线调试 项目初始化 在终端使用**npx react-native init ProjectName**初始化React Native项目。 进入项…

力扣550 游戏玩法分析 IV

目录 题目描述 思路整理 1. 首次登录日期 2. 第二天登录 3. 计算比率 实现思路 完整代码及解释 题目描述 Table: Activity ----------------------- | Column Name | Type | ----------------------- | player_id | int | | device_id | int | | ev…

117.移除链表元素(力扣)

题目描述 代码解决 class Solution { public:ListNode* removeElements(ListNode* head, int val) {//删除头节点while(head!NULL&&head->valval){ListNode*tmphead;headhead->next;delete tmp;}//删除非头节点ListNode*curhead;while(cur!NULL&&cur-&g…

安卓虚拟机ART和Dalvik

目录 一、JVM和Dalvik1.1 基于栈的虚拟机字节码指令执行过程 1.2 基于寄存器的虚拟机 二、ART与Dalvikdex2aotAndroid N的运作方式 三、总结 一、JVM和Dalvik Android应用程序运行在Dalvik/ART虚拟机,并且每一个应用程序对应有一个单独的Dalvik虚拟机实例。 Dalvik…

Vue.js 实用技巧:深入理解 Vue.set 方法

🤍 前端开发工程师、技术日更博主、已过CET6 🍨 阿珊和她的猫_CSDN博客专家、23年度博客之星前端领域TOP1 🕠 牛客高级专题作者、打造专栏《前端面试必备》 、《2024面试高频手撕题》 🍚 蓝桥云课签约作者、上架课程《Vue.js 和 E…

20 个不同的 Python 函数实例

Python 是一种广泛使用的高级编程语言,其函数是 Python 编程中至关重要的概念之一。函数是一段可以重复使用的代码块,可以接收输入参数并返回输出结果。使用函数能够提高代码的可读性、可维护性和重用性。 基础知识 在 Python 中,函数使用关…

【如何在Docker中,修改已经挂载的卷(Volume)】

曾梦想执剑走天涯,我是程序猿【AK】 提示:添加投票!!! 目录 简述概要知识图谱 简述概要 如何在Docker中,修改已经挂载的卷(Volume) 知识图谱 在Docker中,修改已经挂载…

本地navicate连接vm虚拟机中的mysql5.7docker容器

一,配置 前提是我已经启动的mysql5.7容器 使用 docker ps -a 查看所有的容器 使用 docker exec -it c4f9 bash 进入mysql命令行,注意这个c4f9是容器唯一id,不用写全连接mysql mysql -uroot -p123456,连接成功后 输入 show datab…

蓝桥杯——123

123 二分等差数列求和前缀和数组 题目分析 连续一段的和我们想到了前缀和,但是这里的l和r的范围为1e12,明显不能用O(n)的时间复杂度去求前缀和。那么我们开始观察序列的特点,可以按照等差数列对序列进行分块。如上图,在求前10个…