第80讲:GTID全局事务标识符的基本概念以及在Binlog中应用GTID

文章目录

    • 1.GTID的基本概念
      • 1.1.为什么要引入GTID
      • 1.2.什么是GTID
    • 2.开启GTID全局事务标识符的功能
    • 3.模拟产生Binlog日志观察开启GTID功能的区别
      • 3.1.模拟产生Binlog日志
      • 3.2.观察Binlog日志中的事件信息
      • 3.2.观察节点状态有什么变化
      • 3.3.观察Binlog日志会有什么变化
    • 4.使用GTID来截取Binlog中部分日志
      • 4.1.使用GTID来截取Binlog日志的方法
      • 4.2.模拟误删除的场景
      • 4.3.使用GTID来截取要恢复的Binlog日志
      • 4.4.GTID的幂等性问题
      • 4.5.利用GTID截取的Binlog还原误删除的数据。

1.GTID的基本概念

1.1.为什么要引入GTID

对于误删除操作进行数据恢复,是从Binlog日志中根据事件的开始标识位号和结束标识位号,截取需要的Binlog日志,然后进行数据恢复,在Binlog中查找想要恢复的数据对应的事件开始和结束标识位,一条SQL可能就包含一个开始/结束标识位号,查找开始/结束标识位是非常麻烦的一个过程。

还有一个场景:当我们想要恢复的数据对应的事件,位于开始位200到结束位3000之间的数据,在这个标识位范围内如果还包含了多次DELETE误删除的语句,这时我们不想截取DELETE语句产生的SQL,避免数据恢复的不完整,那么此时还用老办法截取日志就非常麻烦,我们还需要一个个的找出DELETE语句对应的事件,在这个事件之前进行截取,如果少量的DELETE还好,如果发生了多次DELETE的误删除,此时还利用标识位在Binlog中还原数据将会非常复杂。

基于这种场景,通过事件的开始结束标识位号截取Binlog日志非常复杂,MySQL从5.6版本开始加了一个新的特性,也就是GTID,GTID在MySQL主从复制中会使用到,通过GTID来解决此问题。

1.2.什么是GTID

GTID的全称为全局事务标识符(global transaction identifiner),是MySQL5.6版本中引入的新特性,并且在MySQL5.7版本中进行了加强,在MySQL5.7版本中,GTID即使不开启也会有自动生成。

GTID可以保证MySQL数据库中的每一个事务都有一个全局唯一的标识号,这个标识号在当前MySQL实例,甚至是MySQL主从复制集群中都会保证是全局唯一的标识号,从而保证数据的一致性。

在GTID中,DDL、DCL每一条语句(事件)都会被当成一个事务,并且会拥有一个GTID号。DML语句的每一个完整的事务,都会占用一个GTID号。

GTID开启后,会在Binlog中针对每一个事务增加一个GTID号,我们可以根据这个GTID号去截取Binlog数据。

当Binlog中增加了GTID后,我们就不需要再通过事件的开始/结束标识位号去截取某个范围的Binlog日志,我们可以直接通过GTID号来截取想要的事务操作的数据,并且mysqlbinlog中还有参数可以排除不想截取的GTID号,当多个事务标识号GTID中有误删除的操作时,我们不想截取删除的操作,此时可以在截取日志时排除对应事务的GTID号,保障截取的Binlog都是我们需要的日志内容。

GTID的定义如下:

GTID = server_uuid:transaction_id
例如e0a2c0cc-f835-11ec-8a3c-005056b791aa:27

server_uuid也就是当前实例的UUID号,32字节+1字节的字符串,在MySQL第一次启动时会生成这个UUID,并将这个UUID会保存在数据目录中的auto.conf文件中,如果该配置文件丢失,MySQL会重新生成一个UUID,相同server uuid中的事务对应的transaction_id(全局事务唯一ID)在Binlog日志中是自增并且连续有序的。

