mysql.gtid_executed表、gtid_executed变量、gtid_purged变量的修改时机

1.2 mysql.gtid_executed表、gtid_executed变量、gtid_purged变量的修改时机

1.2.1 定义

  • mysql.gtid_executed表:GTID持久化的介质,GTID模块初始化的时候会读取这个表作为获取gtid_executed变量的基础。

  • gtid_executed变量:表示数据库中执行了哪些GTID,它是一个处于内存中的GTID SET。show slave status中的Executed_Gtid_Set和show master status中的Executed_Gtid_Set都来自它。

mysql> show master status\G
*************************** 1. row ***************************File: binlog.000001Position: 4083Binlog_Do_DB:Binlog_Ignore_DB:
Executed_Gtid_Set: ff3a5c20-abbe-11ef-88a4-fa163e176c3c:1-15
1 row in set (0.01 sec)mysql> show slave status\G
*************************** 1. row ***************************Slave_IO_State: Waiting for source to send eventMaster_Host: 127.0.0.1Master_User: rootMaster_Port: 3307Connect_Retry: 60...              Retrieved_Gtid_Set: ff3a5c20-abbe-11ef-88a4-fa163e176c3c:1-15Executed_Gtid_Set: ff3a5c20-abbe-11ef-88a4-fa163e176c3c:1-15...                                                             Network_Namespace:
1 row in set, 1 warning (0.00 sec)
  • gtid_purged变量:表示由于删除binary log(如执行purge binary logfiles命令或者超过参数expire_logs_days设置)​,已经丢失的GTID Event,它是一个处于内存中的GTID SET。我们在搭建从库时,通常需要使用set global gtid_purged命令设置本变量,用于表示这个备份已经执行了哪些GTID操作。需要注意的是,手动删除binary log不会更新这个变量。(即这些GTID对应的事务已经执行并确认)

其中,gtid_executed变量和gtid_purged变量都是通过show global variables命令来获取的。这也是数据库管理员通常能够观察到的几种GTID 信息,有了前文的描述,我们知道其中的mysql.gtid_executed表是一种GTID持久化的介质,gtid_executed变量和gtid_purged变量则对应了内部结构体Gtid_state中的executed_gtids和lost_gtids内存数据,它们分别表示数据库执行了哪些GTID操作,又有哪些GTID操作由于删除binary log已经丢失了。

注意:gtid_executed变量一定是实时更新的,不管是主库还是从库。

下图中灰色部分为常见配置:

1.2.2 主库修改时机

binary log关闭

在binary log关闭的状态下,不生成GTID,mysql.gtid_executed表、gtid_executed变量、gtid_purged变量均不更新。

binary log打开

主库通常都被设置成binary log打开的状态,需要重点关注一下。

mysql.gtid_executed表修改时机

mysql.gtid_executed表一直保存上一个binary log执行过的全部GTID,直到binary log切换(当前日志文件已满或达到了切换点,决定创建一个新的binlog文件)时才会被更新,即不是每执行一个事务就实时更新。

这个过程主要会调用Gtid_state::save_gtids_of_last_binlog_into_table函数,下面是部分代码:

gtid_executed变量修改时机

在事务commit的FLUSH阶段生成GTID,在COMMIT阶段才计入gtid_executed变量,它是实时更新的。这个过程是通过调用Gtid_state::update_gtids_impl函数完成的。代码如下。

注意:上述涉及到的两个阶段?

  • 在事务提交过程中,有一个FLUSH阶段。在这个阶段,MySQL会确保所有与该事务相关的更改都已经写入到binlog日志中,并且这些更改对于其他事务来说是可见的(或是不可见的,但至少已准备好在后续阶段中变得可见)。在这个FLUSH阶段,MySQL会为当前事务生成一个唯一的GTID。

  • 在事务提交的COMMIT阶段,MySQL会将之前FLUSH阶段生成的GTID添加到gtid_executed变量中。这意味着,一旦事务提交成功,其GTID就会被记录在gtid_executed变量中,从而表明该事务已经被执行。

gtid_purged变量修改时机

在清理binary log时修改,比如在执行命令purge binary logs或者超过参数expire_logs_days的设置后自动删除,需要将丢失的GTID SET计入这个变量,因此它不是实时更新的。这个过程主要集中在MYSQL_BIN_LOG::purge_logs函数中。代码片段如下。

1.2.3 从库修改时机

binary log开启,参数log_slave_updates关闭

通常,从库都被设置为这种状态,需要重点关注一下。

mysql.gtid_executed表修改时机

前面已经说过,在这种情况下从库没有办法通过binary log来持久化执行过的GTID事务,因为它根本就没有记录Event。只能通过实时更新mysql.gtid_executed表来保存,所以必须要实时将GTID持久化到mysql.gtid_executed表中。其主要逻辑包含在commit_owned_gtids函数中。代码片段如下。

