mysql write rows_解析MYSQL BINLOG 二进制格式(5)--WRITE_ROW_EVENT

展开阅读全文

原创:转载请说明出处谢谢!

上接

http://blog.itpub.net/7728585/viewspace-2133188/ 解析MYSQL BINLOG 二进制格式(1)--准备工作

http://blog.itpub.net/7728585/viewspace-2133189/ 解析MYSQL BINLOG 二进制格式(2)--FORMAT_DESCRIPTION_EVENT

http://blog.itpub.net/7728585/viewspace-2133321/ 解析MYSQL BINLOG 二进制格式(3)--QUERY_EVENT

http://blog.itpub.net/7728585/viewspace-2133429/ 解析MYSQL BINLOG 二进制格式(4)--TABLE_MAP_EVENT

class:Write_rows_log_event

event:WRITE_ROW_EVENT

event_code:30

自从5.1.18开始,row模式下的insert的event,为什么要叫write不叫insert

呢无赖...

这部分在internals文档中有点小的问题,我也是看了源码的描述才找到,

在文档中也写到[TODO:following needs verification;it's guesswork]

就是fixed data中有2 bytes的m_extra_row_data其值当前为

uint16 vhlen= 2;

uint16 vhpayloadlen= 0;

下面有部分源码截取。如果不知道这两个字节读取就会有问题。至少5.6,5.7都有的

老版本我也没有验证。

--fixed data  10字节(5.6,5.7中描述为 ROWS_HEADER_LEN_V2)

6 bytes 表ID

2 bytes 保留

2 bytes 文档中并没有描述

源码中描述为:

uchar    *m_extra_row_data;   /* Pointer to extra row data if any */

/* If non null, first byte is length */

源码中是这样写入的:

if (likely(!log_bin_use_v1_row_events))

{

/*

v2 event, with variable header portion.

Determine length of variable header payload

*/

uint16 vhlen= 2;

uint16 vhpayloadlen= 0;

uint16 extra_data_len= 0;

if (m_extra_row_data)

{

extra_data_len= m_extra_row_data[EXTRA_ROW_INFO_LEN_OFFSET];

vhpayloadlen= RW_V_TAG_LEN + extra_data_len;

}

/* Var-size header len includes len itself */

int2store(buf + RW_VHLEN_OFFSET, vhlen + vhpayloadlen);

rc= wrapper_my_b_safe_write(file, buf, ROWS_HEADER_LEN_V2);

/* Write var-sized payload, if any */

if ((vhpayloadlen > 0) &&

(rc == 0))

{

/* Add tag and extra row info */

uchar type_code= RW_V_EXTRAINFO_TAG;

rc= wrapper_my_b_safe_write(file, &type_code, RW_V_TAG_LEN);

if (rc==0)

rc= wrapper_my_b_safe_write(file, m_extra_row_data, extra_data_len);

}

}

else

{

rc= wrapper_my_b_safe_write(file, buf, ROWS_HEADER_LEN_V1);

}

可以看到实际上写入的就是

uint16 vhlen= 2;

uint16 vhpayloadlen= 0;

有兴趣可以参考源码:

Rows_log_event::write_data_header(IO_CACHE *file)

--variable data part

packed integer:表中字段个数,这个地方为packed integer自行参考源码

uchar *net_store_length

var-size:文档解释为每一位代表是否字段用到了 长度为INT((n+7)/8) n代表字段数量

源码描述为 m_cols;/* Bitmap denoting columns available */

测试表现这一字节和binlog_row_image设置有关,默认为FULL每一个字节始终为

0XFF

var-size:每一位代表的字段的值是否为NULL,长度为INT((n+7)/8) n代表字段数量,

他采用一个位图的方式。

1:NULL

0:NOT NULL

var-size:这部分就是真正的数据了。

为了验证我做了如下的测试表:

mysql> create table testnull2 (id int,name1 varchar(20),name2 varchar(20));

Query OK, 0 rows affected (0.09 sec)

mysql> insert into testnull2 values(NULL,'test',NULL);

Query OK, 1 row affected (0.01 sec)

可以看到我只是插入的数据第一个字段第三个字段都是NULL,好我们看是解析,这次试用

mysqlbinlog 自带的--hexdump方式和自己开发的工具./infobin,这个工具就是通过自己

对binlog event的认知进行解析的,做这个工具的目的在于简化和友好的输出,方便我以后

的测试使用,同时也验证了我的全部说法,有时候mysqlbinlog的输出有点过于繁多,不便于

描述和测试,关于XID_EVENT和GTID_EVENT在后面描述

关于工具我放到了百度云盘

http://pan.baidu.com/s/1jHIWUN0

[root@testmy data]# ./infobin  test.000183

Check is Little_endian

Author: gaopeng QQ:22389860 Mail: gaopp_200217@163.com

Waring: This tool only Little_endian platform!

Little_endian check ok!!!

-------------Now begin--------------

Check Mysql Version is:5.7.13-log

Check Mysql binlog format ver is:V4

------------Detail now--------------

>Gtid Event:Pos:194(0Xc2) N_pos:259(0X103) Time:1486946663 Event_size:65(bytes)

Gtid:4a6f2a67-5d87-11e6-a6bd-0c29a879a3:1000448

-->Query Event:Pos:259(0X103) N_Pos:400(0X190) Time:1486946663 Event_size:141(bytes)

Exe_time:0  Use_db:test Statment(35b-trun):create table testnull2 (id int,name

>Gtid Event:Pos:400(0X190) N_pos:465(0X1d1) Time:1486946680 Event_size:65(bytes)

Gtid:4a6f2a67-5d87-11e6-a6bd-0c29a879a3:1000449

-->Query Event:Pos:465(0X1d1) N_Pos:537(0X219) Time:1486946680 Event_size:72(bytes)

Exe_time:0  Use_db:test Statment(35b-trun):BEGIN

---->Map Event:Pos537(0X219) N_pos:595(0X253) Time:1486946680 Event_size:58(bytes)

TABLE_ID:210 DB_NAME:test TABLE_NAME:testnull2

------>Insert Event:Pos:595(0X253) N_pos:636(0X27c) Time:1486946680 Event_size:41(bytes)

Dml on table: test.testnull2  table_id:210 Gno:1000449

>Xid Event:Pos:636(0X27c) N_Pos:667(0X29b) Time:1486946680 Event_size:31(bytes)

COMMIT 1000449 /*!add by tool*/

这里找到了insert event:

------>Insert Event:Pos:595(0X253) N_pos:636(0X27c) Time:1486946680 Event_size:41(bytes)

Dml on table: test.testnull2 Gno:1000449

这里这个event的开始位置为595

进行使用mysqlbinlog --hexdump格式

# at 595

#170213  8:44:40 server id 93157  end_log_pos 636 CRC32 0x32dd470a

# Position  Timestamp   Type   Master ID        Size      Master Pos    Flags

#      253 78 01 a1 58   1e   e5 6b 01 00   29 00 00 00   7c 02 00 00   00 00

#      266 d2 00 00 00 00 00 01 00  02 00 03 ff fd 04 74 65 |..............te|

#      276 73 74 0a 47 dd 32                                |st.G.2|

#       Write_rows: table id 210 flags: STMT_END_F

下面是-vv的输出

### INSERT INTO `test`.`testnull2`

### SET

###   @1=NULL /* type=3 meta=0 nullable=1 is_null=1 */

###   @2='test' /* VARSTRING(60) meta=60 nullable=1 is_null=0 */

###   @3=NULL /* VARSTRING(60) meta=60 nullable=1 is_null=1 */

分解:

--event header 部分就不解析了table id 210,

--hexdump也明确的解析了,不理解参考前面的文章

# Position  Timestamp   Type   Master ID        Size      Master Pos    Flags

#      253 78 01 a1 58   1e   e5 6b 01 00   29 00 00 00   7c 02 00 00   00 00

--fixed data

d2 00 00 00 00 00:表ID就是./infobin中的TABLE_ID:210 也是mysqlbinlog中的Write_rows: table id 210

01 00:保留

02 00:m_extra_row_data,这部分是我看源码找到的。

--variable data part

03:表中字段个数,当然我建表就是3个字段

ff: 源码描述为 m_cols;/* Bitmap denoting columns available */

fd: 11111101 代表字段@1=NULL和@3=NULL,但是字段@2不为空这和mysqlbinlog解析的一致

@1=NULL /* type=3 meta=0 nullable=1 is_null=1 */

@2='test' /* VARSTRING(60) meta=60 nullable=1 is_null=0 */

@3=NULL /* VARSTRING(60) meta=60 nullable=1 is_null=1 */

04:var 长度04 就是数据'test'的长度为4,当然为4

74 65 73 74:字符串'test'

ca 3f c1 05:crc 32校验

到此为止WRITE_ROW_EVENT解析完毕

本文首发在云栖社区,遵循云栖社区版权声明:本文内容由互联网用户自发贡献,版权归用户作者所有,云栖社区不为本文内容承担相关法律责任。云栖社区已在2020年6月升级到阿里云开发者社区。如果您发现有涉嫌抄袭的内容,请填写侵权投诉表单进行举报,一经查实,阿里云开发者社区将协助删除涉嫌侵权内容。

网友评论

登录后评论

0/500

评论

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

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

相关文章

平台建设的7大问题:蚂蚁AI平台实践深度总结

简介: 在支持蚂蚁几乎所有核心业务运行和发展的过程中,我们在平台建设、业务支持、平台运营、AI创新以及AI整体运营等各个方面做了很多尝试,有了不少的收获和感悟,在此分享给大家。 过去几年,我和团队一直在负责蚂蚁集…

知乎热问:进入内核态究竟是什么意思?

‍‍知乎上有一个问题:进入内核态究竟是什么意思?暂且忘记这个问题,让我们从另一个问题出发,一步步引出这个问题的答案。特权指令问题现代计算机里面,同时运行了很多程序,比如Office软件、浏览器、QQ、还有…

我在阿里云做云开发平台

简介: 你体验过云上的研发模式了没? 各大云厂商今年在开发者阵地侧逐渐开始向“云”化开发发展,最为显著的产品就是Cloud IDE,催生出来的趋势就是云端开发。云开发现阶段尽管在各大公司内部无法作为日常开发工具普遍推广&#xff…

mysql 事务日志备份_事务日志备份与恢复 5

14.5 用Bak文件恢复到故障点的奥秘如果数据库被损坏,我们就只能利用备份集文件(通常扩展名为BAK)来恢复数据库,如果备份集中包含了尾日志备份,我们同样能将数据库恢复到故障点。前面我们已经介绍了使用restore headeronly命令可以查看备份集文…

从no-code到low-code:企业级hpaPaaS的未来

简介: 本文将简单谈一谈基于 no-code > low-code > pro-code 渐进式思路的研发体系。 引子 宜搭负责人骁勇给我举过一个例子,我们小时候逢年过节穿的衣服,都是去裁缝店选一下材料、量一下尺寸,等个半个来月,讨回…

“解救”外卖骑手,美团首次公开算法规则!

整理 | 郑丽媛出品 | CSDN(ID:CSDNnews)相信大家点外卖的时候都会注意到“预估到达时间”这一栏,那你是否好奇过这个时间是怎么得出来的呢?简单用距离除以速度?还是结合送餐距离、出餐时间和天气情况等更多…

Serverless 极致弹性解构在线游戏行业痛点

简介: 本文将通过剖析一个个具体的场景案例,以期望给相关的游戏开发同学带来共鸣,同时也希望能给非游戏行业的同学带来一些启发。 一、前言 1. 游戏客户上云关注点 游戏行业是一个富有创意又竞争激烈的市场,被称为第九艺术。游戏…

ACK正式支持对基于Alibaba Cloud Linux操作系统的集群进行等保加固

简介: 我们对基于Alibaba Cloud linux操作系统的ACK集群进行等保加固,意味着阿里云在云产品开发和交付的过程中将安全作为重要组成部分,将合规融入到产品的“血液”中,把安全植入产品的“骨髓”里,能够帮助有等保诉求的…

华为一口气发布十余款新品,HarmonyOS用户过亿

9月13日19:30,华为在线上举办了智慧办公新品发布会。本次发布会带来了华为MateBook 13s笔记本电脑、华为MateBook 14s笔记本电脑、华为MateStation X一体机、华为PixLab X1打印机、华为MateView GT 27英寸曲面屏显示器以及华为MatePad Pro 12.6英寸套装版等十余款新…

labelme实例分割_MaskRCNN在多个实例数据集上实践

刚刚开通付费功能,好奇心驱使我试试效果,这不,前两天试了一下,感觉也没啥新奇的。我的公众号使命是记录和分享个人学习经历,不会使用付费功能的。在此也非常感谢之前给我付费的小伙伴哈,哈哈,话…

技术干货 | 阿里云数据库PostgreSQL 13大版本揭秘

简介: 阿里云RDS PostgreSQL是一款兼容开源PostgreSQL的全托管云数据库产品,自2015年首次发布以来,根据用户需求不断升级迭代,已支持9.4、10、11、12等多个版本,覆盖了高可用版、基础版、只读实例等多种形态&#xff0…

国家能源集团携手华为首次部署矿鸿操作系统,开创工控新纪元

9月14日,由国家能源集团携手华为公司共同举办的“矿鸿操作系统”发布会在北京圆满举行。矿监局、工信部、科技部、能源局、煤炭工业协会、国家能源集团、华为等政府机构与企业代表出席,共同见证了“矿鸿操作系统”的正式发布。面对煤矿数字化、智能化的快…

MaxCompute在电商场景中如何进行漏斗模型分析

简介: 本文以某电商案例为例,通过案例为您介绍如何使用离线计算并制作漏斗图。 背景 漏斗模型其实是通过产品各项数据的转化率来判断产品运营情况的工具。转化漏斗则是通过各阶段数据的转化,来判断产品在哪一个环节出了问题,然后…

ado.net mysql 事务_ADO.NET事务

在发布System.Transaction命名空间之前,可以直接用ADO.NET创建事务,也可以通过组件、特性和COM运行库(位于System.EnterpriseServices命名空间中)进行事务处理。本文如题所示,介绍在这些传统事务处理方式中较为简单的“ASP.NET事务”。在传统…

这可能是大型复杂项目下数据流的最佳实践

简介: 实际项目中沉淀的数据流最佳实践。 数据流是前端一直以来都存在的一个问题,我们项目沉淀了一套最佳实践,如有问题,欢迎探讨 在旧的 Done 项目中,代码复杂度高,已经到了“牵一发而动全身”&#xff0c…

淘宝推荐、视频搜索背后的检索技术竟是它!深度揭秘达摩院向量检索引擎Proxima

简介: 淘宝搜索推荐、视频搜索的背后使用了什么样的检索技术?非结构化数据检索,向量检索,以及多模态检索,它们到底解决了什么问题?今天由阿里巴巴达摩院的科学家从业务问题出发,抽丝剥茧&#x…

ipython和jupyter哪个好_对Python开发者而言,IPython仍然是Jupyter Notebook的核心

如果你不明白 Jupyter 是什么,这么说吧,它拥有和 IPython 同样的代码,并且是由同一批人开发的,只不过取了一个新名字、安了一个新家。下面这个注脚进一步说明了这一点:我从声明中解读出来的信息是,“Jupyte…

这个高薪行业正在大量招人,你会考虑吗?

作者 | 侯淼淼 出品 | 《新程序员》当人们提及“程序员”这一职业的时候,大多数人的第一想法往往是高薪。然而近年来,随着造车势力的兴起,新一轮的高薪岗位抢人大战正式打响。2021年以来,一汽、东风等传统车厂招聘岗位数量持…

AI在出行场景的应用实践:路线规划、ETA、动态事件挖掘…

简介: 本文是#春招专栏#系列的第1篇,根据高德机器学习研发部负责人damon在AT技术讲坛所分享的《AI在出行领域的应用实践》的内容整理而成。 前言:又到春招季!作为国民级出行服务平台,高德业务快速发展,大量…

lsof查看进程占用文件_Linux 利用lsof命令查找已经删除的文件来释放磁盘空间

测试环境一台服务器/ 根目录空间使用率达到94%,但是通过du -sh * 发现实际空间没没用用到那么多,初步怀疑,之前删除的文件,有运行中的进程一直占用,导致空间没有释放,如图通过du -sh * 发现共实际使用不到1…