[root@mysql ~]# cat /data/mysql/auto.cnf 
[auto]
server-uuid=e0a2c0cc-f835-11ec-8a3c-005056b791aa或者mysql> system cat /data/mysql/auto.cnf
[auto]
server-uuid=e0a2c0cc-f835-11ec-8a3c-005056b791aa

2.开启GTID全局事务标识符的功能

GTID全局事务标识符的功能默认是没有开启的,但是在MySQL5.7版本中会有地方字自动生成GTID。

1.开启GTID
[root@mysql ~]# vim /etc/my.cnf 
[mysqld]
gtid-mode=on						   #开启GITID
enforce-gtid-consistency=true			#强制GTID的一致性2.重启mysql
[root@mysql ~]# systemctl restart mysqld

3.模拟产生Binlog日志观察开启GTID功能的区别

下面我们来模拟产生Binlog日志,然后观察开启GTID功能前后,在Binlog中会有什么变化。

当前的Binlog记录格式是MIXED类型,俗称MBR。

image-20220701232614534

3.1.模拟产生Binlog日志

开启GTID后,DDL、DCL语句都会被当做一个事务,并且会分配唯一的GTID号,DML每一个完整的事务也都会分配一个GTID号。

由于刚刚开启GTID时重启了MySQL,后面再执行SQL时就会写入到新的Binlog日志文件中,执行以下操作产生新的Binlog日志。

1.创建db_3数据库
mysql> create database db_3;2.在db_3数据库中创建一张表
mysql> use db_3;
mysql> create table table_1 (id int,name varchar(10));3.在表中插入数据、删除数据、再插入数据
mysql> insert into table_1 values (1,'huabf');
mysql> insert into table_1 values (2,'jiangxl');
mysql> insert into table_1 values (3,'haha');
mysql> delete from table_1 where id = 3;
mysql> insert into table_1 values (4,'ooo');

3.2.观察Binlog日志中的事件信息

产生Binlog日志之后,在Binlog日志的事件信息中,每一个DDL语句都被看成一个事务,会产生一个GTID,每一个DML的事务也会产生一个GTID号。

此时查看Binlog日志的事件信息时,就不需要再看事件的开始/结束标识位号,只需要分析Binlog中产生的全局事务ID即可,主要看Info一列,无论是DDL语句还是DML语句,都会产生一个事务,并且都有独立的GTID号。

之前找事件的开始/结束标识位非常麻烦,每一条SQL都对应一个开始/结束标识位,比较庞大,当使用GTID后,一个事务内的SQL拥有一个GTID,同时可以清晰的看到一个GTID下包含了那些数据的SQL语句,截取时按照需求,指定数据所在的GTID范围即可成功截取。

由于我的Binlog记录格式是MBR,因此针对DML语句可以清晰的看到具体的SQL,当我们要截取部分Binlog日志时,只需要在Binlog中找到要恢复数据对应的SQL语句,然后再找到这些SQL语句对应的GTID号,根据GTID号进行截取即可。

mysql> show binlog events in 'mysql-bin.000004';

事件信息如下,就如我们所说的那样,每一个DDL语句都被看做是一个事务,并且分配唯一的GTID号,每一个DML语句的完整事务也都会分为一个唯一的GTID号,GTID号的定义也是节点的UUID加全局事务ID号组成的,GTID号会按照顺序自增。

image-20220701234356734

3.2.观察节点状态有什么变化

mysql> show master status;

在查看节点状态时,除了能看到当前正在使用的Binlog日志是哪个外,在最后一列Executed_Gtid_Set中简单的展示了当前MySQL数据库中有多少个GTID号。

e0a2c0cc-f835-11ec-8a3c-005056b791aa:当前MySQL的UUID号。

1-7:这个1-7表示,当前MySQL中一共有一个GTID号,从1开始到7结束(我们使用GTID截取Binlog日志时,就可以使用这种连续的方法截取出连续DGTID事务所产生的Binlog日志)。

image-20220701234934592

3.3.观察Binlog日志会有什么变化

