2清空所有表_拉链表(二)

9418a104e61701960f01e57b8de9a86c.png
拉链表(一)
拉链表(二)

一、前言

在上一节简单介绍了拉链表,本节主要讲解如何通过binlog采集MySQL的数据并且按月分区的方式实现拉链表。

这里以上节介绍的用户表(user) 举例

二、涉及到的表

1. 原始表(user)

原始表指的是MySQL中的表,表结构如下:

eb1c834fea153614583f5bbdf224bfbd.png

其中name为主键,如果没有主键则无法做拉链表。

2. binlog流水表(user_binlog)

51139bffe931ebb2bc326477c33b399b.png

操作类型字段枚举值为:insert、update、delete。

设置binlog时间 的目的是防止业务方没有设置modify_time导致获取不到最新的更新时间,所以增加binlog时间。

日期分区字段是从binlog_time计算得来,作为分区字段

3. 拉链表(user_link)

d0333785a6454a5152650f485dee20d4.png

这里包含的字段除去原始表的字段增加了生效日期失效日期具体作用已经在上一节介绍过,这里就不再赘述。

4. 临时表(user_link_tmp)

c7072e4ee16ef2f4a2fe498d370213b4.png

这张表的用途是: 在数据从user_binlog写入user_link时,临时表起到中转的作用。并且临时表没有分区。

三、计算流程

1. 整体数据流向

8c4ae0c01ff009a44ae79ee961e1903e.png

2. user到user_binlog

数据从user表到user_binlog表可以采用开源的采集binlog工具实时写入。具体的实施方案和选择的开源工具有关,这里不详细介绍。

3. user_binlog到user_link

(1) 常规流程

把数据从binlog表同步到拉链表中主要分两步:

  • 删除拉链表中失效的数据: 这里包括update和delete类型的数据,都涉及到删除原始拉链表的数据。在这一步骤中有两个子步骤
    • 将拉链表中失效的失效日期字段改为批次日期
    • 从拉链表原有分区中删除失效的数据
  • 插入新的数据:这一步骤涉及到的操作类型包含insert和update

接下来会以7月11日执行的SQL举例,详细介绍如何把binlog表的数据同步到拉链表中。其中的SQL涉及到先把binlog表中的数据同步到临时表,并把临时表写入到拉链表。

-- 先清空临时表的数据。
-- 理论上这张表已经是清空的。
-- 这里清空主要是防止异常清空,导致上一批次没有清空临时表
truncate table user_link_tmp;-- 将拉链表中需要改为失效的数据的失效时间改为'2019-07-10',并把数据写入到临时表中
-- 其中start_date>='2019-07-01'是因为7月1日之前未失效的数据会写入到开始时间为7月1日的分区中,
-- 所以查开始分区只要查当月的即可
-- 结束分区用end_date>'2019-07-09'而不用end_date='9999-12-31'是防止历史数据重跑时前一中写法不会有问题,而第二种写法只有在正常逻辑中没有问题。
insert into table user_link_tmp
select name,phone,sing_up_date,modify_time,start_date,'2019-07-10' as end_date
from user_link 
where start_date<='2019-07-09' 
and start_date>='2019-07-01' 
and end_date>'2019-07-09'
and name in
(select name from user_binlog where day_num='2019-07-10' and type in ('update','delete') group by name
);-- 将原始拉链表中未失效的数据原样写入到临时表中
-- 此步骤的目的是从原有分区中删除失效的数据
-- 即在把临时表的数据覆盖到拉链表中时会把失效的数据从原有未失效分区中删除。
insert into table user_link_tmp
select name,phone,sing_up_date,modify_time,start_date,end_date
from user_link
where start_date<='2019-07-09' 
and start_date>='2019-07-01' 
and end_date>'2019-07-09'
and name not in
(select name from user_binlog where day_num='2019-07-10' and type in ('update','delete') group by name
);-- 将新增的数据写入到临时表中。
-- 并且开始时间为当前批次日期,结束日期为最大日期
insert into table user_link_tmp
select a.name,a.phone,a.sing_up_date,a.modify_time,'2019-07-10' as start_date,'9999-12-31' as end_date
from
(select name,phone,sing_up_date,modify_time,binlog_timefrom user_binlogwhere day_num='2019-07-10'
) a
right join
(select name,max(binlog_time)from user_binlogwhere day_num='2019-07-10'and type in ('insert','update') group by name
) b
on a.name=b.name 
and a.binlog_time=b.binlog_time
;-- 将临时表中的数据覆盖到拉链表中。
insert overwrite table user_link partition(start_date)
select name,phone,sing_up_date,modify_time,start_date,end_date
from user_link_tmp;-- 删除临时表中的数据
truncate table user_link_tmp;

