解析MYSQL BINLOG二进制格式(8)--GTID_LOG_EVENT/ANONYMOUS_GTID_LOG_EVENT及其他

本文涉及的产品
RDS MySQL Serverless 基础系列,0.5-2RCU 50GB
云数据库 RDS MySQL,集群系列 2核4GB
推荐场景:
搭建个人博客
日志服务 SLS,月写入数据量 50GB 1个月
简介: 原创:转载请说明出处谢谢! 上接 http://blog.itpub.net/7728585/viewspace-2133188/ 解析MYSQL BINLOG 二进制格式(1)--准备工作  http://blog.
原创:转载请说明出处谢谢!
上接
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 
http://blog.itpub.net/7728585/viewspace-2133463/ 解析MYSQL BINLOG 二进制格式(5)--WRITE_ROW_EVENT 
http://blog.itpub.net/7728585/viewspace-2133469/ 解析MYSQL BINLOG 二进制格式(6)--UPDATE_ROW_EVENT/DELETE_ROW_EVENT  
http://blog.itpub.net/7728585/viewspace-2133502/ 解析MYSQL BINLOG 二进制格式(7)--Xid_log_event/XID_EVENT 


这部分在文档interal中并没有找到解析,但是通过翻阅源码class定义找到一些定义
部分可知,部分未知,如果以后找到会补上,如果有误请指出

class:Gtid_log_event
event:GTID_LOG_EVENT
event_code:33

class:Gtid_log_event
event:ANONYMOUS_GTID_LOG_EVENT
event_code:34


class:Previous_gtids_log_event
event:PREVIOUS_GTIDS_LOG_EVENT
event_code:35


首先是GTID_LOG_EVENT和ANONYMOUS_GTID_LOG_EVENT
他们源于一个class
(
ANONYMOUS: gtid_mode [ON ON_PERMISSIVE]
非ANONYMOUS:gtid_mode [OFF OFF_PERMISSIVE]
)


只是ANONYMOUS基本没有填充值,我们来看看源码中对他们的定义:
位置在:
Control_events.h 中


protected:
  static const int ENCODED_FLAG_LENGTH= 1;
  static const int ENCODED_SID_LENGTH= 16;// Uuid::BYTE_LENGTH;
  static const int ENCODED_GNO_LENGTH= 8;
  /// Length of typecode for logical timestamps.
  static const int LOGICAL_TIMESTAMP_TYPECODE_LENGTH= 1;
  /// Length of two logical timestamps.
  static const int LOGICAL_TIMESTAMP_LENGTH= 16;
  // Type code used before the logical timestamps.
  static const int LOGICAL_TIMESTAMP_TYPECODE= 2;
  gtid_info gtid_info_struct;
  Uuid Uuid_parent_struct;
public:
  /// Total length of post header
  static const int POST_HEADER_LENGTH=
    ENCODED_FLAG_LENGTH                 /* flags */ 1
    ENCODED_SID_LENGTH                  /* SID length */ 16
    ENCODED_GNO_LENGTH                  /* GNO length */ 8
    LOGICAL_TIMESTAMP_TYPECODE_LENGTH  /* length of typecode */ 1
    LOGICAL_TIMESTAMP_LENGTH;           /* length of two logical timestamps */ 16
    
我们可以明确看出GITD存储的地方ENCODED_SID_LENGTH 16,ENCODED_GNO_LENGTH 8
 LOGICAL_TIMESTAMP_LENGTH 两个8字节分别表示 last_committedsequence_number
,在ANONYMOUS GTID除了 last_committed sequence_number其他字节为0X00
 /* Binlog-specific logical timestamps. */
  /*
    Store for the transaction's commit parent sequence_number.
    The value specifies this transaction dependency with a "parent"
    transaction.
    The member is assigned, when the transaction is about to commit
    in binlog to a value of the last committed transaction's sequence_number.
    This and last_committed as numbers are kept ever incremented
    regardless of binary logs being rotated or when transaction
    is logged in multiple pieces.
    However the logger to the binary log may convert them
    according to its specification.
  */
  int64 last_committed;
  /*
    The transaction's private logical timestamp assigned at the
    transaction prepare phase. The timestamp enumerates transactions
    in the binary log. The value is gained through incrementing (stepping) a
    global clock.
    Eventually the value is considered to increase max_committed_transaction
    system clock when the transaction has committed.
  */
  int64 sequence_number; 


来具体解析一个:
Gtid_log_event/GTID_LOG_EVENT
# Position  Timestamp   Type   Master ID        Size      Master Pos    Flags 
#       c2 05 01 9d 58   21   e5 6b 01 00   41 00 00 00   03 01 00 00   00 00
#       d5 01 4a 6f 2a 67 5d 87 11  e6 a6 bd 00 0c 29 a8 79 |.Jo.g..........y|
#       e5 a3 f0 43 0f 00 00 00 00  00 02 00 00 00 00 00 00 |..C.............|
#       f5 00 00 01 00 00 00 00 00  00 00 7d 32 90 b4       |...........2..|
#       GTID [commit=yes]
SET @@SESSION.GTID_NEXT= '4a6f2a67-5d87-11e6-a6bd-000c29a879a3:1000432'/*!*/;