Binlog日志也会有明显的变化,当使用GTID之后,几乎就可以不去看事件的开始/结束标识位了,如下图所示,一个事务就对应一个GTID号,在这个GTID内,可能会包含多条SQL语句,当我们需要截取部分Binlog时,根据我们的需求,分析要截取的部分位于那些GTID中,然后根据涉及的GTID范围进行截取即可。

image-20220701235726077

4.使用GTID来截取Binlog中部分日志

当Binlog中具备GTID之后,就可以通过GTID来截取某些事务的BInlog日志。

4.1.使用GTID来截取Binlog日志的方法

语法格式如下:

mysqlbinlog --include-gtids='GTID号范围' --exclude-gtids='排除不截取的GTID号' Binlog日志路径
  • include-gtids:截取那些GTID号产生的Binlog日志,可以是一个,也可以是多个连续的GTID号,例如我们想截取6/7/8/9/10/11这5个GTID产生的Binlog,在include-gtids参数中无需填写多个完整的GTID,直接写范围即可,如:e0a2c0cc-f835-11ec-8a3c-005056b791aa:6-11,如果6-11这5个GTID中7/8是不想截取的GTID,那么还可以通过

  • --exclude-gtids:在截取过程中排除那些不想截取的GTID产生的binlog日志,接着include-gtids后续举例,如果6-11这5个GTID中,7/8这两个GTID是不想截取的,可能包含误删除操作,那么就可以通过--exclude-gtids参数将7和8两个GTID排除,在--exclude-gtids参数中如是连续排序的多个GTID,那么也可以写成e0a2c0cc-f835-11ec-8a3c-005056b791aa:7-8这种形式,如果是不连续的几个GTID,在排除时只能一个一个指定了。

例子:

  • 截取9-15这些GTID,但是排除11-13这三个GTID。

    mysqlbinlog --include-gtids='e0a2c0cc-f835-11ec-8a3c-005056b791aa:9-15' --exclude-gtids='e0a2c0cc-f835-11ec-8a3c-005056b791aa:11-13' /data/mysql/mysql-bin.000006
    
  • 截取9-15这些GTID,排除9/11这两个GTID。

    mysqlbinlog --include-gtids='e0a2c0cc-f835-11ec-8a3c-005056b791aa:9-15' --exclude-gtids='e0a2c0cc-f835-11ec-8a3c-005056b791aa:9,e0a2c0cc-f835-11ec-8a3c-005056b791aa:11' /data/mysql/mysql-bin.000006
    

4.2.模拟误删除的场景

下面我们来模拟误删除的场景,首先创建一张表,再里面正常插入数据,然后误删除一条数据,最后误删除整张表。

1.创建table_1表
mysql> use db_3
mysql> create table table_1 (id int,name varchar(10));2.正常插入的数据
mysql> insert into table_1 values (1,'huabf');
mysql> insert into table_1 values (2,'jiangxl');
mysql> insert into table_1 values (3,'haha');3.误删除了id为3的数据
mysql> delete from table_1 where id = 3;4.又正常插入了id为4的数据
mysql> insert into table_1 values (4,'ooo');5.又误删除了整张表
mysql> drop table table_1;

4.3.使用GTID来截取要恢复的Binlog日志

table_1这张表一下有两次误操作行为了,我们需要通过Binlog日志来恢复误删除的数据。

1)首先查看当前数据库使用的是哪个Binlog日志

使用的是mysql-bin.000006这个Binlog日志。

mysql> show master status;
+------------------+----------+--------------+------------------+-------------------------------------------+
| File             | Position | Binlog_Do_DB | Binlog_Ignore_DB | Executed_Gtid_Set                         |
+------------------+----------+--------------+------------------+-------------------------------------------+
| mysql-bin.000006 |     1992 |              |                  | e0a2c0cc-f835-11ec-8a3c-005056b791aa:1-15 |
+------------------+----------+--------------+------------------+-------------------------------------------+

