如果实例存在,则可以根据实例的状态查询ALL_GTID。
如果实例崩溃,则无法在实例状态下查询ALL_GTID。 可以通过查询BINLOG的Previous-GTIDs计算来获取ALL_GTID。
以下列举了与ALL_GTID相关的变量。
与ALL_GTID相关的变量
Previous-GTIDs
Previous-GTIDs的格式如下。 环境为MySQL5.7,日志手动在flush binary logs中获取。
浏览新轮转的BINLOG :
mysql-bin.00001中包含的GTID如下所示。
请点击输入图像的说明
然后再次使用flush binary logs:
请点击输入图像的说明
mysql-bin.00002中没有GTID。
请点击输入图像的说明
因此,Previous-GTIDs是自身这个BINLOG文件之前的所有BINLOG的集合。
请点击输入图像的说明
全局变量中与GTID相关的变量
请点击输入图像的说明
变量解释:
GTID_executed表示执行服务器上的所有事务所生成的GTID。 这包括已经purge的BINLOG的GTID或手动设置GTID _ purged的gtid。
GTID_purged表示已经purge的gtid。 gtid_purged是gtid_executed的子集。
GTID_retrieved是桌面上relay_log的gtid。
ALL_GTID计算
了解GTID相关变量后,可以获得获取实例的All_GTID集合的方法。
对象
方法
存活的主实例gtid_executed
生存的Slave实例gtid_executed和gtid_retrieved的并集
非存活主实例的最后一个BINLOG文件的Previous-GTIDs最后一个BINLOG文件中的所有GTID
未存活的Slave实例的最后一个BINLOG文件的Previous-GTIDs最后一个BINLOG文件中的所有GTID
如果获取非存活实例的ALL_GTID,则必须扫描最后一个BINLOG文件,因为最后一个BINLOG文件的GTID可能不是连续的。 例如,事务既来自此实例的客户端,也来自复制播放。
在生产环境中,我们使用Xtrabackup通过实例创建了流程。
进行备份和恢复
变更主目标
set @@global.gtid_purged='xxx ';
set @@global.gtid_purged='xxx '; 的影响:
如果手动将实例的ALL_GTID设置为xxx,则使用GTID方法创建复制时不会发生错误。
Binlog中记录的Previous-GTIDs被更新(因为Binlog不能变更,所以生成新的Binlog,新的Previous-GTIDs被记录)。
MySQL 5.7中set gtid_purged的行为更改
问题的说明
请检查备份恢复过程:
进行备份和恢复
变更主目标
set @@global.gtid_purged='xxx ';
症状:MySQL5.7的Slave服务器恢复后,发现未生成正确的预配ids。
分析
分析整个过程,解决问题要分阶段进行手动模拟来发现问题。 详细步骤如下所示。
手动恢复备份
环境
BINLOG数,Previous-GTIDs状态
Xtrabackup 2.4.2 MySQL 5.6 1,空
Xtrabackup 2.4.2 MySQL 5.7 1,空
Xtrabackup 2.2.9 MySQL 5.6 1,空
Xtrabackup 2.2.9 MySQL 5.7 1,空
可以看到:恢复过程不会轮换BINLOG。
检查在不同版本的MySQL上执行change master和set gtid_purged的差异
环境
BINLOG数,Previous-GTIDs状态
更改主文件MySQL 5.6 1,为空
更改主文件MySQL 5.7 1,为空
set gtid_purged MySQL 5.6 2,正常
set gtid_purged MySQL 5.7 1,为空
在:上运行set gtid_purged时,可以看到MySQL版本之间存在差异
验证
针对不同版本的MySQL分别设置set @@global.gtid_purged=' '; 语句。 检查结果
环境
的操作
BINLOG数,Previous-GTIDs状态
MySQL 5.7重置主程序; set @@global.gtid_purged="; 1、天空
MySQL 5.6重置主程序; set @@global.gtid_purged="; 2、正常
结论
请参阅:3358 bugs.MySQL.com/bug.PHP? id=75767
在公式解释: 5.7版中,执行SET GTID_PURGED语句后,binlog_simple_gtid_recovery会为GTID_PURGED计算错误的值。
存储GTID的表已添加到5.7中。 所以在5.7版中set @@global.gtid_purged=' '; 语句已更改为仅修改存储GTID的表。
5.6版将向BINLOG轮转和Previous_GTIDs_log_event添加gtid。 如果需要在5.7中生成与5.6相同的结果,则可以在SET GTID_PURGED语句之后手动执行flush binary logs语句。