深入理解MySQL 5.7 GTID系列(三):GTID的生成时机

转载自:老叶茶馆(iMySQL_WX)

作者:高鹏(重庆八怪)

原文地址:

https://www.jianshu.com/p/6ee969dc2c9b

本次将陆续推出系列文章共十篇,本文使用的源码版本为percona 5.7.14,也比较过5.7.17,5.6.25的源码版本,暂时没有能力比较全部的MySQL源码版本,如有误导还请见谅。

一、GTID生成类型

这里首先使用源码的解释给出三种类型:

AUTOMATIC_GROUP

GTID_GROUP

ANONYMOUS_GROUP

其中AUTOMATIC_GROUP通常用于主库开启GTID的情况,GTID_GROUP通常用于备库和使用了GTID_NEXT的情况下。

源码中有详细解释如下:

二、GTID和LAST_COMMT/SEQUNCE_NUMBER的生成时机

GTID其实是在COMMIT的时候调用MySQL_BIN_LOG::ORDERED_COMMIT执行到FLUSH阶段产生GTID EVENT的时候才生成,生成后会将这个GTID加入到GTID_STATE的OWNED_GTIDS中,实际上这个过程不仅要生成GTID还会生成SEQUENCE_NUMBER和LAST_COMMIT并且会构造GTID_EVENT写入到BINLOG CACHE,最后将BINLOG CACHE写入到BINLOG FILE(注意这里还没有调用FSYNC真正落盘),下面是BINLOG_CACHE_DATA::FLUSH函数的片段:

下面是MySQL_BIN_LOG.WRITE_GTID中生成GTID和LAST_COMMT/SEQUNCE_NUMBER的代码片段:

其调用栈帧如下:

接下来我们就需要具体研究下一个GTID是依靠什么逻辑生成的。我们需要查看函数GTID_STATE::GENERATE_AUTOMATIC_GTID和GTID_STATE::GET_AUTOMATIC_GNO逻辑,他们用于生成一个GTID。

三、GTID_STATE::GENERATE_AUTOMATIC_GTID逻辑

接下来看看GNO的生成逻辑GTID_STATE::GET_AUTOMATIC_GNO。

四、GTID_STATE::GENERATE_AUTOMATIC_GTID逻辑

五、本节小结

学习完本节至少能够学习到:

GTID在主库什么时候时候生成。

LAST_COMMIT/SEQUENCE_NUMBER什么时候生成。

GTID的生成逻辑是怎么样的。

如果有源码阅读能力的同学可以按照这个框架继续深入学习。

社区介绍

DBGeeK社区的创建,是为了更好的提供一个DBA的交流和活动平台(QQ群:516293316)。社区通过技术交流,线上、线下活动的分享,不断帮助用户提升数据库技能、获取数据库最佳实践,帮助用户更好、更安全的使用数据库。【做中国最好的共享数据库技术知识的社区】

  • 发表于:
  • 原文链接:http://kuaibao.qq.com/s/20180201B0643I00?refer=cp_1026

同媒体快讯

相关快讯

扫码关注云+社区