2)确定要截取Binlog日志的那些GTID号

通过事件信息,来确定我们要还原那些GTID产生的Binlog数据。

mysql> show binlog events in 'mysql-bin.000006';

我们首先找到创建table_1这张表的事务GTID号,找到之后,就是从这个GTID号处开始截取,如下图所示,创建这张表的GTID是9,然后一直找到删除这张表的GTID号,如下图所示,删除表的GTID是15,那么截取GTID号的范围就是9-15之间,但是在9-15之间又包含了误删除的操作,如果我们不排除掉,那么恢复之后数据还是丢失的,DELETE误删除的操作为13GTID号中,DROP删除表的误操作行为位于15这个GTID号,因此我们就可以确定要截取的GTID号范围是9-15,但是在截取过程中排除掉13和15这两个GTID号。

这里为什么要一直找到删除表的GTID呢?因为我们不能确定在删除表之前那条数据时该表最后的写入数据,因此到删除表的GTID是最全面的,截取的时候排除掉这些删除行为的GTID就可以了。

image-20220702091733100

3)截取日志

截取9-15这6个GTID产生的Binlog日志,然后排除掉13/15这两个GTID产生的Binlog日志,最后输出到SQL文件里。

[root@mysql backup]# mysqlbinlog --include-gtids='e0a2c0cc-f835-11ec-8a3c-005056b791aa:9-15' --exclude-gtids='e0a2c0cc-f835-11ec-8a3c-005056b791aa:13,e0a2c0cc-f835-11ec-8a3c-005056b791aa:15' /data/mysql/mysql-bin.000006 > gtid-binlog.sql

成功截取了9-15这些GTID产生的Binlog,但是同时也排除了13和15这两个GTID产生的数据。

image-20220702092956846

虽然我们成功的截取到了要恢复的Binlog日志,但是此时拿着这个日志去还原数据会报错,这就要说说GTID的幂等性问题了。

4.4.GTID的幂等性问题

虽然在4.3中用GTID截取除了Binlog日志,也输出到SQL文件中了,但是此时如果使用这个Binlog去恢复数据,那么就会报错,会提示还原的数据中有指定的GTID号,和当前数据库的GTID冲突,重复的GTID对应的事务就不会执行了,这就是GTID的幂等性问题。

当我们开启了GTID,还使用事件的标识位截取Binlog时,也会遇到此问题。

如何解决这个问题呢?其实也很简单,只需要将截取的Binlog日志中关于GTID声明的语句剔除就可以了。

image-20220702094949719

手动删除可能会漏,mysqlbinlog的--skip-gtids参数可以跳过Binlog日志中的GTID属性,跳过后我们就可以正常恢复数据了。

[root@mysql backup]# mysqlbinlog --skip-gtids --include-gtids='e0a2c0cc-f835-11ec-8a3c-005056b791aa:9-15' --exclude-gtids='e0a2c0cc-f835-11ec-8a3c-005056b791aa:13,e0a2c0cc-f835-11ec-8a3c-005056b791aa:15' /data/mysql/mysql-bin.000006 > gtids-binlog.sql

跳过GTID属性的Binlog日志和原Binlog日志是由很大区别的,因此不建议手动的改,直接通过--skip-gtids参数跳过即可。

image-20220702095142476

4.5.利用GTID截取的Binlog还原误删除的数据。

1.临时关闭Binlog日志记录,避免还原时又写一遍Binlog
mysql> set sql_log_bin=0;
Query OK, 0 rows affected (0.00 sec)2.恢复数据
mysql> source /root/backup/gtids-binlog.sql3.查看数据是否恢复成功
mysql> select * from table_1;
+------+---------+
| id   | name    |
+------+---------+
|    1 | huabf   |
|    2 | jiangxl |
|    3 | haha    |
|    4 | ooo     |
+------+---------+
#四条数据均已恢复

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/235959.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

HuggingFace下载模型

