实验环境

此次实验的环境如下

  • MySQL 5.7.25
  • Redhat 6.10
  • 操作系统账号:mysql
  • 数据库复制账号:repl
  • 复制格式:基于行的复制

通过前面的介绍我们知道MySQL的复制有两种方法

  • 基于二进制日志文件位置
  • 基于GTID

上一节的内容为GTID的格式和存储,这节根据官方文档我们说GTID的生命周期

1. GTID生命周期

这里以一个事务从主库执行到从库应用的过程来讲解

1.1 主库提交事务被分配GTID

当主库执行和提交一个事务后,该事务会被分配一个GTID(主库uuid和最小的未被使用过的事务号),之后会被写入到二进制日志文件中,其位置在具体事务之前

如果一个事务没有被写入二进制文件,例如被过滤掉或者是只读的,则不会被分配GTID

1.2 主库GTID写入二进制文件

分配GTID后,该GTID会在提交的时候以Gtid_log_event 事件的形式写入二进制日志文件中,其位置在具体事务之前

当日志发生切换或者数据库关闭时该GTID会被写入到mysql.gtid_executed表中

我们可以通过mysqlbinlog命令看出

1.3 主库写入到GLOBAL.gtid_executed系统变量中

在提交时,还会将该GTID加入到GLOBAL.gtid_executed系统变量中

该变量是个GTID集合,代表目前为止所有被执行过的事务,主要用于复制中

我们也可以同如下命令查看

show master status;

1.4 从库接收主库GTID事务

当二进制日志被传输到备库后,会被储存在relay 日志中,从库会读取该GTID并设置
gtid_next变量为该GTID

这样就告诉备库下一个执行的事务必须为该GTID

需要注意的是该变量是session级别的

1.5 从库应用主库GTID事务

在接收到主库GTID事务并设置好gtid_next后,如果没有其他进程在执行的话,从库执行该GTID事务

如果同时有多个进程执行该事务,则会选择其中一个(如多线程复制)

我们可以查询gtid_owned系统变量来确认

select @@GLOBAL.gtid_owned

由于该事务已经被主库分配了GTID,所以从库上的该事务不会被分配GTID,而是使用gtid_next变量的值

1.6 从库写入二进制文件日志

由于从库重新执行了来自主库的事务,所以他也会写日志到从库的二进制日志文件中

这里分两种情况

  • 如果从库启用了二进制日志功能,则和1.2步骤一致
  • 如果从库未启用二进制日志功能,则会将gtid和对应的事务语句写入到mysql.gtid_executed表中

需要注意的是如果未开启二进制日志功能MySQL 5.7及之前只有DML操作是原子级别的,DDL并不是,意味着如果MySQL发生异常,数据可能会变得不一致

MySQL 8.0后所有操作都支持

1.7 从库写入到GLOBAL.gtid_executed系统变量中

同样的在提交后,从库也会将该GTID写入到从库的gtid_executed系统变量中

2. 多线程复制

如果启用了多线程复制(slave_parallel_workers > 0),由于是并行执行的GTID事务,每个线程负责不同的GTID,这时gtid_executed变量的值可能会有GAP,系统会自动更新这些值

3. 什么动作会被分配GTID

所有的数据库更改(DML或DDL)都会被分配GTID

数据库的新增删除修改也会被分配GTID

非事务型的修改也会被记录下来,如果在写入过程中发生异常,则会记录一个incident事件

如下操作可能会让一个事务分配多个GTID

  • 一个存储过程包含多个事务
  • drop table语句一次包含多个表
  • CREATE TABLE … SELECT 语句,他会被分配一个create table GTID和一个insert GTID

7. 参考资料

本专题内容翻译自官方文档并结合自己的环境

16.1.3.2 GTID Life Cycle​dev.mysql.com

