而对于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
1/2 1