(2) 月初流程

在每个月月初会涉及到把上月还未失效的数据写入到开始时间为当月1日失效日期为9999-12-31的分区中,并把原始数据的失效日期改为上月末的逻辑。

接下来会以7月2日执行的SQL为例,来展示7月1日的数据是如何同步的。

truncate table user_link_tmp;-- 把拉链表所有6月30日未失效的数据失效日期改为7月1日
insert into table user_link_tmp;
select name,phone,sing_up_date,modify_time,start_date,'2019-07-01' as end_dat
from user_link
where start_date<='2019-06-30' 
and start_date>='2019-06-01' 
and end_date>'2019-06-30'-- 把7月1日依然为失效的数据的开始日期改为7月1日失效日期改为9999-12-31
insert into table user_link_tmp
select name,phone,sing_up_date,modify_time,'2019-07-01' as start_date,'9999-12-31' as end_date
from user_link
where start_date<='2019-06-30' 
and start_date>='2019-06-01' 
and end_date>'2019-06-30'
and name not in
(select name from user_binlog where day_num='2019-07-01' and type in ('update','delete') group by name
);-- 把7月1日新的数据写入到临时表中
insert into table user_link_tmp
select a.name,a.phone,a.sing_up_date,a.modify_time,'2019-07-01' as start_date,'9999-12-31' as end_date
from
(select name,phone,sing_up_date,modify_time,binlog_timefrom user_binlogwhere day_num='2019-07-01'
) a
right join
(select name,max(binlog_time)from user_binlogwhere day_num='2019-07-10'and type in ('insert','update') group by name
) b
on a.name=b.name 
and a.binlog_time=b.binlog_time-- 将临时表中的数据覆盖到拉链表中。
insert overwrite table user_link partition(start_date)
select name,phone,sing_up_date,modify_time,start_date,end_date
from user_link_tmp;-- 删除临时表中的数据
truncate table user_link_tmp;-- 删除6月份所有结束时间为9999-12-31分区的数据
alter table user_link_tmp drop if exists partition(stat_date>='2019-06-01' , start_date<'2019-07-01', end_date='9999-12-31' );

(3) 数据重跑

如果某个日期同步的数据出现问题需要重跑数据,则需要重跑从当日的同步SQL到当前日期所有的SQL才能保证数据准确。

三、总结

至此,拉链表的同步过程就结束了。总体将拉链表的同步对资源消耗还是蛮多的。

注意:本文的实现还有需要考虑不周的地方,在应用的时候需要根据自己的需求进行优化。

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

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

相关文章

出生日期范围的Sql语句_【呕心总结】python如何与mysql实现交互及常用sql语句

9 月初&#xff0c;我对 python 爬虫 燃起兴趣&#xff0c;但爬取到的数据多通道实时同步读写用文件并不方便&#xff0c;于是开始用起mysql。这篇笔记&#xff0c;我将整理近一个月的实战中最常用到的 mysql 语句&#xff0c;同时也将涉及到如何在python3中与 mysql 实现数据交…

iphone的生命周期

ios应用的生命周期在开发过程中我们需要一些全局对象来将程序的各个部分连接起来&#xff0c;这些全局对象中最重要的就是UIApplication对象。但在实际编程中我们并不直接和UIApplication对象打交道&#xff0c;而是和其代理打交道。UIApplication 是iPhone应用程序的开始并且负…

