作家
登录

MyFlash--美团点评的开源MySQL闪回工具

作者: 来源: 2017-11-20 13:05:46 阅读 我要评论

而对于update操作,其格局如下。

个中,BI是指before image,AI是指after image。

binlog格局初探

我们只需依次遍历修改前的数据和修改后的数据,并一一交换即可。是以全部回滚操作的可贵在于回滚update语句,而update语句回滚的核心在于计算出每个AI、BI的长度。下面介绍下长度以及部分字段的计算办法。

镜像长度计算

镜像是由一个个字段构成的,根据字段类型的不合,其计算长度的办法也不一样。

  • 只与字段类型相干。比如int占用4个字节,bingint占用8个字节。个中类型信息可以大年夜table map event中获取。
  • 与字段类型及其参数相干。比如decimal(18,9),占用9个字节,参数信息在table map event中。
  • 与字段类型、参数以及实际存储的值相干。比如varchar(10),有1个字节表示长度,之后的字节才表示真正的数据。比如varchar(280),有2个字节表示长度。实际的长度和数据在一路。

  170905  01:59:33 server id 10  end_log_pos 385 CRC32 0x179ef6dd    

解析binlog中的若干个关键点

① length encoded integer

binlog一一个或者多个字节组合,分别表示了不合的含义。比如,timestamp是由固定的4个字节构成,event类型由一个字节表示;数据库名和表名最长为64个字符,即使每个字符占用3个字节,那么占用的字节数为192<255。是以最多应用一个字节,就可以完成实际长度表示。

然而列的实际数量,可能须要跨越1个字节、2个字节、3个字节甚至8个字节去表示。如不雅我们应用最大年夜的8个字节去表示,那么在绝大年夜多半情况下都是浪费存储空间的。针对这种情况,length encoded integer应运而生。

比如在获取一个varchar类型的长度时,起首攫取第一个字节,如不雅值小于251,那么varchar的长度就是第一个字节表示的长度。如不雅第一个字节的值为0xFC,那么varchar的长度是由该字节之后的后两个字节构成,以词攀类推。

decimal是由整数部分和小数部分构成。无论是整数照样小数,每9个数字,须要4个字节。如不雅不是9的倍数,残剩的小数位,须要的字节数如下,为便利描述,将该关系定义为函数Fnum。

举例,对于 decimal(18,10):

  • 整数部分可展示的为8,用int,即4个字节。
  • 小数部分,须要的字节数为 (10 /9)*4+Fnum(10%9)=5。
  • 那么总共加起来须要4+5=9个字节。

闪回对象架构

在膳绫擎的┞仿节中,介绍了单个binlog event的反转办法。在实践中,我们往往须要把某个binlog,按照指定的前提,过滤出须要的binlog,并进行反转。那么MyFlash是若何完成这些目标的呢?

解析binlog

起首把binlog文件,解析成多个event,放入到相干队列中。在实现上,为了尽可能加快解析速度,可以让用户指定解析的开端与停止地位。把binlog文件解析成binlog event后,再断定下是否相符指定的时光前提,若不相符,则丢弃该event。

留意:用户可以不指定地位和时光,则解析全部文件。如不雅只指准时光,那么也须要大年夜文件开端处解析,掏出时光信息,再进行断定。是以,当须要回滚的binlog只占全部binlog的一小部分时,推荐应用指定地位。

重组event

把binlog event构成最小履行单位。在常见的binlog event中table_map event包含了所要了表名、库名等元数据信息,而row_event(包含write_event、delete_event、update_event)包含了真正的数据。是以在设计中应用了一个最小履行单位概念。所谓的最小履行单位,即least execution event unit,平日包含一个table_map event和若干个row_event。

比如在binlog格局概览一节中,介绍了table_map_event和update_row_event。如不雅只有update_row_event,那么我们无法知道这个event对应的行记录变革对应的表。是以一个完全的最小履行单位起码包含一个table_map_event和write_row_event、update_row_even、delete_row_event中的一个。

为什愦我们须要应用最小履行单位?因为我们在闪回操作时,不克不及简单的把每个event反转之后,然后再将所有event的次序反转过来。如不雅如许的话,就会出现table_map event在row event之后,这显然是违背binlog履行逻辑的。

有了最小履行单位之后,只需两步,即可完成反转。

a. 反转最小履行单位中的row event。

b. 逆序最小履行单位队列,即可。

生成binlog文件

有了逆序的最小履行单位队列后,只需把每个最小履行单位依次输入到文件即可。不过不要忘了修改每个binlog event里的next_position,用来表示下一?binlog的地位。


  推荐阅读

  第七届中国云计算标准和应用大会即将召开

Tech Neo技巧沙龙 | 11月25号,九州云/ZStack与您一路商量云时代收集界线治理实践 会议地点:北京永泰福朋喜来登【51CTO.com原创稿件】九大年夜主题论坛 规格最高的云枷⒚鹦业嘉会由中国电>>>详细阅读


本文标题:MyFlash--美团点评的开源MySQL闪回工具

地址:http://www.17bianji.com/lsqh/39027.html

关键词: 探索发现

乐购科技部分新闻及文章转载自互联网,供读者交流和学习,若有涉及作者版权等问题请及时与我们联系,以便更正、删除或按规定办理。感谢所有提供资讯的网站,欢迎各类媒体与乐购科技进行文章共享合作。

网友点评
自媒体专栏

评论

热度

精彩导读
栏目ID=71的表不存在(操作类型=0)