展开阅读全文

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

上接

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

评论

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

  1. mysql binlog解析 c_解析MYSQL BINLOG二进制格式(9)--infobin解析binlog帮助文档

    原创:转载请说明出处谢谢! 上接 http://blog.itpub.net/7728585/viewspace-2133188/ 解析MYSQL BINLOG 二进制格式(1)--准备工作 http ...

  2. 解析MYSQL BINLOG二进制格式(10)--问题解答

    原创转发请注明出处 上接 http://blog.itpub.net/7728585/viewspace-2133188/ 解析MYSQL BINLOG 二进制格式(1)--准备工作  http:// ...

  3. mysql binlog xid_解析MYSQL BINLOG 二进制格式(7)--Xid_log_event/XID_EVENT

    原创:转载请说明出处谢谢! 上接 http://blog.itpub.net/7728585/viewspace-2133188/ 解析MYSQL BINLOG 二进制格式(1)--准备工作 http ...

  4. mysql xid_解析MYSQL BINLOG 二进制格式(7)--Xid_log_event/XID_EVENT

    原创:转载请说明出处谢谢! 上接 http://blog.itpub.net/7728585/viewspace-2133188/ 解析MYSQL BINLOG 二进制格式(1)--准备工作 http ...

  5. mysql 二进制 存储格式化_解析MYSQL BINLOG 二进制格式(2)--FORMAT_DESCRIPTION_EVENT

    原创:转载请说明出处谢谢! 上接 http://blog.itpub.net/7728585/viewspace-2133188/ 参考源: 1.源码log_event.h log_event.cc ...

  6. mysql+inser+select_解析MySQL中INSERT INTO SELECT的使用

    1. 语法介绍 有三张表a.b.c,现在需要从表b和表c中分别查几个字段的值插入到表a中对应的字段.对于这种情况,可以使用如下的语句来实现: INSERT INTO db1_name (field1, ...

  7. mysql 二进制格式_解析MYSQL BINLOG 二进制格式(3)--QUERY_EVENT

    该楼层疑似违规已被系统折叠 隐藏此楼查看此楼 FORMAT_DESCRIPTION_EVENT class:Query_log_event event:QUERY_EVENT event_code:0 ...

  8. mysql bin log 255_解析MYSQL BINLOG 二进制格式(4)--TABLE_MAP_EVENT

    该楼层疑似违规已被系统折叠 隐藏此楼查看此楼 class:Table_map_log_event event:TABLE_MAP_EVENT event_code:19 本event只用于 row模式 ...

  9. mysql函数及解析,Mysql研究之MySQL常用内置函数完全解析

    说明: 1 )可以用在 SELECT/UPDATE/DELETE 中,及 where , orderby , having 中 2 )在函数里将字段名作为参数,变量的就是字段所对应的每一行的. 3 ) ...

最新文章

  1. 区块链概况:从数字货币说起
  2. MongoDB数据库(一:基本操作)
  3. java 类之间数据传递_java类之间数据传递问题
  4. 深入Managed DirectX9(四)
  5. 毕业设计出现的一个严重错误----文件不能相互引用
  6. python输出文本 去掉引号_Python可以在文本文件中读取时从字符串中删除双引号吗?...
  7. java ref 应用类型_Java四种引用类型
  8. oracle学习笔记(十三) 查询练习(三) 子查询查询
  9. python有趣的代码-python菜鸟教程,python好玩又简单的代码
  10. 汉王考勤管理软件mysql数据库配置_汉王考勤管理软件使用说明书介绍.pdf
  11. 2021-10-25 UI设计规范及动态海报
  12. [译] 海量视频时代下的内容发现之旅
  13. paurse java_在eclipse中通过RSE插件运行远程java程序时遇到问题
  14. 博才教育三校领导莅临湖南省智慧教育装备展示体验中心参观交流
  15. gitlab+jenkins 利用webhook自动构建代码
  16. Spring官方文档解读(五)之自定义 bean 的性质
  17. ELK搭建-基于自制docker镜像
  18. Java读取文件最后n行
  19. 【Simulation】2 Elements of Probability-双样本均值方差的讨论
  20. moloch1.8.0简单操作手册

热门文章

  1. 离谱!诺奖得主被曝40多篇论文造假!
  2. 一件毛衣能产生7000伏电压!冬天静电的危害竟然这么大…
  3. 线性代数拾遗(五):矩阵变换的应用
  4. 最佳约会策略及其证明
  5. 假如不穿宇航服,人在各大星球能活多久?
  6. 判断对象属性值是否为空
  7. vim的强大,vim设置和插件的使用,脱离windows才是王道
  8. 解决 Serverless 落地困难的关键,是给开发者足够的“安全感”
  9. 全球首款乘云而来的存储产品CDS诞生!
  10. 云网管—云上构建网络自动化体系