前言

MySQL 5.6引入了GTID,每个事务都会产生一个GTID,我们可以通过验证主从GTID来验证主从数据的一致性。

为了叙述简便,定义一个量ALL_GTID: 表示某个数据库实例上 所有存在过的 或 将要存在的事务 的GTID(包括已经被purge掉的事务)。

在讨论数据库可用性的场景中, 当发生主备切换时, 需要进行数据补偿。通过比较主备的ALL_GTID,可以确定需要补偿多少数据:在实例存活的情况,可以在实例状态中查询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 代表着server上所有事务执行产生的GTID(包含已经被purge的BINLOG中的GTID或者是手动set gtid_purged的GTID)。

gtid_purged 代表着已经被purge到的GTID。gtid_purged是gtid_executed的子集。

gtid_retrieved 是从机上relay_log中的GTID。

ALL_GTID 的计算

了解了GTID相关的变量之后,可以得到获得实例的All_GTID的集合的方法:

对象方法存活的Master实例gtid_executed存活的Slave实例gtid_executed和gtid_retrieved的并集非存活Master实例最后一个BINLOG文件的Previous-GTIDs + 最后一个BINLOG文件中所有的GTID非存活Slave实例最后一个BINLOG文件的Previous-GTIDs + 最后一个BINLOG文件中所有的GTID

在获得非存活实例中的ALL_GTID时,最后一个BINLOG文件中的GTID可能不连续(比如事务同时来自于本实例客户端和复制回放),所以需要扫描最后一个BINLOG文件。

生产中我们使用Xtrabackup来产生一个 从实例 的流程如下:拉取备份,进行还原

change master to

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的行为变更

问题描述

回顾一下备份恢复的流程:拉取备份,进行还原

change master to

set @@global.gtid_purged='xxx';

现象: 发现有一台MySQL 5.7的Slave服务器恢复后没有产生 正确的Previous-GTIDs。

分析

分析整个过程,解决问题应该分阶段进行手动模拟发现问题。以下为详细步骤:手工还原备份

环境BINLOG数量,Previous-GTIDs状态Xtrabackup 2.4.2 & MySQL 5.61,空Xtrabackup 2.4.2 & MySQL 5.71,空Xtrabackup 2.2.9 & MySQL 5.61,空Xtrabackup 2.2.9 & MySQL 5.71,空

可见: 恢复过程不会轮转BINLOG。验证change master和set gtid_purged在不同的MySQL版本中执行的差异

环境BINLOG数量,Previous-GTIDs状态change master & MySQL 5.61,空change master & MySQL 5.71,空set gtid_purged & MySQL 5.62,正常set gtid_purged & MySQL 5.71,空

可见: 执行set gtid_purged时不同版本的MySQL产生了差异

验证

对不同版本MySQL单独执行set @@global.gtid_purged='';语句。检查结果

环境进行的操作BINLOG数量,Previous-GTIDs状态MySQL 5.7reset master; set @@global.gtid_purged=”;1,空MySQL 5.6reset master; set @@global.gtid_purged=”;2,正常

结论

参考: http://bugs.mysql.com/bug.php?id=75767

官方解释: 在5.7版本中,执行SET GTID_PURGED语句后binlog_simple_gtid_recovery会给GTID_PURGED计算出一个错误的值。

由于5.7中新增了存储GTID的表。所以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语句。

