mysql gtid深入_深入理解MySQL 5.7 GTID系列(四):mysql.gtid_executedPREVIOUS GTID EVENT
之所以把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相关推荐
- 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 ...
- mysql 高级知识点_这是我见过最全的《MySQL笔记》,涵盖MySQL所有高级知识点!...
作为运维和编程人员,对MySQL一定不会陌生,尤其是互联网行业,对MySQL的使用是比较多的.MySQL 作为主流的数据库,是各大厂面试官百问不厌的知识点,但是需要了解到什么程度呢?仅仅停留在 建库. ...
- 马哥 mysql教学笔记_【马哥linux学员学习笔记】MySQL多实例详解
本文作者系马哥linux学员云中鹤. 学习联系QQ:1660809109.1661815153.2813150558 马哥Linux运维 更多资讯:www.magedu.com 目录 一.基本概念 1 ...
- 2台mysql集群_如何安装配置基于2台服务器的MySQL集群
这篇文章旨在介绍如何安装配置基于2台服务器的MySQL集群.并且实现任意一台服务器出现问题或宕机时MySQL依然能够继续运行. 注意!虽然这是基于2台服务器的MySQL集群,但也必须有额外的第三台服务 ...
- mysql rds 迁移_数据库迁移:如何将数据库从本地MySQL迁移到服务器RDS上?
使用 数据传输服务 DTS 可以将本地 MySQL 实例的数据迁移到 RDS for MySQL 实例.数据传输服务 DTS (以下简称 DTS) 提供的增量数据同步功能,可以实现在本地应用不停服的情 ...
- opboot怎么刷入固件_矿渣高性价比竞斗云系列四:竞斗云最强刷机OPBOOT1.09+128M固件刷机...
本章前言: 上一篇我们讲解了<矿渣高性价比竞斗云系列三:拆机刷智能OpenWRT路由系统>,收到广大群友的一直认可,本章继续讲解一个免拆机刷机教程,很多小伙伴或多或少听过竞斗云,恩山论坛也 ...
- mysql核心技术分析_深入理解MySQL核心技术
前言 第1章 MySQL的历史与架构 MySQL的历史 MySQL的架构 第2章 MySQL源代码基本要点 Unix Shell BitKeeper 准备系统:从BitKeeper树构建MySQL 从 ...
- mysql bdb版本_深入理解mysql之BDB系列(1)---BDB相关基础知识
深入理解mysql之BDB系列(1) ---BDB相关基础知识 作者:杨万富 一:BDB体系结构 1.1.BDB体系结构 BDB总体的体系结构如图1.1所看到的,包括五个子系统(见图1.1中相关数). ...
- mysql in 原理_深入理解MySql子查询IN的执行和优化
IN为什么慢? 在应用程序中使用子查询后,SQL语句的查询性能变得非常糟糕.例如: SELECT driver_id FROM driver where driver_id in (SELECT dr ...
最新文章
- 安装Redis Live监控服务
- 数据结构与算法书籍推荐
- 2018 ICPC Asia Jakarta Regional Contest J. Future Generation 状压dp
- python 生成xml文件
- 搜狐视频开放平台的申请使用方法
- Git工作流中常见的三种分支策略:GitFlow、GitHubFlow和GitLabFlow
- mysql udf http,mysql下mysql-udf-http效率测试小记
- 在RedHat中安装新字体
- book_note for《Linux程序设计》chapter3 Linux系统C语言开发工具
- 为啥春节抢红包总不是运气王?看完微信抢红包算法你就明白了
- UART串口协议时序图
- Android 热更新Robust 浅析
- Linux文件目录sha256,如何使用 SHA256 校验下载的文件
- 【5G核心网】5GC核心网之网元UDM
- Hibernate 的检索策略
- 几款常见接口管理平台对比
- python 捕捉和模拟鼠标键盘操作
- css箭头图片方向转换
- 注册表使用全攻略(1)
- Python中求矩阵的逆
热门文章
- 图解:为什么非公平锁的性能更高?
- 第 1-3 课:深入理解字符串 + 面试题
- JS关键字和保留字汇总
- 安卓手机使用linux(含图形界面)——Aid Learning
- webpack入坑指南
- curl put方法 测试http_HTTP接口调试利器!4.8万Star的HTTP命令行客户端!
- html盒子居中的方式,CSS盒子居中三种方法
- 串的块链存储c语言栈,小蚂蚁学习数据结构(18)——串的块链的代码实现
- java dispatcher详解_dispatcherservlet初始化过程详解
- github上成员贡献量_真祖传代码!你的GitHub代码已打包运往北极,传给1000年后人类...