基于Wemos的智能感应开盖垃圾桶——日记

参考&#xff1a;基于Wemos的智能感应开盖垃圾桶——日记 作者&#xff1a;9art0 发布时间&#xff1a;2020-09-24 00:40:59 网址&#xff1a;https://blog.csdn.net/GatoWong/article/details/108759063?spm1001.2014.3001.5501 1.项目软硬件平台及开发环境 1.1.硬件平台 1…

严格程度_国内医疗器械生产许可证申请申报-经营一类、二类、严格的三类之间区别...

医疗器械生产许可证是医疗器械生产企业必须持有的证件&#xff0c;由当地药监局审核颁发。开办医疗器械生产企业应当符合国家医疗器械行业发展规划和产业政策。医疗器械生产许可证同样也是根据生产医疗器械的种类不同&#xff0c;需要办理资质审批也是不同的&#xff0c;具体如…

matlab z变换离散化_用C++编写一个简单的光栅化渲染器:3D篇

3D光栅化与2D光栅化在图元绘制方面差别并不大&#xff0c;3D光栅化主要是多了很多坐标系(Local&#xff0c;world&#xff0c;View...)&#xff0c;除此外遮挡算法和裁剪算法也会稍微复杂一些。本篇文章的重点就主要集中在各种坐标系变换上。1.基本3D变换本文所采用的向量(vect…

Catalan数列

引入 今天听学长讲了卡特兰数列后对其有了更深的认识&#xff0c;在此完善了一下之前的博客加以总结。 首先用一个经典的例子来描述一下Catalan数列&#xff0c;我们有一个1~n的数列和一个大小为n的栈&#xff0c;我们有如下两种操作&#xff1a; 当未入栈序列不为空时&#xf…

计算机和外部通信方式,计算机和外部的通信方式

计算机和外部交换信息又称为通信(Communication)。按数据传送方式分为并行通信和串行通信两种基本方式。1、并行通信并行通信就是把传送数据的n位数用n条传输线同时传送。其优点是传送速度快、信息率高。并且&#xff0c;通常只要提供二条控制和状态线&#xff0c;就能完成CPU和…

stm32入门之keil5的安装以及第一个工程的建立

摘自&#xff1a;stm32入门之keil5的安装以及第一个工程的建立 作者&#xff1a;SKY丶丿平才 发布时间&#xff1a; 2020-12-06 17:08:30 网址&#xff1a;https://blog.csdn.net/weixin_48264057/article/details/110734596 文章目录 前言一、keil5的下载与安装1.下载相关链接…

微信电脑客户端_无聊的话,用微信玩玩电脑

被禁足的2020注定是让人印象深刻的一年如果现在你很无聊来试试用微信玩玩电脑看能否给这不出门就是做贡献的日子带来一点乐趣开启步骤1、在能使用(接触的)的电脑上安装上Hipc在电脑访问 hipc.cn下载PC客户端(仅2M左右大小)2、安装PC客户端3、微信扫一扫绑定现在看看如何用微信玩…

epic堡垒之夜显示服务器离线,堡垒之夜epic服务器进不去 | 手游网游页游攻略大全...

发布时间&#xff1a;2017-12-19堡垒之夜开国服了,那么有的小伙伴就发现自己的国服为什么进不去,下面牛游戏小编就为你们带来了堡垒之夜国服进不去的解决办法,想了解的小伙伴就一起来看看吧,希望能对你们有帮助. 解决办法如下: 1.重新下载并安装游戏,下载前关 ...标签&#xff…

动态加载 回显_ElementUI cascader级联动态加载及回显

先看图&#xff0c;你是否也遇到这个需求&#xff1f;如果你正在焦头烂额&#xff0c;无脑抓瞎&#xff0c;那么你来对地方了&#xff0c;因为我将给你一个简单易懂的实现方案。我也在网上翻了无数页答案&#xff0c;也照着别人的代码和思路尝试了&#xff0c;事实上并不能解决…

