GTID的变更时机

2024-06-20 22:32
文章标签 时机 变更 gtid

本文主要是介绍GTID的变更时机,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

  1. mysql.gtid_executed:GTID的持久化介质,GTID模块初始化时,会读取这个表,作为gtid_executed 变量的初始值
  2. gtid_executed 变量:表示数据库执行了哪些GTID  ,This is the same as the value of the Executed_Gtid_Set column in the output of SHOW MASTER STATUS and SHOW SLAVE STATUS.
  3. gtid_purged变量:包含了mysql执行过的且没有在binlog文件存在的事务。gtid_purged是gtid_executed的一个子集。

 The set of GTIDs in the gtid_purged system variable contains the GTIDs of all the transactions that have been committed on the server, but do not exist in any binary log file on the server. gtid_purged is a subset of gtid_executed.

gtid_purged写入的策略:

  1. GTIDs of replicated transactions that were committed with binary logging disabled on the replica.  从库禁用binlog情况下,从库执行的已提交的事务时的GTID
  2. GTIDs of transactions that were written to a binary log file that has now been purged.在binlog文件在被清理时,已经写入binlog文件的GTID

  3. GTIDs that were added explicitly to the set by the statement SET @@GLOBAL.gtid_purged. 手工设置了参数

例如:An example use case for this action is when you are restoring a backup of one or more databases on a server, but you do not have the relevant binary logs containing the transactions on the server,In MySQL 5.7, you can only change the value of gtid_purged when gtid_executed (and therefore gtid_purged) is empty

我们在通过备份搭建从库时,我们需要手工设置set gtid_purged =‘’,前提是清空gtid_executed

变量gtid_executed and gtid_purged在mysql启动的时候被初始化。

 

前提是binlog打开,gtid打开的情况下讨论。

一,主库修改时机

1,mysql.gtid_executed什么时间被修改?

mysql重启或者binlog 切换时,它不是实时更新的。

相关函数(文件rpl_gtid.h):Gtid_state::save_gtids_of_last_binlog_into_table()

int save_gtids_of_last_binlog_into_table(bool on_rotation);/**Fetch gtids from gtid_executed table and store them intogtid_executed set.@retval0    OK@retval1    The table was not found.@retval-1   Error*/

2,变量gtid_executed什么时间被修改?

在order commit的flush阶段生成GTID,在commit阶段才记入gtid_executed变量,是实时更新的。

源码:

void Gtid_state::update_gtids_impl_own_gtid_set(THD *thd, bool is_commit)
{
#ifdef HAVE_GTID_NEXT_LISTrpl_sidno prev_sidno= 0;Gtid_set::Gtid_iterator git(&thd->owned_gtid_set);Gtid g= git.get();while (g.sidno != 0){if (g.sidno != prev_sidno)sid_locks.lock(g.sidno);owned_gtids.remove_gtid(g);git.next();g= git.get();if (is_commit)executed_gtids._add_gtid(g);}if (is_commit && !thd->owned_gtid_set.is_empty())thd->rpl_thd_ctx.session_gtids_ctx().notify_after_gtid_executed_update(thd);thd->variables.gtid_next.set_undefined();thd->owned_gtid.dbug_print(NULL,"set owned_gtid (clear; old was gtid_set) ""in update_gtids_impl");thd->clear_owned_gtids();
#elseDBUG_ASSERT(0);
#endif
}

3,gtid_purged什么时间被修改的?

在清理binlog的时候进行修改,如purge或者过期时间到了,需要将丢失的GTID SETS 计入这个变量中,不是实时更新的。

对应源码函数(binlog.cc文件):MYSQL_BIN_LOGS::purge_logs

