hexeditor 复制二进制值_MySQL复制全解析 Part 6 MySQL GTID 生命周期
实验环境
此次实验的环境如下
- 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 Cycledev.mysql.com
hexeditor 复制二进制值_MySQL复制全解析 Part 6 MySQL GTID 生命周期相关推荐
- hexeditor 复制二进制值_MySQL并发复制演进
MySQL5.5版本及以前的复制一般主从复制有三个线程且都是单线程:Binlog Dump(主)-> IO Thread(从)-> SQL Thread(从). master节点的Binl ...
- mysql 数据库生命周期_MySQL查询的生命周期
当你执行一次MySQL查询时,有没有仔细想过,在查询结果返回之前,经过了哪些步骤呢?这些步骤有可能消耗了超出想象的时间和资源.因此,在对MySQL的查询进行优化之前,应该了解一下MySQL查询的生命周 ...
- mysql 索引生命周期_MYSQL 索引(一)--- 简介
简介 Mysql 官方定义 : 索引(Index) 是帮助 Mysql 高效获取数据的数据结构. 索引的目的在于提交查询效率,可以类比字典.简单理解为 "排好序的快读查找数据结构" ...
- mysql 数据库生命周期_MySQL生命周期
很多时候所谓的的查询优化工作实际上就是遵循一些原则让MySQL的优化器能够按照预想的合理方式运行而已. MySQL的逻辑架构图如下所示 MySQL逻辑架构整体分为三层.其中最上层为客户端层,并非MyS ...
- iOS之深入解析WKWebView加载的生命周期与代理方法
一.前言 从 WebView 开始加载一条请求,到页面完整呈现这一过程发生了什么?无论是做 WebView 性能优化还是异常问题监控与排查,都离不开对WKWebView加载的生命周期与代理方法的剖析. ...
- 【JavaWeb】一文Servlet全解:继承关系、生命周期、容器和请求转发与重定向等
文章目录 一.Servlet 概述 二.Servlet HelloWorld 三.Servlet 继承关系 四.Servlet 生命周期 五.ServletConfig 和 ServletContex ...
- mysql.servet复制到哪_Mysql复制及代理
##################################### Mysql复制的作用和原理 mysql-5.5实现主从复制 mysql-5.6主从复制和Mysql_Proxy的实现 mys ...
- mysql is复制表结构_MySQL复制表结构和内容到另一张表中的SQL语句
{"moduleinfo":{"card_count":[{"count_phone":1,"count":1}],&q ...
- Swift之深入解析Xcode13对Swift对象生命周期的优化
在 Xcode13 中,在 Build Setting 中,新增 Optimize Object Lifetimes 编译选项,默认是关闭的,Apple 建议将该选项设置为 YES,打开此优化项,可以 ...
最新文章
- 分布与并行计算—并行计算π(Java)
- 面试题 17.21. 直方图的水量/42. 接雨水
- request对象的常用属性与方法-103.课时103.【Django视图高级】HttpRequest对象讲解(Av61533158,P103)
- 图解浏览器缓存,教你提高用户体验
- php全局化标签,PHP – 在整个应用程序中使类对象全局化?
- Linux 命令 之 【stat】 查看文件状态。 (包括修改时间)
- Java序列化 3 连问,这太难了吧!
- 用terminal安装时候,若遇到网络问题,connection refused,可能需要关闭网络代理
- g++: command not found
- python 网络音乐播放器(二):tkinter 实现歌词同步滚动
- 铁路订票系统的简单设计
- java数据结构与算法基础(二)-排序
- 用了python之后笔记本卡了_用chrome运行的Jupyter笔记本在服务器res上卡住了
- 计算机网络到底该怎么学?
- iOS-OC-3DES加密和解密
- 三国群英传霸业之王服务器维护,20200901维护公告
- Fitbit Flex 智能手环佩戴心得 主要说说过敏
- 开源社庄表伟:开源要出圈了,推坑文化、沉浸式养鱼塘,社区建设心法了解一下 I OpenTEKr 大话开源 Vol.5
- 爱鸿森技术引进创新方法
- 急诊预检分诊管理系统的设计与实现
热门文章
- 数据挖掘基础学习一:VMware虚拟机Ubuntu上安装Python和IPython Notebook(Jupyter Notebook)完整步骤及需要注意的问题(以ubuntu-18.04.3为例)
- android 版本更新工具类_报表分析工具FastReport .Net 2021年超大版本更新,实现了对.NET 5的支持...
- gatewayproperties 是空_杨丞琳演唱会踩空,从二楼高台掉到一楼,手脚擦伤,引发网友热议...
- layer文件ajax上传,layer弹出层数据传输到content里面
- matlab中 %s 是什么意思,ie在matlab中是什么意思
- java activity模式_Activity的启动模式
- 阴阳师师徒系统不同服务器,阴阳师体服师徒系统未收录改为随机SSR
- linux添加删除回环地址,CentOS7如何添加本地回环地址?CentOS7添加本地回环地址的方法...
- centos系统linux复制命令行,linux系统CentOS7中find命令使用
- java orcl自动_Oracle自动生成编号