01:flags未知                                                              
4a 6f 2a 67 5d 87 11 e6 a6 bd 00 0c 29 a8 79 a3: 4a6f2a67-5d87-11e6-a6bd-000c29a879a3
f0 43 0f 00 00 00 00 00 : 小端显示0X0f43f0,1000432                                       
02:length of typecode未知 
00 00 00 00 00 00 00 00: last_committed 
01 00 00 00 00 00 00 00: sequence_number
7d 32 90 b4 :CRC32校验


那看一个ANONYMOUS的
# at 194
#170214  4:12:30 server id 93157  end_log_pos 259 CRC32 0x0901e014 
# Position  Timestamp   Type   Master ID        Size      Master Pos    Flags 
#       c2 2e 13 a2 58   22   e5 6b 01 00   41 00 00 00   03 01 00 00   00 00
#       d5 01 00 00 00 00 00 00 00  00 00 00 00 00 00 00 00 |................|
#       e5 00 00 00 00 00 00 00 00  00 02 00 00 00 00 00 00 |................|
#       f5 00 00 01 00 00 00 00 00  00 00 14 e0 01 09       |..............|
#       GTID [commit=yes]
SET @@SESSION.GTID_NEXT= 'ANONYMOUS'/*!*/;




除了 last_committed  和 sequence_number作为组提交的标志,其他位基本都为0及没有gtid生成


PREVIOUS_GTIDS_LOG_EVENT:用于表示上一个binlog最后一个gitd的位置,每个binlog只有一个


# at 123
#170214  4:46:24 server id 93157  end_log_pos 194 CRC32 0xd10caea6 
# Position  Timestamp   Type   Master ID        Size      Master Pos    Flags 
#       7b 20 1b a2 58   23   e5 6b 01 00   47 00 00 00   c2 00 00 00   80 00
#       8e 01 00 00 00 00 00 00 00  4a 6f 2a 67 5d 87 11 e6 |........Jo.g....|
#       9e a6 bd 00 0c 29 a8 79 a3  01 00 00 00 00 00 00 00 |......y.........|
#       ae 01 00 00 00 00 00 00 00  05 44 0f 00 00 00 00 00 |.........D......|
#       be a6 ae 0c d1                                      |....|
#       Previous-GTIDs
# 4a6f2a67-5d87-11e6-a6bd-000c29a879a3:1-1000452


关于这部分解析位置特别是1-1000452的解析。如果以后知道了补上
只是在源码注释中找到:
/**
  @class Previous_gtids_event


  @section Previous_gtids_event_binary_format Binary Format


  The Post-Header for this event type is empty.  The Body has two
  components:

 
Name Format Description
buf unsigned char array It contains the Gtids executed in the
        last binary log file.
buf_size 4 byte integer Size of the above buffer

*/
但是不知道解析方法。




其他EVENT:
这部分列出的event可以直接参考internals 20章 比较简单就不用再开文章写了
Stop_log_event/STOP_EVENT(03):数据库关闭,或者SLAVE执行了reset slave。
Rotate_log_event/ROTATE_EVENT(04):binlog切换事件,比如超过参数设置。如果服务器CRASH不会记录
Intvar_log_event/INTVAR_EVENT(05):和自增字段有关
Rand_log_event/RAND_EVENT(13):和RAND()函数相关
还有很多和load data infile 有关的event这里就不考虑了。因为平时我们用load data infile 并不多,这里主要考虑
和事物有关的各种的event




    


