之所以把MySQL.GTID_EXECUTED表的作用和PREVIOUS GTID EVENT的改变放到一起进行描述是因为它们后面文章探讨的基础。这部分使用到了我自己使用C语言写的原生BINLOG解析工具INFOBIN。

一、GTID EVENT

为什么要先描述什么是GTID EVENT呢?因为后面会用到,实际上在其中核心元素就是一个形如:

31704d8a-da74-11e7-b6bf-52540a7d243:100009

的一个GTID 处于整个事务EVENT中的开始,用于描述这个事务的GTID 是多少,当然在5.7中为了支持MTS其中还封装了LAST_COMMIT/SEQUENCE_NUMBER。那么使用INFOBIN工具查看一个INSERT单条语句完整事务的EVENT包括如下:

>Gtid Event:Pos:234(0Xea) N_pos:299(0X12b) Time:1513135186Event_size:65(bytes) Gtid:31704d8a-da74-11e7-b6bf-52540a7d243:100009last_committed=0sequence_number=1-->Query Event:Pos:299(0X12b) N_Pos:371(0X173) Time:1513135186Event_size:72(bytes) Exe_time:0Use_db:test Statment(35b-trun):BEGIN/*!Trx begin!*/Gno:100009---->MapEvent:Pos371(0X173) N_pos:415(0X19f) Time:1513135186Event_size:44(bytes) TABLE_ID:108DB_NAME:test TABLE_NAME:a Gno:100009------>Insert Event:Pos:415(0X19f) N_pos:455(0X1c7) Time:1513135186Event_size:40(bytes) Dml on table: test.a  table_id:108Gno:100009>Xid Event:Pos:455(0X1c7) N_Pos:486(0X1e6) Time:1513135186Event_size:31(bytes) COMMIT;/*!Trx end*/Gno:100009

当然也可以使用MySQLBINLOG进行分析,只是格式稍微不那么友好。

二、GTID_EXECUTED表的作用

这一部分是重点中的重点,也是我以前一直疑惑的,请大家细细品读。

官方文档这样描述GTID_EXECUTED表

BeginningwithMySQL5.7.5, GTIDs are storedina table named gtid_executed,inthe mysqldatabase. A rowinthistable contains,foreach GTID or setofGTIDs that it represents, the UUIDoftheoriginating server, and the starting and ending transaction IDsofthe set;fora row referencing only asingle GTID, these last two values are the same.

也就是说GTID_EXECUTED表是GTID持久化的一个工具,如前文所描述GTID_STATE中的

GET_EXECUTED_GTIDS/GET_LOST_GTIDS/GET_GTIDS_ONLY_IN_TABLE/GET_PREVIOUS_GTIDS_LOGGED这些数据都是存储在内存中的,那么在数据库重启后需要进行初始化,那么这需要读取GTID持久化的介质,我们可以发现GTID_EXECUTED是一个

INNODB表建表语句如下,并且我们可以手动更改它,但是千万不要这么干:

Table: gtid_executedCreate Table: CREATE TABLE`gtid_executed`(`source_uuid`char(36) NOT NULL COMMENT'uuid of the source where the transaction was originally executed.',`interval_start`bigint(20) NOT NULL COMMENT'First number of interval.',`interval_end`bigint(20) NOT NULL COMMENT'Last number of interval.',  PRIMARY KEY (`source_uuid`,`interval_start`)) ENGINE=InnoDB DEFAULT CHARSET=utf8 STATS_PERSISTENT=0

那么在5.7.5以前没有GTID_EXECUTED表不是也没有问题吗?其实除了GTID_EXECUTED表以外我们还有一个GTID持久化的介质那就是BINLOG中的GTID EVENT。所以总结一下GTID持久化介质:

GTID_EXECUTED表

BINLOG中的GTID  EVENT

那么既然有了BINLOG的GTID EVENT进行持久化那么为什么还需要GTID_EXECUTED表呢?这实际上就是5.7.5过后的一个优化,我们可以反过来思考在5.6中如果使用了GTID 做从库,从库如果不开启BINLOG并且同时设置LOG_SLAVE_UPDATES=TURE那么从库的执行过的GTID事务是没有办法持久化的。我们来一段5.6官方文档对于搭建GTID从库的其中一步:

Step3: Restart both serverswithGTIDs enabled. To enable binary loggingwithglobaltransaction identifiers, each server must be startedwithGTID mode, binary logging, slave updatelogging enabled, andwithstatements that are unsafeforGTID-based replication disabled. In addition,you should prevent unwanted or accidental updatesfrombeing performed on either server by startingbothinread-only mode. This means that both servers must be startedwith(at least) the options showninthe following invocationofmysqld_safe:shell> mysqld_safe --gtid_mode=ON --log-bin --log-slave-updates --enforce-gtid-consistency &

开启BINLOG同时设置设置LOG_SLAVE_UPDATES=TURE必然造成一个问题,实际上从库很多时候我们是不需要做级联SLAVE,设置LOG_SLAVE_UPDATES=TURE会造成需要额外的空间和性能开销。自然这种情况下我们需要另外的一种GTID持久化介质,而并不是BINLOG中的GTID EVENT。为了解决这个问题,5.7中GTID_EXECUTED表应运而生了。然而GTID_EXECUTED表是否需要实时更新呢?显然在slave端不开启BINLOG或者开启BINLOG不设置LOG_SLAVE_UPDATES=TURE的情况下它需要实时更新,因为I/OTHREAD执行过得GTID是必须持久化的,而在主库上因为有BINLOG的GTID EVENT的存在他是不需要实时更新的,这样不同的对待方式也能够减轻负担提高性能。

