本节将讨论下面3种信息更新的时机,因为我发现经常有朋友问我为什么主库和从库的这几个地方的修改时机不一样。下面我们先来看一下它们的定义。其中gtid_executed和gtid_purged变量都是我们通过命令‘show global variables’来获取的。
1. mysql.gtid_executed表:GTID持久化的介质,GTID模块初始化的时候会读取这个表来作为获取gtid_executed变量的基础。
2. gtid_executed变量:表示数据库中执行了哪些GTID,它是一个GTID SET处于内存中。‘show slave status’中的Executed_Gtid_Set和‘show master status’中的Executed_Gtid_Set都来自于它。
3. gtid_purged变量:表示由于binary log文件的删除(如purge binary logfiles或者超过expire_logs_days设置)已经丢失的GTID Event,它是一个GTID SET处于内存中。我们在搭建备库的时候,通常需要使用‘set global gtid_purged’命令来设置本变量,用于表示这个备份已经执行了哪些GTID操作。注意手动删除binary log将不会更新这个变量。
这也是我们DBA通常能够观察到的几种GTID信息,有了前文的描述我们知道其中mysql.gtid_executed表是一种GTID持久化的介质,而gtid_executed和gtid_purged变量则对应了内部结构体Gtid_state中的executed_gtids和lost_gtids内存数据,它们分别表示数据库执行了哪些GTID操作,有哪些GTID操作由于binary log文件的删除已经丢失了。
其次我们先来达成一个共识,gtid_executed变量一定是实时更新的,不管主库还是从库。我们的讨论将分为三部分:
- 主库修改时机
- 从库修改时机
- 通用修改时机
我们约定都是打开GTID的情况下。下面我们先给出总结然后再来逐一分析。
一、总结
我这里先给出总结然后再具体分析原因,我使用一张图来更加清晰的表示如下(图1):