gtid_executed变量修改时机

实时更新,但是更新位置和主库不同,因为这里不会执行 order commit 步骤了。由Gtid_state::update_on_commit函数调入。

gtid_purged变量修改时机

因为没有binary log来记录已经执删除的GTID Event,所以gtid_purged变量实时更新。其处理逻辑依然是通过Gtid_state::update_on_commit函数调入Gtid_state::update_gtids_impl_own_gtid函数进行的。代码片段如下。

binary log开启,参数log_slave_updates开启

在这种情况下,SQL 线程执行过的GTID操作可以通过 binary log 进行保存,所以mysql.gtid_executed表和gtid_purged变量不需要实时更新。

mysql.gtid_executed表修改时机

和主库一致。即在日志切换时更新,不做讨论。

gtid_executed变量修改时机

和主库一致,实时更新,不做讨论。

gtid_purged变量修改时机

和主库一致,在binary log删除时更新,不做讨论。

1.2.4 通用修改时机

mysql.gtid_executed表修改时机

在执行reset master命令时清空本表:其主要逻辑在Gtid_state::clear函数中。

在执行set global gitd_purged命令时设置本表:其主要逻辑在Gtid_state::add_lost_gtids函数中。

gtid_executed变量修改时机

在执行reset master命令时清空本变量:其主要逻辑在Gtid_state::clear函数中。

在执行set global gitd_executed命令时设置本变量:其主要逻辑在Gtid_state::add_lost_gtids函数中。

在mysql启动时初始化设置gtid_executed变量:GTID模块的初始化将在1.3节介绍。

gtid_purged变量修改时机

在执行reset master命令时清空本变量:其主要逻辑在Gtid_state::clear函数中。

在执行set global gitd_purged命令时设置本变量:其主要逻辑在Gtid_state::add_lost_gtids函数中。

在MySQL启动时初始化gtid_purged变量。

1.2.5 通用修改时机源码函数简析

我们来看1.2.4节提到的两个接口。

Gtid_state::clear函数逻辑

Gtid_state::add_lost_gtids函数逻辑

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

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

相关文章

CONTACT 在 Ubuntu 系统中的安装与使用

CONTACT 概述 CONTACT 是研究三维摩擦接触问题的高级仿真程序,如轮轨之间、滚动轴承的接触问题。CONTACT 提供了完整且详细的解决方案,可集成到多体仿真软件中。其计算质量可与有限元分析相近,但计算时间仅为后者的千分之一。CONTACT 采用半…

C#连接sql server

连接时,出现如下提示: ERROR [IM014] [Microsoft][ODBC 驱动程序管理器] 在指定的 DSN 中,驱动程序和应用程序之间的体系结构不匹配 原因是odbc的驱动和应用程序的架构不一致。我的odbc如下所示: 显示为64位,而c#程序显…

数据结构之各类排序算法代码及其详解

1. 排序的概念 排序是一种常见的算法概念,用于将一组数据按照特定的顺序进行排列。排序算法的目的是将一组数据按照递增或递减的顺序重新排列。常见的排序算法包括冒泡排序、插入排序、选择排序、快速排序、归并排序等。排序算法的选择通常取决于数据规模、数据分布…

山东大学软件学院人工智能导论实验之知识库推理

目录 实验目的: 实验代码: 实验内容: 实验结果 实验目的: 输入相应的条件,根据知识库推理得出相应的知识。 实验代码: def find_data(input_process_data_list):for epoch, data_process in enumerat…

【开源免费】基于SpringBoot+Vue.JS美食烹饪互动平台(JAVA毕业设计)

本文项目编号 T 219 ,文末自助获取源码 \color{red}{T219,文末自助获取源码} T219,文末自助获取源码 目录 一、系统介绍二、数据库设计三、配套教程3.1 启动教程3.2 讲解视频3.3 二次开发教程 四、功能截图五、文案资料5.1 选题背景5.2 国内…

在线VS离线TTS(语音合成芯片)有哪些优势-AIOT智能语音产品方案

离线 TTS 存在语音质量欠佳、音色选择有限、语言支持单一更新困难、占用资源多、适应性差、难以个性化定制等痛点 01更新维护困难 由于是离线模式,难以及时获取最新的语音数据和算法更新,无法得到持续改进。 02占用本地资源 需要在设备本地存储较大的…

530 Login fail. A secure connection is requiered(such as ssl)-java发送QQ邮箱(简单配置)