MySQL gtid purge_MySQL中set gtid_purged的行为变更及对备份恢复的影响相关推荐

  1. Mysql主从同步复制(快速构建,基于CP数据备份 恢复)

    目录 相关 思路 主库 1.检查主库是否开启log-bin 2.开启log-bin 3.重启MySQL 4.检查生成的log-bin目录 5.进入MySQL,锁表,记录POS号 6.备份mysql文件 ...

  2. MySQL gtid purge_MySQL GTID

    [Global Transaction ID] GTID(Global Transaction ID)是对于一个已提交事务的编号,并且是一个全局唯一的编号. GTID实际上是由UUID+TID组成的. ...

  3. mysql gtid 备份恢复_MYSQL数据库备份恢复

    在实例存活的情况,可以在实例状态中查询ALL_GTID. 在实例崩溃的情况,无法在实例状态中查询ALL_GTID.可以通过查询BINLOG中的Previous-GTIDs计算来获得ALL_GTID. ...

  4. 容器化|在 S3 备份恢复 RadonDB MySQL 集群数据

    作者:程润科.钱芬 视频:钱芬 上一篇文章我们演示了如何快速实现 MySQL 高可用集群部署,以及部署集群的校验和卸载方式.本文将演示如何对集群进行备份和恢复. 部署版本为 RadonDB MySQL ...

  5. mysql gtidpurged_Mysql 5.7 Gtid内部学习(五) mysql.gtid_executed表/gtid_executed变量/gtid_purged变量的更改时机...

    本节将集中讨论下面三种Gtid更新的时机,这部分相当重要,后面的故障案列会和这节有关.下面先来看一下他们的定义 mysql.gtid_executed表:Gtid持久化的介质,Mysql启动阶段会读取 ...

  6. mysql.gtid executed_MYSQL 5.7中新增的表GTID_EXECUTED

    MYSQL 5.7中新增的表GTID_EXECUTED 正文 MySQL 5.6版本开启GTID模式,必须要先打开参数log_slave_updates,简单来说就是一定在从机上再记录一份二进制日志. ...

  7. mysql gtid ha_MySQl新特性 GTID

    GTID简介 概念 全局事务标识符(GTID)是创建的唯一标识符,并与在源(主)服务器上提交的每个事务相关联.此标识符不但是唯一的,而且在给定复制设置中的所有服务器上都是唯一的.所有交易和所有GTID ...

  8. 如何查看mysql的gtid_汇总丨MySQL GTID技术点,看这一篇就够了!

    mysql> SELECT * FROM mysql.gtid_executed; mysql.gtid_executed表是由MySQL服务器提供给内部使用的.它允许副本在副本上禁用二进制日志 ...

  9. mysql gtid 还是pxc_记一次 PXC 集群拆分引发的思考

    原标题:记一次 PXC 集群拆分引发的思考 作者简介 冷正磊 2018年2月加入去哪儿网 DBA 团队,主要负责机票业务的 MySQL 和 Redis 数据库的运维管理工作,以及数据库自动化运维平台部 ...

  10. MySQL GTID复制Slave跳过错误事务Id以及复制排错问题总结

    GTID复制典型的复制错误有两种: 1,数据对象级别的错误,包括主库上update的数据在从库上不存在,主从逐渐冲突,库表索引等对象的冲突等等,   如果是纯粹的跳过错误的话,这一类的错误需要跳过思路 ...

最新文章

  1. Java面试题之多线程同步和互斥有几种实现方法,都是什么?
  2. 7.Array 数组对象
  3. thinkphp5模拟post请求_Thinkphp5.1模拟登录并提交form表单
  4. DS1302——51
  5. linux mysql v_Linux 主机升级MySQL v5.5 性能提升360%
  6. 系统英伟达gpu驱动卸载_绕过CPU,英伟达让GPU直连存储设备
  7. 前端笔记-vue cli为web添加底纹
  8. Keil MDK从未有过的详细使用讲解
  9. PAT 1012 数字分类 (20 分)(C语言)
  10. 高T技术大牛的百度十年:白天求生存,晚上求发展
  11. SGI和Intel计划在2018年以前,将超级计算机速度提高500倍
  12. 右键文件夹没有git clone命令的解决方法
  13. 360公司2015年秋季校园招聘笔试考卷(技术类 D)部分试题程序验证和解析1
  14. Android6.0 Marshmallow运行时权限申请框架
  15. 谁发明了验证码?你出来 保证不打死你
  16. [学习笔记]Java如何处理EXCEL的读取
  17. 从高德地图获取城市公交线路+站点
  18. Error in sitecustomize; set PYTHONVERBOSE for traceback: NameError: name 'modules_list' is not defin
  19. Person Re-Identification(ReID行人重识别)
  20. 3.1 Web前端:实战电商页面1:静态布局

热门文章

  1. html替换图片上的文字,如何在图片上改字|超简单的修改图片里文字方法
  2. 宁德时代发布第一代钠离子电池;联泰科技与赢创联合研发实验室成立;霍尼韦尔高管人事变动 | 能动...
  3. 微信小程序学习资料——转载
  4. chm文件打开文字排版错乱
  5. apkg格式怎么打开_pdf转图片怎么转?分享最简单的PDF转图片方法
  6. 儒略日小工具-输入年月日时分秒转换儒略日
  7. MATLAB学习笔记:求偏导
  8. Matlab运行.m文件
  9. 创业怎么赚信息差的钱?信息差的项目有哪些?
  10. linux python for循环语句,Python之for循环的使用