mysql gtid深入_深入理解MySQL 5.7 GTID系列(四):mysql.gtid_executedPREVIOUS GTID EVENT相关推荐

  1. mysql recovery参数_深入理解MySQL 5.7 GTID系列(七)binlog_gtid_simple_recovery参数的影响总结...

    想了想还是专门开了一节来总结这个问题: 5.7.6以下中默认 simplified_binlog_gtid_recovery=flase 5.7.6以上中默认 binlog_gtid_simple_r ...

  2. mysql 高级知识点_这是我见过最全的《MySQL笔记》,涵盖MySQL所有高级知识点!...

    作为运维和编程人员,对MySQL一定不会陌生,尤其是互联网行业,对MySQL的使用是比较多的.MySQL 作为主流的数据库,是各大厂面试官百问不厌的知识点,但是需要了解到什么程度呢?仅仅停留在 建库. ...

  3. 马哥 mysql教学笔记_【马哥linux学员学习笔记】MySQL多实例详解

    本文作者系马哥linux学员云中鹤. 学习联系QQ:1660809109.1661815153.2813150558 马哥Linux运维 更多资讯:www.magedu.com 目录 一.基本概念 1 ...

  4. 2台mysql集群_如何安装配置基于2台服务器的MySQL集群

    这篇文章旨在介绍如何安装配置基于2台服务器的MySQL集群.并且实现任意一台服务器出现问题或宕机时MySQL依然能够继续运行. 注意!虽然这是基于2台服务器的MySQL集群,但也必须有额外的第三台服务 ...

  5. mysql rds 迁移_数据库迁移:如何将数据库从本地MySQL迁移到服务器RDS上?

    使用 数据传输服务 DTS 可以将本地 MySQL 实例的数据迁移到 RDS for MySQL 实例.数据传输服务 DTS (以下简称 DTS) 提供的增量数据同步功能,可以实现在本地应用不停服的情 ...

  6. opboot怎么刷入固件_矿渣高性价比竞斗云系列四:竞斗云最强刷机OPBOOT1.09+128M固件刷机...

    本章前言: 上一篇我们讲解了<矿渣高性价比竞斗云系列三:拆机刷智能OpenWRT路由系统>,收到广大群友的一直认可,本章继续讲解一个免拆机刷机教程,很多小伙伴或多或少听过竞斗云,恩山论坛也 ...

  7. mysql核心技术分析_深入理解MySQL核心技术

    前言 第1章 MySQL的历史与架构 MySQL的历史 MySQL的架构 第2章 MySQL源代码基本要点 Unix Shell BitKeeper 准备系统:从BitKeeper树构建MySQL 从 ...

  8. mysql bdb版本_深入理解mysql之BDB系列(1)---BDB相关基础知识

    深入理解mysql之BDB系列(1) ---BDB相关基础知识 作者:杨万富 一:BDB体系结构 1.1.BDB体系结构 BDB总体的体系结构如图1.1所看到的,包括五个子系统(见图1.1中相关数). ...

  9. mysql in 原理_深入理解MySql子查询IN的执行和优化

    IN为什么慢? 在应用程序中使用子查询后,SQL语句的查询性能变得非常糟糕.例如: SELECT driver_id FROM driver where driver_id in (SELECT dr ...

最新文章

  1. 安装Redis Live监控服务
  2. 数据结构与算法书籍推荐
  3. 2018 ICPC Asia Jakarta Regional Contest J. Future Generation 状压dp
  4. python 生成xml文件
  5. 搜狐视频开放平台的申请使用方法
  6. Git工作流中常见的三种分支策略:GitFlow、GitHubFlow和GitLabFlow
  7. mysql udf http,mysql下mysql-udf-http效率测试小记
  8. 在RedHat中安装新字体
  9. book_note for《Linux程序设计》chapter3 Linux系统C语言开发工具
  10. 为啥春节抢红包总不是运气王?看完微信抢红包算法你就明白了
  11. UART串口协议时序图
  12. Android 热更新Robust 浅析
  13. Linux文件目录sha256,如何使用 SHA256 校验下载的文件
  14. 【5G核心网】5GC核心网之网元UDM
  15. Hibernate 的检索策略
  16. 几款常见接口管理平台对比
  17. python 捕捉和模拟鼠标键盘操作
  18. css箭头图片方向转换
  19. 注册表使用全攻略(1)
  20. Python中求矩阵的逆

热门文章

  1. 图解:为什么非公平锁的性能更高?
  2. 第 1-3 课:深入理解字符串 + 面试题
  3. JS关键字和保留字汇总
  4. 安卓手机使用linux(含图形界面)——Aid Learning
  5. webpack入坑指南
  6. curl put方法 测试http_HTTP接口调试利器!4.8万Star的HTTP命令行客户端!
  7. html盒子居中的方式,CSS盒子居中三种方法
  8. 串的块链存储c语言栈,小蚂蚁学习数据结构(18)——串的块链的代码实现
  9. java dispatcher详解_dispatcherservlet初始化过程详解
  10. github上成员贡献量_真祖传代码!你的GitHub代码已打包运往北极,传给1000年后人类...