单片机的四种烧写方式

参考&#xff1a;单片机的四种烧写方式 作者&#xff1a;爱学习的小王呀 发布时间&#xff1a;2020-11-27 20:05:12 网址&#xff1a;https://blog.csdn.net/hongliwong/article/details/110245095?spm1001.2014.3001.5501 参考&#xff1a;单片机3种烧录方式解析 作者&#x…

关于驰骋表单引擎中字段扩展设置对文本框Pop窗体返回值的升级说明 2012/11/13...

为什么80%的码农都做不了架构师&#xff1f;>>> 关于驰骋表单引擎中字段扩展设置对文本框Pop窗体返回值的升级说明 2012/11/13 现有功能: 以前版本仅支持自己定义url&#xff0c;返回值到文本框上. 升级功能: 1, 增加了可以自己定义数据源模式&#xff0c;数据源可…

中兴f650 2.0.3 固件降级_手机资讯:如何升级iOS12.1.4正式版iOS12.1.4正式版升降级教程...

如今使用IT数码设备的小伙伴们是越来越多了&#xff0c;那么IT数码设备当中是有很多知识的&#xff0c;这些知识很多小伙伴一般都是不知道的&#xff0c;就好比最近就有很多小伙伴们想要知道如何升级正式版正式版升降级教程&#xff0c;那么既然现在大家对于如何升级正式版正式…

C# 加密解密类

一. MD5 1 防止看到明文 数据库密码&#xff0c;加盐(原密码固定字符串&#xff0c;然后再MD5/双MD5) 2 防篡改 3 急速秒传(第一次上传文件&#xff0c;保存md5摘要&#xff0c;第二次上传检查md5摘要) 4文件下载(防篡改&#xff0c;官方发布的时候给一个md5摘要&#xf…

请求solr服务器未响应,solr与tomcat整合

一、准备工作&#xff1a;我使用的是tomcat7.0,solr-4.8.1solr-4.8.1解压后是这样的。二、开始配置了1、首先要创建两个文件夹。home和server。我是创建在与solr-4.8.1同一根目录上的。D:\work-tool\server\solr\home和D:\work-tool\server\solr\server2、从solr-4.8.1\dist复制…

WeMos下实现小车避障与手机控制

参考&#xff1a;WeMos下实现小车避障与手机控制 作者&#xff1a;爱学习的小王呀 发布时间&#xff1a;2020-10-02 10:17:45 网址&#xff1a;https://blog.csdn.net/hongliwong/article/details/108900048?spm1001.2014.3001.5501 目录前言一、项目软硬件平台及开发环境1.硬…

苹果手机耗电快_iPhone12用5G耗电快,苹果回应

原标题&#xff1a;iPhone12用5G耗电快&#xff0c;苹果回应北京头条客户端10月24日消息&#xff0c;针对有媒体测试苹果iPhone12开启5G模式下&#xff0c;用电量提升的问题&#xff0c;苹果iPhone营销副总裁Kaiann Drance回应称&#xff0c;iPhone12 增加的智能数据模式可以平…

Ubuntu12 10下安装JDK7

为什么80%的码农都做不了架构师&#xff1f;>>> Ubuntu12 10版本下&#xff0c;不再预装JDK&#xff0c;包括OpenJdk&#xff0c;所以我们要从Oracle官网上下载java7的压缩包&#xff0c;选择适合自己电脑的安装包&#xff0c;我选的是jdk-7u9-linux-i586.tar.gz。…

neo4j python 算法_python操作neo4j简单实例

一&#xff1a;neo4j是什么neo4j:Neo4j是一个高性能的,NOSQL图形数据库,有关于更多neo4j的资料出门右拐二:python操作neo4j的实现python中neo4j的操作可以利用驱动包或者py2neo包&#xff0c;我采用py2neo第三方包实现以下简单功能&#xff0c;先建立一个neo4j的链接对于neo4j的…