目录 方式一:网页下载 方式二:Git下载 方式一:网页下载 方式二:Git下载 有些模型的使用方法页面会写git clone的地址,有些没写,直接复制网页地址即可 网页地址: ​https://huggingface.co/…

【matlab】绘制横状双组渐变柱状图

【matlab】绘制横状双组渐变柱状图

阿里云登录镜像仓库报错: Error response from daemon: Get https://

阿里云登录镜像仓库报错: Error response from daemon: Get https:// 1. 故障现象 开发反应自用笔记本连接镜像仓库是正常的,但通过服务器连接镜像仓库一直失败. 报错信息如下: Error response from daemon: Get https://registry.cn-hangzhou.aliyuncs.com/v2/: unauthoriz…

关于“Python”的核心知识点整理大全33

目录 12.8.3 将子弹存储到编组中 alien_invasion.py 注意 12.8.4 开火 game_functions.py 12.8.5 删除已消失的子弹 alien_invasion.py 12.8.6 限制子弹数量 settings.py game_functions.py 12.8.7 创建函数 update_bullets() game_functions.py alien_invasion.py…

ssm445基于SSM的学生宿舍管理系统论文

摘 要 现代经济快节奏发展以及不断完善升级的信息化技术,让传统数据信息的管理升级为软件存储,归纳,集中处理数据信息的管理方式。本学生宿舍管理系统就是在这样的大环境下诞生,其可以帮助管理者在短时间内处理完毕庞大的数据信息…

转行小白历险记-2023.12.19 如何解决跨域问题

讨厌突如其来的破坏计划的感觉&#xff0c;真的好烦 一、跨域以及如何解决跨域问题(反向代理) 跨域 同源&#xff1a;协议、端口、域名相同 如何解决跨域问题 jsonp:<script> 不受同源策略限制跨源域资源共享 CORS:允许 Web 应用服务器进行跨源访问控制使不同的源变成同…

Inkscape SVG 编辑器 导入 Gazebo

概述 本教程描述了拉伸 SVG 文件的过程&#xff0c;这些文件是 2D 的 图像&#xff0c;用于在 Gazebo 中为您的模型创建 3D 网格。有时是 更容易在 Inkscape 或 Illustrator 等程序中设计模型的一部分。 在开始之前&#xff0c;请确保您熟悉模型编辑器。 本教程将向您展示如…

在灾难推文分析场景上比较用 LoRA 微调 Roberta、Llama 2 和 Mistral 的过程及表现

引言 自然语言处理 (NLP) 领域的进展日新月异&#xff0c;你方唱罢我登场。因此&#xff0c;在实际场景中&#xff0c;针对特定的任务&#xff0c;我们经常需要对不同的语言模型进行比较&#xff0c;以寻找最适合的模型。本文主要比较 3 个模型: RoBERTa、Mistral-7B 及 Llama-…

二叉树..

文章目录 1. 对称二叉树-力扣 101 题2. 二叉树最大深度-力扣 104 题 前中后序非递归实现通用代码&#xff1a; LinkedList<TreeNode> stack new LinkedList<>();TreeNode curr root; // 代表当前节点 TreeNode pop null; // 最近一次弹栈的元素 while (curr ! …

【CSS @property】CSS自定义属性说明与demo

CSS property property - CSS: Cascading Style Sheets | MDN At 规则 - CSS&#xff1a;层叠样式表 | MDN Custom properties (–*): CSS variables - CSS: Cascading Style Sheets | MDN CSS Houdini - Developer guides | MDN &#x1f4da; 什么是property? property CSS…

2023年度佳作:AIGC、AGI、GhatGPT 与人工智能大模型的创新与前景展望

&#x1f3ac; 鸽芷咕&#xff1a;个人主页 &#x1f525; 个人专栏:《linux深造日志》《粉丝福利》 ⛺️生活的理想&#xff0c;就是为了理想的生活! ⛳️ 写在前面参与规则 ✅参与方式&#xff1a;关注博主、点赞、收藏、评论&#xff0c;任意评论&#xff08;每人最多评论…