hexeditor 复制二进制值_MySQL复制全解析 Part 6 MySQL GTID 生命周期相关推荐

  1. hexeditor 复制二进制值_MySQL并发复制演进

    MySQL5.5版本及以前的复制一般主从复制有三个线程且都是单线程:Binlog Dump(主)-> IO Thread(从)-> SQL Thread(从). master节点的Binl ...

  2. mysql 数据库生命周期_MySQL查询的生命周期

    当你执行一次MySQL查询时,有没有仔细想过,在查询结果返回之前,经过了哪些步骤呢?这些步骤有可能消耗了超出想象的时间和资源.因此,在对MySQL的查询进行优化之前,应该了解一下MySQL查询的生命周 ...

  3. mysql 索引生命周期_MYSQL 索引(一)--- 简介

    简介 Mysql 官方定义 : 索引(Index) 是帮助 Mysql 高效获取数据的数据结构. 索引的目的在于提交查询效率,可以类比字典.简单理解为 "排好序的快读查找数据结构" ...

  4. mysql 数据库生命周期_MySQL生命周期

    很多时候所谓的的查询优化工作实际上就是遵循一些原则让MySQL的优化器能够按照预想的合理方式运行而已. MySQL的逻辑架构图如下所示 MySQL逻辑架构整体分为三层.其中最上层为客户端层,并非MyS ...

  5. iOS之深入解析WKWebView加载的生命周期与代理方法

    一.前言 从 WebView 开始加载一条请求,到页面完整呈现这一过程发生了什么?无论是做 WebView 性能优化还是异常问题监控与排查,都离不开对WKWebView加载的生命周期与代理方法的剖析. ...

  6. 【JavaWeb】一文Servlet全解:继承关系、生命周期、容器和请求转发与重定向等

    文章目录 一.Servlet 概述 二.Servlet HelloWorld 三.Servlet 继承关系 四.Servlet 生命周期 五.ServletConfig 和 ServletContex ...

  7. mysql.servet复制到哪_Mysql复制及代理

    ##################################### Mysql复制的作用和原理 mysql-5.5实现主从复制 mysql-5.6主从复制和Mysql_Proxy的实现 mys ...

  8. mysql is复制表结构_MySQL复制表结构和内容到另一张表中的SQL语句

    {"moduleinfo":{"card_count":[{"count_phone":1,"count":1}],&q ...

  9. Swift之深入解析Xcode13对Swift对象生命周期的优化

    在 Xcode13 中,在 Build Setting 中,新增 Optimize Object Lifetimes 编译选项,默认是关闭的,Apple 建议将该选项设置为 YES,打开此优化项,可以 ...

最新文章

  1. 分布与并行计算—并行计算π(Java)
  2. 面试题 17.21. 直方图的水量/42. 接雨水
  3. request对象的常用属性与方法-103.课时103.【Django视图高级】HttpRequest对象讲解(Av61533158,P103)
  4. 图解浏览器缓存,教你提高用户体验
  5. php全局化标签,PHP – 在整个应用程序中使类对象全局化?
  6. Linux 命令 之 【stat】 查看文件状态。 (包括修改时间)
  7. Java序列化 3 连问,这太难了吧!
  8. 用terminal安装时候,若遇到网络问题,connection refused,可能需要关闭网络代理
  9. g++: command not found
  10. python 网络音乐播放器(二):tkinter 实现歌词同步滚动
  11. 铁路订票系统的简单设计
  12. java数据结构与算法基础(二)-排序
  13. 用了python之后笔记本卡了_用chrome运行的Jupyter笔记本在服务器res上卡住了
  14. 计算机网络到底该怎么学?
  15. iOS-OC-3DES加密和解密
  16. 三国群英传霸业之王服务器维护,20200901维护公告
  17. Fitbit Flex 智能手环佩戴心得 主要说说过敏
  18. 开源社庄表伟:开源要出圈了,推坑文化、沉浸式养鱼塘,社区建设心法了解一下 I OpenTEKr 大话开源 Vol.5
  19. 爱鸿森技术引进创新方法
  20. 急诊预检分诊管理系统的设计与实现

热门文章

  1. 数据挖掘基础学习一:VMware虚拟机Ubuntu上安装Python和IPython Notebook(Jupyter Notebook)完整步骤及需要注意的问题(以ubuntu-18.04.3为例)
  2. android 版本更新工具类_报表分析工具FastReport .Net 2021年超大版本更新,实现了对.NET 5的支持...
  3. gatewayproperties 是空_杨丞琳演唱会踩空,从二楼高台掉到一楼,手脚擦伤,引发网友热议...
  4. layer文件ajax上传,layer弹出层数据传输到content里面
  5. matlab中 %s 是什么意思,ie在matlab中是什么意思
  6. java activity模式_Activity的启动模式
  7. 阴阳师师徒系统不同服务器,阴阳师体服师徒系统未收录改为随机SSR
  8. linux添加删除回环地址,CentOS7如何添加本地回环地址?CentOS7添加本地回环地址的方法...
  9. centos系统linux复制命令行,linux系统CentOS7中find命令使用
  10. java orcl自动_Oracle自动生成编号