MySQL复制全解析 Part 5 MySQL GTID的格式和存储
前情提要
MySQL复制全解析 Part 2 一步步搭建基于二进制文件位置的MySQL复制
MySQL复制全解析 Part 3 MySQL半同步复制设置
MySQL 复制全解析 Part 4 使用备库搭建MySQL复制
实验环境
此次实验的环境如下
- MySQL 5.7.25
- Redhat 6.10
- 操作系统账号:mysql
- 数据库复制账号:repl
- 复制格式:基于行的复制
IP地址 |
主从关系 |
复制账号 |
复制格式 |
---|---|---|---|
11.12.14.29 |
主库 |
repl |
Row-Based |
11.12.14.30 |
从库(半同步) |
repl |
Row-Based |
11.12.14.31 |
从库(异步) |
repl |
Row-Based |
通过前面的介绍我们知道MySQL的复制有两种方法
- 基于二进制日志文件位置
- 基于GTID
前面已经介绍了第一种这节开始讲关于GTID的内容
1. GTID介绍
GTID是MySQL数据库每次提交事务后生成的一个全局事务标识符,GTID不仅在本服务器上是唯一的,其在复制拓扑中也是唯一的
每当一个客户端事务在服务端提交,该事务会被写入二进制文件同时会被分配一个新的GTID
同时保证每个GTID之间是连续的,不会有GAP
如果客户端事务没有被写入二进制文件(如事务被过滤出去或者是只读的),则不会被分配GTID
GTID的auto-skip特性意味着在主库上执行过的事务不会在从库上执行超过一次
如果一个GTID被提交了,任何相同的GTID的执行请求会被忽略,并且不会报错
如果一个GTID的事务执行了,但没有被提交或回滚,则任何相同GTID的事务会被阻塞,如果这时事务回滚了,则会执行该事务,如提交了则跳过该事务
2. GTID格式
GTID的表现形式如下面
GTID = source_id:transaction_id
其中source_id一般为数据库的uuid,transaction_id为事务ID,从1开始
3E11FA47-71CA-11E1-9E33-C80AA9429562:23
如上面的GTID可以看出该事务为UUID为3E11FA47-71CA-11E1-9E33-C80AA9429562的数据库的23号事务
3.GTID Set
GTID集合为多个单GTID和一个范围内GTID的集合,他主要用于如下地方
- gtid_executed 系统变量
- gtid_purged系统变量
- GTID_SUBSET() 和 GTID_SUBTRACT()函数
他的格式如下
3E11FA47-71CA-11E1-9E33-C80AA9429562:1-5
它代表uuid为3E11FA47-71CA-11E1-9E33-C80AA9429562的服务器的1到5号事务
它也可是如下格式
3E11FA47-71CA-11E1-9E33-C80AA9429562:1-3:11:47-49
他代表该服务器的1到3号,11号和47到49号事务
接下来我们看如下的一个GTID set,他是一个从库的gtid_executed变量的值
2174B383-5441-11E8-B90A-C80AA9429562:1-3, 24DA167-0C0C-11E8-8442-00059A3C7B00:1-19
它代表该从库应用了2个主库的事务,分别为1到3号事务和1到19号事务
其中uuid是按字母排序的,ID是按数字从小到大排序的
4. mysql.gtid_executed表
接下来我们说下gtid_executed表,它位于MySQL的mysql数据库中
该表使得从库可以在不开启二进制日志的时候仍然可以使用GTID来进行复制以及在二进制日志文件丢失时获得GTID的状态,他会被reset master命令重置
但需要注意的是复制环境中主库必须要开启二进制日志
只有当gtid_mode为ON 或 ON_PERMISSIVE时才会将执行过的gtid写到gtid_executed表中
当二进制日志开启时,每当日志文件轮转或数据库关闭时,服务器才会将日志中的GTID写到gtid_executed表中
如果数据库发生异常时,服务器会在做恢复时将二进制文件中的gtid写到gtid_excuted表中
5. gtid_executed表和gtid_executed系统变量的区别
从上面我们得知当二进制文件被启用时,gtid_executed表保存的并不是全部的被执行过的gtid,这时我们需要查询gtid_executed 系统变量,他会在每次事务提交后更新
select @@GLOBAL.gtid_executed
可以看出两者不一致,我们刷新下日志后会发现是相同了
6. gtid_executed表压缩
由于该表会记录每次的提交事务,久而久之会变的非常大,这时服务器会定时的将一些各个GTID合并成一个GTID Set
频率由gtid_executed_compression_period系统变量决定,默认值为1000,代表每有1000个GTID会压缩一次,将其设置为0代表禁用该功能
它由thread/sql/compress_gtid_table前台进程完成,并不会出现在SHOW PROCESSLIST 命令中,可以查询下表
7. 参考资料
本专题内容翻译自官方文档并结合自己的环境
https://dev.mysql.com/doc/refman/5.7/en/replication-gtids-concepts.html
觉得文章不错的欢迎关注,转发,收藏~
- Catalog Service - 解析微软微服务架构eShopOnContainers(三)
- EventBus In eShop -- 解析微软微服务架构Demo(四)
- Health Check in eShop -- 解析微软微服务架构Demo(五)
- Android Studio相见恨晚的操作锦集
- [收藏]几个常用的用正则表达式验证字符串的函数
- 走进科学: 无线安全需要了解的芯片选型、扫描器使用知识
- React Native之携程Moles框架
- 从Android短信漏洞到手机钓鱼木马
- 老外手把手带你搭建DMZ渗透测试实验室(Part 1,2)
- 与机器学习算法有关的数据结构
- 32764端口后门重出江湖,影响多款路由器
- 安全科普:SQLi Labs 指南 Part 1
- Do You Kown Asp.Net Core - 根据实体类自动创建Razor Page CURD页面模板
- 2014上半年国内安卓银行应用隐私泄露和安全隐患研究报告
- MySQL 教程
- MySQL 安装
- MySQL 管理与配置
- MySQL PHP 语法
- MySQL 连接
- MySQL 创建数据库
- MySQL 删除数据库
- MySQL 选择数据库
- MySQL 数据类型
- MySQL 创建数据表
- MySQL 删除数据表
- MySQL 插入数据
- MySQL 查询数据
- MySQL where 子句
- MySQL UPDATE 查询
- MySQL DELETE 语句
- MySQL LIKE 子句
- mysql order by
- Mysql Join的使用
- MySQL NULL 值处理
- MySQL 正则表达式
- MySQL 事务
- MySQL ALTER命令
- MySQL 索引
- MySQL 临时表
- MySQL 复制表
- 查看MySQL 元数据
- MySQL 序列 AUTO_INCREMENT
- MySQL 处理重复数据
- MySQL 及 SQL 注入
- MySQL 导出数据
- MySQL 导入数据
- MYSQL 函数大全
- MySQL Group By 实例讲解
- MySQL Max()函数实例讲解
- mysql count函数实例
- MYSQL UNION和UNION ALL实例
- MySQL IN 用法
- MySQL between and 实例讲解
- ABAP 740的新语法 - 使用BO association的方式进行内表连接操作
- 使用代码修改SAP CRM附件的属性
- SAP CRM附件创建的internal模式是什么含义
- 搭建maven私服上传并使用Jar包
- Docker 容器跨主机多网段通信解决方案
- Docker 容器实现数据持久化
- mongodb----复制
- CentOS磁盘挂载
- Mono for Android 实现高效的导航
- MyBatis版本升级导致OffsetDateTime入参解析异常问题复盘
- elasticSearch学习(二)
- 146. LRU缓存机制 Krains 2020-08-05 12:50:28 链表
- 337. 打家劫舍 III Krains 2020-08-05 10:18:45 动态规划
- 58道Vue常见面试题集锦,涵盖入门到精通,自测 Vue 掌握程度
- 记一次Linux计划任务cron无结果的排查过程