转载自:老叶茶馆(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)。社区通过技术交流,线上、线下活动的分享,不断帮助用户提升数据库技能、获取数据库最佳实践,帮助用户更好、更安全的使用数据库。【做中国最好的共享数据库技术知识的社区】
领取专属 10元无门槛券
私享最新 技术干货