TCP 核心工作机制

TCP 的核心知识&#xff1a;如何保证传输可靠 如何提高传输效率 如何保证传输可靠&#xff1a;确认应答机制 超时重传机制 如何提高传输效率&#xff1a;滑动窗口机制、流量控制机制、延时应答机制、捎带确认机制、拥塞控制机制 可靠机制 TCP的可靠性主要是通过 确认应答 …

【轻量化篇】YOLOv8改进实战 | 更换主干网络 Backbone 之 RepGhostnet,重参数化实现硬件高效的Ghost模块

YOLOv8专栏导航:点击此处跳转 前言 轻量化网络设计是一种针对移动设备等资源受限环境的深度学习模型设计方法。下面是一些常见的轻量化网络设计方法: 网络剪枝:移除神经网络中冗余的连接和参数,以达到模型压缩和加速的目的。分组卷积:将卷积操作分解为若干个较小的卷积操…

[学习笔记]SQL Server中批量查找所有符合Where条件的记录

目标&#xff1a;在SQL Server中查找所有表的UserId 50的记录 创建一个表变量来存储所有包含’UserId’列的表的名称。然后使用一个游标遍历这些表&#xff0c;并对每个表执行一个动态SQL查询 DECLARE TableName nvarchar(256), ColumnName nvarchar(128), SearchStr2 nvarc…

CentOS 宣布停更3年后,服务器操作系统何去何从?

“CentOS 要停止更新了&#xff1f;” 盯着电脑&#xff0c;某大型企业数字化部门的负责人彭素素看到这个消息&#xff0c;不仅在心里发出了一声惊呼。 2020年&#xff0c;CentOS 停止更新的消息&#xff0c;不仅彭素素所在的企业&#xff0c;对于不少正在使用 CentOS 的厂商…

Python多个列表连接实例代码解析

概要 在Python中&#xff0c;连接多个列表是一种常见的操作&#xff0c;用于将多个列表合并为一个。这个过程可以应用于各种数据处理和编程任务中。本文将介绍多种连接多个列表的方法&#xff0c;并提供详细的示例代码来帮助大家更好地理解。 使用 运算符 最简单的方法是使用…

【RTOS学习】源码分析(信号量和互斥量 事件组 任务通知)

&#x1f431;作者&#xff1a;一只大喵咪1201 &#x1f431;专栏&#xff1a;《RTOS学习》 &#x1f525;格言&#xff1a;你只管努力&#xff0c;剩下的交给时间&#xff01; 目录 &#x1f353;信号量和互斥量&#x1f345;创建&#x1f345;Take&#x1f345;Give &#x…

IDEA版SSM入门到实战(Maven+MyBatis+Spring+SpringMVC) -SpringMVC搭建框架

第一章 初识SpringMVC 1.1 SpringMVC概述 SpringMVC是Spring子框架 SpringMVC是Spring 为**【展现层|表示层|表述层|控制层】**提供的基于 MVC 设计理念的优秀的 Web 框架&#xff0c;是目前最主流的MVC 框架。 SpringMVC是非侵入式&#xff1a;可以使用注解让普通java对象&…

JS模块化规范之CMD

JS模块化规范之CMD 模块化规范CMD&#xff08;Common Module Definition&#xff09;概念基本语法CMD实现 模块化规范 CMD&#xff08;Common Module Definition&#xff09; 概念 CommonJS module definition CMD规范专门用于浏览器端&#xff0c;模块的加载时异步的&#x…

应用 Strangler 模式将遗留系统分解为微服务

许多来源在一般情况下提供了微服务的解释&#xff0c;但缺乏特定领域的示例。新来者或不确定从哪里开始的人可能会发现掌握如何将遗留系统过渡到微服务架构具有挑战性。本指南主要面向那些正在努力启动迁移工作的个人&#xff0c;它提供了特定于业务的示例来帮助理解该过程。 …