int MYSQL_BIN_LOG::purge_logs(const char *to_log,bool included,bool need_lock_index,bool need_update_threads,ulonglong *decrease_log_space,bool auto_purge)
{...// Update gtid_state->lost_gtidsif (!is_relay_log){global_sid_lock->wrlock();error= init_gtid_sets(NULL,const_cast<Gtid_set *>(gtid_state->get_lost_gtids()),opt_master_verify_checksum,false/*false=don't need lock*/,NULL/*trx_parser*/, NULL/*gtid_partial_trx*/);global_sid_lock->unlock();if (error)goto err;}
wAAACH5BAEKAAAALAAAAAABAAEAAAICRAEAOw==

二,从库修改时机

前提是binlog,log_state_update开启

此时mysql.gtid_executed和 gtid_purge不需要实时更新,可以通过binlog文件进行保存,修改时机也是主库一样的

 

三,其他情况下

1,reset master 

此时mysql.gtid_executed,变量gtid_executed和gtid_purge都会被清空,对应函数如下:

reset master 源码对应如下:

bool reset_master(THD* thd)
{bool ret= false;/*RESET MASTER command should ignore 'read-only' and 'super_read_only'options so that it can update 'mysql.gtid_executed' replication repositorytable.Please note that skip_readonly_check flag should be set even when binary logis not enabled, as RESET MASTER command will clear 'gtid_executed' table.*/
...
{global_sid_lock->wrlock();ret= (gtid_state->clear(thd) != 0);   //执行gtid清理操作global_sid_lock->unlock();}
wAAACH5BAEKAAAALAAAAAABAAEAAAICRAEAOw==

清理函数

int Gtid_state::clear(THD *thd)
{DBUG_ENTER("Gtid_state::clear()");int ret= 0;// the wrlock implies that no other thread can hold any of the mutexessid_lock->assert_some_wrlock();lost_gtids.clear();   //清理gtid_purgedexecuted_gtids.clear();   //清理gtid_executedgtids_only_in_table.clear();  //清理mysql.gtid_executedprevious_gtids_logged.clear();/* Reset gtid_executed table. */if ((ret= gtid_table_persistor->reset(thd)) == 1){/*Gtid table is not ready to be used, so failed toopen it. Ignore the error.*/thd->clear_error();ret= 0;}next_free_gno= 1;DBUG_RETURN(ret);
}
wAAACH5BAEKAAAALAAAAAABAAEAAAICRAEAOw==

 

这篇关于GTID的变更时机的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1079434

相关文章

笔试强训,[NOIP2002普及组]过河卒牛客.游游的水果大礼包牛客.买卖股票的最好时机(二)二叉树非递归前序遍历

目录 [NOIP2002普及组]过河卒 牛客.游游的水果大礼包 牛客.买卖股票的最好时机(二) 二叉树非递归前序遍历 [NOIP2002普及组]过河卒 题里面给的提示很有用,那个马的关系,后面就注意,dp需要作为long的类型。 import java.util.Scanner;// 注意类名必须为 Main, 不要有任何 package xxx 信息publ

包拯断案 | 数据库从库GTID在变化 为何没有数据写入@还故障一个真相

提问:作为DBA运维的你是否遇到过这些烦恼 1、数据库从库复制链路如何正确配置表过滤信息? 2、数据库从库的GTID在变化,实际却没有数据写入,究竟是什么原因? 心中有章,遇事不慌 作为DBA的你,遇到问题无从下手,除了在问题面前徘徊,还能如何选择?如果你一次或多次遇到该问题还是 无法解决,又很懊恼,该如何排忧呢?关注公众号,关注《包拯断案》专栏,让小编为你排忧解难~ #包拯秘籍#

Mysql在线安全变更工具 gh-ost

gh-ost(GitHub Online Schema Translater)是一个用于安全地进行 MySQL 数据库表结构变更的工具,专门为在线数据库迁移而设计。它的主要优点是可以在不中断业务的情况下,不影响数据库的可用性和性能,进行表结构的修改。 主要特点 在线迁移:gh-ost 允许在高负载的生产环境中进行表结构的更改,而不需要锁定表,确保数据库的可用性。 渐进式复制:通过逐步复制行

Weex入门教程之,关注weex-toolkit命令变更

由于weex的版本处于快速迭代中,我们需要时刻关注其变动,因为weex可能修复了某些bug或新增了一些功能。 关注链接:  原码链接:https://github.com/weexteam/weex-toolkit  发布链接:https://www.npmjs.com/package/weex-toolkit 或者使用帮助命令查看 Microsoft Windows [版本 10.0.10

pytorch pyro 贝叶斯神经网络 bnn beyesean neure network svi ​定制SVI目标和培训循环,变更推理

定制SVI目标和培训循环¶ Pyro支持各种基于优化的贝叶斯推理方法,包括Trace_ELBO作为SVI(随机变分推理)的基本实现。参见文件(documents的简写)有关各种SVI实现和SVI教程的更多信息I, 二,以及罗马数字3了解SVI的背景。 在本教程中,我们将展示高级用户如何修改和/或增加变分目标(或者:损失函数)以及由Pyro提供的训练步骤实现,以支持特殊的用例。 基本SVI用

【60天备战软考高级系统架构设计师——第六天:需求验证与变更管理】

需求验证和变更管理是需求工程的后续阶段,目的是确保所有需求都被正确理解、实现和管理。今天的内容将了解如何进行需求验证以及如何有效管理需求变更。 需求验证与确认 需求审查 与用户和利益相关者一起审查需求文档,确保需求的准确性和完整性。方法:需求评审会议、走查等。 原型验证 通过构建低保真原型(如线框图)或高保真原型(如功能模型),向用户演示系统功能并获取反馈。工具:Axure、Balsami

通过 GitHub Actions 执行数据库 Schema 变更工作流

原文地址 https://www.bytebase.com/docs/tutorials/github-ci/ 教程库:https://github.com/bytebase/github-action-example 开发者们喜欢将 Schema 变更脚本与应用程序代码一起保存在 Git 中,这样变更脚本就能像应用程序代码一样接受审核和版本控制,但仍需将变更脚本手动粘贴到 SQL 客户端,或

关于Xcode6编译变更 “Implicit declaration of function 'sysctl' is invalid in C99” 报错问题

之前代码在Xcode5.1上面跑的好好的,但是自从升级到6.0之后,就经常出现编译报错问题。后来查阅的相关资料,好像是Xcode为了兼容Swift语言,更换来编译系统(名字忘记了)。于是就报了一个C语言的C99编译错误,不说了,直接上代码。 一般出现该问题是因为通过C调用了unix/linux 底层接口,所以需要调整c语言的编译选项,设置方法见下图:(根据实际情况选择相应的编译选项

【Java设计模式】脏标记模式:通过变更跟踪优化性能

文章目录 【Java设计模式】脏标记模式:通过变更跟踪优化性能一、概述二、详细解释及实际示例三、Java中脏标记模式的编程示例四、何时在Java中使用脏标记模式五、脏标记模式在Java中的实际应用六、脏标记模式的优点和权衡七、源码下载 【Java设计模式】脏标记模式:通过变更跟踪优化性能 一、概述 脏标记设计模式通过维护一个布尔标记来避免不必要的计算或资源密集型操作,该标记跟

数据库 变更和版本控制管理工具 --Bytebase 安装部署

数据库 变更和版本控制管理工具 --Bytebase 安装部署 文章目录 数据库 变更和版本控制管理工具 --Bytebase 安装部署前言一.Docker部署Bytebase1.Docker 配置2. pull 数据3. 执行部署4. 打开浏览器 部署完成 二、使用步骤1.注册超管2.配置 Configure External URL 总结 前言 Bytebase 是