相关实践学习
如何在云端创建MySQL数据库
开始实验后,系统会自动创建一台自建MySQL的 源数据库 ECS 实例和一台 目标数据库 RDS。
全面了解阿里云能为你做什么
阿里云在全球各地部署高效节能的绿色数据中心,利用清洁计算为万物互联的新世界提供源源不断的能源动力,目前开服的区域包括中国(华北、华东、华南、香港)、新加坡、美国(美东、美西)、欧洲、中东、澳大利亚、日本。目前阿里云的产品涵盖弹性计算、数据库、存储与CDN、分析与搜索、云通信、网络、管理与监控、应用服务、互联网中间件、移动服务、视频服务等。通过本课程,来了解阿里云能够为你的业务带来哪些帮助     相关的阿里云产品:云服务器ECS 云服务器 ECS(Elastic Compute Service)是一种弹性可伸缩的计算服务,助您降低 IT 成本,提升运维效率,使您更专注于核心业务创新。产品详情: https://www.aliyun.com/product/ecs
相关文章
|
12天前
|
存储 SQL 关系型数据库
mysql 的ReLog和BinLog区别
MySQL中的重做日志和二进制日志是确保数据库稳定性和可靠性的关键组件。重做日志主要用于事务的持久性和原子性,通过记录数据页的物理修改信息来恢复未提交的事务;而二进制日志记录SQL语句的逻辑变化,支持数据复制、恢复和审计。两者在写入时机、存储方式及配置参数等方面存在显著差异。
|
3天前
|
存储 关系型数据库 MySQL
double ,FLOAT还是double(m,n)--深入解析MySQL数据库中双精度浮点数的使用
本文探讨了在MySQL中使用`float`和`double`时指定精度和刻度的影响。对于`float`,指定精度会影响存储大小:0-23位使用4字节单精度存储,24-53位使用8字节双精度存储。而对于`double`,指定精度和刻度对存储空间没有影响,但可以限制数值的输入范围,提高数据的规范性和业务意义。从性能角度看,`float`和`double`的区别不大,但在存储空间和数据输入方面,指定精度和刻度有助于优化和约束。
|
22小时前
|
SQL 关系型数据库 MySQL
深入解析MySQL的EXPLAIN:指标详解与索引优化
MySQL 中的 `EXPLAIN` 语句用于分析和优化 SQL 查询,帮助你了解查询优化器的执行计划。本文详细介绍了 `EXPLAIN` 输出的各项指标,如 `id`、`select_type`、`table`、`type`、`key` 等,并提供了如何利用这些指标优化索引结构和 SQL 语句的具体方法。通过实战案例,展示了如何通过创建合适索引和调整查询语句来提升查询性能。
21 9
|
11天前
|
SQL 存储 缓存
MySQL进阶突击系列(02)一条更新SQL执行过程 | 讲透undoLog、redoLog、binLog日志三宝
本文详细介绍了MySQL中update SQL执行过程涉及的undoLog、redoLog和binLog三种日志的作用及其工作原理,包括它们如何确保数据的一致性和完整性,以及在事务提交过程中各自的角色。同时,文章还探讨了这些日志在故障恢复中的重要性,强调了合理配置相关参数对于提高系统稳定性的必要性。
|
29天前
|
关系型数据库 MySQL 数据库
【赵渝强老师】MySQL的binlog日志文件
MySQL的binlog日志记录了所有对数据库的更改操作(不包括SELECT和SHOW),主要用于主从复制和数据恢复。binlog有三种模式,可通过设置binlog_format参数选择。示例展示了如何启用binlog、设置格式、查看日志文件及记录的信息。
|
1月前
|
监控 关系型数据库 MySQL
MySQL自增ID耗尽应对策略:技术解决方案全解析
在数据库管理中,MySQL的自增ID(AUTO_INCREMENT)属性为表中的每一行提供了一个唯一的标识符。然而,当自增ID达到其最大值时,如何处理这一情况成为了数据库管理员和开发者必须面对的问题。本文将探讨MySQL自增ID耗尽的原因、影响以及有效的应对策略。
104 3
|
1月前
|
存储 关系型数据库 MySQL
MySQL 字段类型深度解析:VARCHAR(50) 与 VARCHAR(500) 的差异
在MySQL数据库中,`VARCHAR`类型是一种非常灵活的字符串存储类型,它允许存储可变长度的字符串。然而,`VARCHAR(50)`和`VARCHAR(500)`之间的差异不仅仅是长度的不同,它们在存储效率、性能和使用场景上也有所不同。本文将深入探讨这两种字段类型的区别及其对数据库设计的影响。
45 2
|
1月前
|
存储 SQL 关系型数据库
mysql 的ReLog和BinLog区别
MySQL中的重做日志(Redo Log)和二进制日志(Binary Log)是两种重要的日志系统。重做日志主要用于保证事务的持久性和原子性,通过记录数据页的物理修改信息来恢复未提交的事务更改。二进制日志则记录了数据库的所有逻辑变化操作,用于数据的复制、恢复和审计。两者在写入时机、存储方式、配置参数和使用范围上有所不同,共同确保了数据库的稳定性和可靠性。
|
1月前
|
存储 关系型数据库 MySQL
PHP与MySQL动态网站开发深度解析####
本文作为技术性文章,深入探讨了PHP与MySQL结合在动态网站开发中的应用实践,从环境搭建到具体案例实现,旨在为开发者提供一套详尽的实战指南。不同于常规摘要仅概述内容,本文将以“手把手”的教学方式,引导读者逐步构建一个功能完备的动态网站,涵盖前端用户界面设计、后端逻辑处理及数据库高效管理等关键环节,确保读者能够全面掌握PHP与MySQL在动态网站开发中的精髓。 ####
|
1月前
|
存储 关系型数据库 MySQL
MySQL MVCC深度解析:掌握并发控制的艺术
【10月更文挑战第23天】 在数据库领域,MVCC(Multi-Version Concurrency Control,多版本并发控制)是一种重要的并发控制机制,它允许多个事务并发执行而不产生冲突。MySQL作为广泛使用的数据库系统,其InnoDB存储引擎就采用了MVCC来处理事务。本文将深入探讨MySQL中的MVCC机制,帮助你在面试中自信应对相关问题。
141 3

推荐镜像

更多