说GTID-与GTID相关的系统变量-创新互联

gtid_next

创新互联公司是一家以网络技术公司,为中小企业提供网站维护、成都网站建设、网站制作、网站备案、服务器租用、空间域名、软件开发、微信小程序开发等企业互联网相关业务,是一家有着丰富的互联网运营推广经验的科技公司,有着多年的网站建站经验,致力于帮助中小企业在互联网让打出自已的品牌和口碑,让企业在互联网上打开一个面向全国乃至全球的业务窗口:建站服务热线:18980820575

默认事务提交时,MySQL会为其生成一个GTID。当事务在Slave节点上回放时,使用的却是该事务在Master节点上产生的GTID,究其缘由和一个会话级系统变量gtid_next有关。

若gtid_next的值为AUTOMATIC(其默认值),当启用二进制日志,无论在Slave节点还是Master节点上,事务提交都会产生新的GTID。但若将gtid_next赋值一个有效的GTID,那么该GTID就是接下来提交的事务的GTID,同时该GTID会被添加到GTID集合gtid_executed。Slave节点上的回放线程正式利用了这一点,把在Master节点上生成的GTID赋值给@@SESSION.gtid_next,继而将此GTID原封不动的保存在了Slave节点上。

gtid_purged

全局系统变量gtid_purged代表了所有已经提交了,但在二进制日志中又清除掉了的事务的GTID集合。

全局系统变量gtid_purged是gtid_executed的子集合,如下情形会引起gtid_purged集合的变化:

·Slave节点上禁用了二进制日志,随着回放线程提交复制过来的事务,gtid_purged会发生变化。

·二进制日志文件被清除时,gtid_purged会发生变化。

·@@GLOBAL.gtid_purged被赋值时,gtid_purged会发生变化。

可以通过改变gtid_purged集合,来表明该事务已提交了,但在二进制日志文件中被清除掉了。当向gtid_purged集合添加GTID时,同时也会向gtid_executed集合添加此GTID。通过备份增加一个只读实例,正是利用的该思路。在MySQL 5.7版本,只能在gtid_executed集合为空时,才能设置gtid_purged。

每个二进制日志文件头部都记录了一个Previous_gtids_log_event事件,它代表了该二进制日志文件之前所有二进制日志文件中GTID的集合(即,第N个二进制日志文件中的Previous_gtids_log_event,等于第N-1个二进制日志文件中的Previous_gtids_log_event,和第N-1的文件中所有Gtid_log_event的并集)。

gtid_executed和gtid_purged这两个全局系统变量,在MySQL启动时就是通过最老的,和最新的二进制日志文件中的Previous_gtids_log_event和Gtid_log_event被初始化的。

gtid_executed集合被初始化的过程如下:

gtid_executed = 最新的二进制日志文件中的Previous_gtids_log_event + 最新的二进制日志文件中所有的Gtid_log_event + 系统表mysql.gtid_executed中的GTID(但该GTID集合不包含正在执行着的GTID,即@@GLOBAL.gtid_owned)。

gtid_purged集合被初始化的思路是这样的:

第一个等式:

现存(存在)的二进制日志文件中的GTID,和被清除掉的二进制日志文件中的GTID的并集,即gtids_in_binlog。

gtids_in_binlog = 最新的二进制日志文件中的Previous_gtids_log_event + 最新的二进制日志文件中所有的Gtid_log_event

第二个等式:

现存(存在)的二进制日志文件中的GTID,即gtids_in_binlog_not_purged。

gtids_in_binlog_not_purged = gtids_in_binlog - 最老的二进制日志文件中的Previous_gtids_log_event

第三个等式:

曾经出现过,但现在已不存在于二进制日志文件中的GTID,即gtid_purged。

gtid_purged = gtid_executed - gtids_in_binlog_not_purged

通过这3个等式可得到:

gtid_purged = gtid_executed - gtids_in_binlog_not_purged = 最新的二进制日志文件中的Previous_gtids_log_event + 最新的二进制日志文件中所有的Gtid_log_event + 系统表mysql.gtid_executed中的GTID - ((最新的二进制日志文件中的Previous_gtids_log_event + 最新的二进制日志文件中所有的Gtid_log_event) - 最老的二进制日志文件中的Previous_gtids_log_event)

即,gtid_purged = 系统表mysql.gtid_executed中的GTID + 最老的二进制日志文件中的Previous_gtids_log_event

与上边两个全局系统变量初始化相关的一个系统参数是binlog_gtid_simple_recovery,若其值为FALSE,在初始化该两个变量时,MySQL会遍历所有的二进制日志文件,而不仅是最老的,和最新的二进制日志文件,此过程可能会花费较长的时间。

另外有需要云服务器可以了解下创新互联cdcxhl.cn,海内外云服务器15元起步,三天无理由+7*72小时售后在线,公司持有idc许可证,提供“云服务器、裸金属服务器、高防服务器、香港服务器、美国服务器、虚拟主机、免备案服务器”等云主机租用服务以及企业上云的综合解决方案,具有“安全稳定、简单易用、服务可用性高、性价比高”等特点与优势,专为企业上云打造定制,能够满足用户丰富、多元化的应用场景需求。


本文标题:说GTID-与GTID相关的系统变量-创新互联
标题链接:http://myzitong.com/article/dghjho.html