由于cs的csdN许多文章关于这方面的都是vip文章,而本文是免费的,希望广大网友觉得有帮助的可以多点赞和关注! QQ邮箱授权码到这里去开启 授权码是16位的字母,填入下面的mail.setting里面的pass里面 # 邮件服务器的SMTP地址 host…

SpringBoot整合Swagger

一、Swagger简介 Swagger 是一种 API 文档工具,可以通过生成 API 文档来提高开发者的工作效率,同时也可以提高 API 的可读性和可维护性。Spring Boot 可以与 Swagger 进行整合,以方便生成 API 文档。下面介绍一下如何使用 Spring Boot 整合 S…

【图形学入门笔记】线性代数的本质

【笔记未完待续】如果我的分享对你有帮助,请记得点赞关注不迷路。 视频源地址:https://www.youtube.com/watch?vfNk_zzaMoSs 作者:3Blue1Brown 此处仅做个人笔记使用。 01 - 向量究竟是什么? 线性代数中最基础、最根源的…

can数据记录仪在汽车路测中扮演着**关键角色*

can数据记录仪主要用于实时采集、存储和分析车辆运行中的多维度数据,帮助工程师优化车辆性能、验证安全性、改进驾驶体验,并支持法规合规性测试。 can数据记录仪在路测中扮演几个关键角色,如下, 动力系统监控:记录发…

使用前端 html css 和js 开发一个AI智能平台官网模板-前端静态页面项目

最近 AI 人工智能这么火,那必须针对AI 做一个 AI方面的 官方静态网站练手。让自己的前端技术更上一层楼,哈哈。 随着人工智能技术的不断发展,越来越多的AI应用开始渗透到各行各业,为不同领域的用户提供智能化解决方案。本网站致力…

仿真环境下实现场景切换、定位物体和导航行走

1. 代码(以微波炉为例) from ai2thor.controller import Controller import math import randomdef distance_2d(pos1, pos2):"""计算两点之间的二维欧几里得距离(忽略Z轴)"""return math.sqrt((p…

1.测试策略与计划设计指南

1.介绍 1.1项目介绍 完整项目组成:1.基于K8S定制开发的SaaS平台;2.多个团队提供的中台服务(微服务);3.多个业务团队开发的系统平台。涉及多个项目团队、上百个微服务组件。 测试在所有团队开发测试后,自己搭建测试环境&#xff0c…

LeetCode热题100- 最小栈【JavaScript讲解】

“日日行,不怕千万里;常常做,不怕千万事。” —— 《格言联璧处事》 oi!!栈的知识点在这里!!!点击跳转!!! 最小栈讲解目录: 题目&…

D3DSource 2016 引擎完整教程

D3DSource 引擎是一款基于 Direct3D 的 3D 图形渲染引擎,2016 版是较早的一个版本。由于 D3DSource 并不是主流开源引擎(如 Unity、Unreal Engine),详细的官方文档可能较少。因此,我会结合 Direct3D 编程知识&#xff…

DeepSeek:我的AI助手之旅

★【前言】: 初次使用AI助手帮我写作,就像摸石头过河一样,一点点的前行。我在慢慢的摸索,慢慢的体会中,感悟出的一点个人心得体会现分享给大家。这也说明一个问题,网站上各种使用方法和技巧是对于已经使用过的人来说的方便和快捷,但对于刚刚接触的使用者来说,网上的各…

【Cursor】报错:FATAL:v8_initializer.cc(630)] Error loading V8 startup snapshot file

【Cursor】报错:FATAL:v8_initializer.cc(630)] Error loading V8 startup snapshot file 最初是在使用Cursor时左下角出现一个类似更新失败的提示,没注意,后来界面非常卡。 接着重新打开Cursor,提示说原文件不存在要删除快捷方式…

布隆过滤器(Bloom Filter)

文章目录 1. 定义2. 核心原理2.1 数据结构2.2 操作流程2.3 扩容 3. 优缺点3.1 优点3.2 缺点 4. 使用场景4.1 适用场景4.2 不适用场景 5. 手写布隆过滤器 1. 定义 布隆过滤器(Bloom Filter)是一种概率型数据结构,用于快速判断一个元素是否属于…

Build错误:Cannot determine build data storage root for project 和 无法加载主类的解决办法的经验分享

Build错误:Cannot determine build data storage root for project 解决方案与经验分享 1. 引言 查看错误信息 “Cannot determine build data storage root for project”的含义: 这是一个关于构建项目时遇到的常见错误。错误信息表明构建工具无法确定…

2025年02月26日Github流行趋势

项目名称:aibrix 项目地址url:https://github.com/vllm-project/aibrix项目语言:Jupyter Notebook历史star数:2234今日star数:881项目维护者:Jeffwan, varungup90, brosoul, nwangfw, kr11项目简介&#xf…