返回顶部
首页 > 资讯 > 数据库 >Mysql 5.7中Gtid和Last_commt/sequnce_number的生成时机是什么
  • 758
分享到

Mysql 5.7中Gtid和Last_commt/sequnce_number的生成时机是什么

2024-04-02 19:04:59 758人浏览 泡泡鱼
摘要

本篇内容主要讲解“Mysql 5.7中Gtid和Last_commt/sequnce_number的生成时机是什么”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“

本篇内容主要讲解“Mysql 5.7中Gtid和Last_commt/sequnce_number的生成时机是什么”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习mysql 5.7中Gtid和Last_commt/sequnce_number的生成时机是什么”吧!

一、Gtid生成类型

这里首先使用源码的解释给出三种类型:

  • AUTOMATIC_GROUP

  • GTID_GROUP

  • ANONYMOUS_GROUP

其中AUTOMATIC_GROUP通常用于主库开启Gtid的情况,GTID_GROUP通常用于备库和使用了GTID_NEXT的情况下。

源码中有详细解释如下:

 
  AUTOMATIC_GROUP= 0,
  
  GTID_GROUP,
  
ANONYMOUS_GROUP

二、Gtid和Last_commt/sequnce_number的生成时机

Gtid其实是在commit的时候调用MYsql_BIN_LOG::ordered_commit执行到flush 阶段产生Gtid event的时候才生成,生成后会将这个Gtid 加入到Gtid_state的Owned_gtids中,实际上这个过程不仅要生成Gtid还会生成sequence_number和last_commit并且会构造Gtid_event写入到binlog cache最后将binlog cache写入到binlog file,下面是binlog_cache_data::flush函数的片段:

if (!error)
      if ((error= mysql_bin_log.write_gtid(thd, this, &writer))) //生成Gtid和Last_commt/sequnce_number构造好Gtid event并且写入到到binlog cache中
        thd->commit_error= THD::CE_FLUSH_ERROR;
if (!error)
      error= mysql_bin_log.write_cache(thd, this, &writer);  //将binlog cache写入到文件

下面是mysql_bin_log.write_gtid中生成Gtid和Last_commt/sequnce_number的代码片段:

 if (thd->variables.gtid_next.type == AUTOMATIC_GROUP)//如果过是非指定的Gtid则需要自动生成调用generate_automatic_gtid生成
  {
    if (gtid_state->generate_automatic_gtid(thd,
            thd->get_transaction()->get_rpl_transaction_ctx()->get_sidno(),
            thd->get_transaction()->get_rpl_transaction_ctx()->get_gno())
            != RETURN_STATUS_OK)
      DBUG_RETURN(true);
  }
.....
//下面生成sequence_number和last_committed
  int64 relative_sequence_number= trn_ctx->sequence_number - clock.get_offset();
  int64 relative_last_committed=
    trn_ctx->last_committed <= clock.get_offset() ?
    SEQ_UNINIT : trn_ctx->last_committed - clock.get_offset();

其调用栈帧如下:

#0  Gtid_state::get_automatic_gno (this=0x2ff8bb0, sidno=1) at /root/mysql5.7.14/percona-server-5.7.14-7/sql/rpl_gtid_state.cc:564
#1  0x0000000001803248 in Gtid_state::generate_automatic_gtid (this=0x2ff8bb0, thd=0x7fff2c000b70, specified_sidno=0, specified_gno=0)
    at /root/mysql5.7.14/percona-server-5.7.14-7/sql/rpl_gtid_state.cc:628
#2  0x0000000001845703 in MYSQL_BIN_LOG::write_gtid (this=0x2dffc80, thd=0x7fff2c000b70, cache_data=0x7fff2c021178, writer=0x7ffff0358810)
    at /root/mysql5.7.14/percona-server-5.7.14-7/sql/binlog.cc:1167
#3  0x0000000001846307 in binlog_cache_data::flush (this=0x7fff2c021178, thd=0x7fff2c000b70, bytes_written=0x7ffff03588b8, wrote_xid=0x7ffff0358917)
    at /root/mysql5.7.14/percona-server-5.7.14-7/sql/binlog.cc:1454
#4  0x0000000001860e57 in binlog_cache_mngr::flush (this=0x7fff2c020ff0, thd=0x7fff2c000b70, bytes_written=0x7ffff0358918, wrote_xid=0x7ffff0358917)
    at /root/mysql5.7.14/percona-server-5.7.14-7/sql/binlog.cc:768
#5  0x0000000001856d46 in MYSQL_BIN_LOG::flush_thread_caches (this=0x2dffc80, thd=0x7fff2c000b70) at /root/mysql5.7.14/percona-server-5.7.14-7/sql/binlog.cc:8470
#6  0x0000000001856f77 in MYSQL_BIN_LOG::process_flush_stage_queue (this=0x2dffc80, total_bytes_var=0x7ffff0358a88, rotate_var=0x7ffff0358a87, 
    out_queue_var=0x7ffff0358a78) at /root/mysql5.7.14/percona-server-5.7.14-7/sql/binlog.cc:8532
#7  0x0000000001858593 in MYSQL_BIN_LOG::ordered_commit (this=0x2dffc80, thd=0x7fff2c000b70, all=false, skip_commit=false)

接下来我们就需要具体研究下一个Gtid是依靠什么逻辑生成的。我们需要查看函数Gtid_state::generate_automatic_gtid和Gtid_state::get_automatic_gno逻辑,他们用于生成一个Gtid。

三、Gtid_state::generate_automatic_gtid逻辑

 // If GTID_MODE = ON_PERMISSIVE or ON, generate a new GTID
  if (get_gtid_mode(GTID_MODE_LOCK_SID) >= GTID_MODE_ON_PERMISSIVE)//如果GTID_MODE是ON_PERMISSIVE和ON则生成GTID
  {
    Gtid automatic_gtid= { specified_sidno, specified_gno };

    if (automatic_gtid.sidno == 0)//如果是备库则sidno>0,如果是主库sidno==0,因为主库的Gtid这个时候才生成,但是备库则是使用GTID_GROUP指定生成
      automatic_gtid.sidno= get_server_sidno();//此处返回本server的sidno

    lock_sidno(automatic_gtid.sidno);//此处对并发生成GNO的多个线程进行控制

    if (automatic_gtid.gno == 0)//如果是备库则gno>0,如果是主库gno == 0,因为主库的Gtid这个时候才生成,但是备库则是使用GTID_GROUP指定生成
      automatic_gtid.gno= get_automatic_gno(automatic_gtid.sidno);//此处返回最后指定sidno的end gno

    if (automatic_gtid.gno != -1)
      acquire_ownership(thd, automatic_gtid);//此处将这个gtid 及上面的SIDNO:gno加入到owned_gtids中 并且赋予给线程 经过本步骤 可以显示
    else
      ret= RETURN_STATUS_REPORTED_ERROR;

    unlock_sidno(automatic_gtid.sidno);//分配完成其他线程可以分配
  }
  else //如果是OFF_PERMISSIVE或者OFF状态如何处理 这里不做讨论了
  {
    // If GTID_MODE = OFF or OFF_PERMISSIVE, just mark this thread as
    // using an anonymous transaction.
    thd->owned_gtid.sidno= THD::OWNED_SIDNO_ANONYMOUS;
    thd->owned_gtid.gno= 0;
    acquire_anonymous_ownership();
    thd->owned_gtid.dbug_print(NULL,
                               "set owned_gtid (anonymous) in generate_automatic_gtid");
  }

  sid_lock->unlock();//释放读写

接下来看看gno的生成逻辑Gtid_state::get_automatic_gno。

四、Gtid_state::generate_automatic_gtid逻辑

while (true)
  {
    const Gtid_set::Interval *iv= ivit.get(); //定义Interval指针指向 这个链表指针开头,如果在进行下次循环会获得NULL
    rpl_gno next_interval_start= iv != NULL ? iv->start : MAX_GNO; //正常情况下不会为NULL因此 next_interval_start 等于第一个interval的start,当然如果初始化会为NULL,
                                                                   //如果Interval->next =NULL 则标示没有区间了。
    while (next_candidate.gno < next_interval_start &&
           DBUG_EVAluaTE_IF("simulate_gno_exhausted", false, true)) //这里next_candidate.gno正常不会小于next_interval_start ,如果Interval->next =NULL或者初始化
                                                                    //next_interval_start会被制为MAX_GNO那么条件成立  
                                                                    //DBUG_RETURN(next_candidate.gno);返回了这个gno 则GTID生成
    {
      if (owned_gtids.get_owner(next_candidate) == 0) //如果本GTID已经被其他线程占用则next_candidate.gno++;返回这个gno。
        DBUG_RETURN(next_candidate.gno);
      next_candidate.gno++;
    }
    if (iv == NULL ||
        DBUG_EVALUATE_IF("simulate_gno_exhausted", true, false))
    {
      my_error(ER_GNO_EXHAUSTED, MYF(0));
      DBUG_RETURN(-1);
    }
    next_candidate.gno= iv->end; //iv->end 则指向了本区间最大的值+1
    ivit.next();
  }

到此,相信大家对“Mysql 5.7中Gtid和Last_commt/sequnce_number的生成时机是什么”有了更深的了解,不妨来实际操作一番吧!这里是编程网网站,更多相关内容可以进入相关频道进行查询,关注我们,继续学习!

您可能感兴趣的文档:

--结束END--

本文标题: Mysql 5.7中Gtid和Last_commt/sequnce_number的生成时机是什么

本文链接: https://lsjlt.com/news/65748.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

猜你喜欢
  • Mysql 5.7中Gtid和Last_commt/sequnce_number的生成时机是什么
    本篇内容主要讲解“Mysql 5.7中Gtid和Last_commt/sequnce_number的生成时机是什么”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“...
    99+
    2024-04-02
  • mysql中gtid指的是什么
    在MySQL中,GTID(Global Transaction Identifier)是一种全局事务标识符。它是由MySQL服务器自...
    99+
    2024-04-09
    mysql
  • GTID中MySQL启动时间慢是什么原因
    本篇内容介绍了“GTID中MySQL启动时间慢是什么原因”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!我们...
    99+
    2024-04-02
  • Mysql 5.7中mysql.gtid_executed表及其他变量更改时机是什么
    本篇内容介绍了“Mysql 5.7中mysql.gtid_executed表及其他变量更改时机是什么”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些...
    99+
    2024-04-02
  • Mysql中基于GTID的复制模式是什么
    这篇文章主要介绍了Mysql中基于GTID的复制模式是什么,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了解一下。GTID定义GTID( Global...
    99+
    2024-04-02
  • mysql事务id内部生成机制是什么
    MySQL事务ID内部生成机制是通过自增长计数器来实现的。MySQL使用一个内部的64位计数器来生成事务ID。每当发生一个新的事务时...
    99+
    2023-10-09
    mysql
  • c++时间戳生成的方法是什么
    在C++中生成时间戳的方法可以使用std::chrono库。下面是一个示例代码,可以获取当前时间戳: #include <ch...
    99+
    2024-03-04
    c++
  • java生成随机数的原理是什么
    java生成随机数的原理是什么?很多新手对此不是很清楚,为了帮助大家解决这个难题,下面小编将为大家详细讲解,有这方面需求的人可以来学习下,希望你能有所收获。Java的优点是什么1. 简单,只需理解基本的概念,就可以编写适合于各种情况的应用程...
    99+
    2023-06-14
  • Qt生成随机数的方法是什么
    这篇文章主要介绍“Qt生成随机数的方法是什么”,在日常操作中,相信很多人在Qt生成随机数的方法是什么问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”Qt生成随机数的方法是什么”的疑惑有所帮助!接下来,请跟着小编...
    99+
    2023-06-21
  • linux生成随机数的命令是什么
    在Linux中,可以使用`od`命令生成随机数。`od`命令用于将输入文件按照指定格式输出,而`/dev/random`和`/dev...
    99+
    2023-08-18
    linux
  • Python生成随机数的方法是什么
    Python生成随机数的方法有两种: 使用random模块:可以使用random模块中的randint()函数生成指定范围的整数随...
    99+
    2024-03-05
    python
  • oracle生成随机数的方法是什么
    在Oracle数据库中,可以使用DBMS_RANDOM包来生成随机数。以下是一些常用的方法: 使用DBMS_RANDOM.VALU...
    99+
    2024-04-09
    oracle
  • oracle随机数生成的方法是什么
    在Oracle中,可以使用DBMS_RANDOM包来生成随机数。以下是使用DBMS_RANDOM包生成随机数的方法: 使用DBM...
    99+
    2024-04-09
    oracle
  • sql随机数生成的方法是什么
    在 SQL 中生成随机数的方法取决于使用的数据库管理系统(DBMS)。以下是一些常见的数据库系统中生成随机数的方法: MySQL:...
    99+
    2024-04-09
    sql
  • Python中的迭代和生成器的区别是什么?
    Python中的迭代和生成器是两种不同的概念,它们在处理数据集合时有着不同的表现和用法。本文将详细介绍迭代和生成器的区别,并提供具体的代码示例。首先,让我们来了解一下迭代和生成器的概念。迭代是一种重复执行某一段代码的方法,它可以遍历一个序列...
    99+
    2023-10-22
    迭代(iteration) 生成器(generator) 区别(difference)
  • C#生成随机的中文汉字的原理是什么
    这篇文章主要讲解了“C#生成随机的中文汉字的原理是什么”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“C#生成随机的中文汉字的原理是什么”吧!腾讯为了防止目前网络上横行的QQ号码自动注册机而采...
    99+
    2023-06-18
  • requirements.txt的生成和安装方法是什么
    这篇文章主要介绍了requirements.txt的生成和安装方法是什么的相关知识,内容详细易懂,操作简单快捷,具有一定借鉴价值,相信大家阅读完这篇requirements.txt的生成和安装方法是什么文章都会有所收获,下面我们一起来看看吧...
    99+
    2023-07-05
  • Python中的迭代器和生成器的区别是什么?
    Python中的迭代器和生成器的区别是什么?在Python编程中,迭代器(iterator)和生成器(generator)都是用于处理可迭代对象的工具。它们两者都可以用于遍历数据,但是在实现上却有一些不同之处。迭代器是一个对象,它实现了迭代...
    99+
    2023-10-22
    生成器 迭代器 区别
  • java生成随机整数的方法是什么
    在Java中,生成随机整数的方法通常使用Random类来实现。以下是一种简单的方法来生成随机整数: import java.util...
    99+
    2024-04-02
  • python中生成器的原理是什么
    这篇文章将为大家详细讲解有关python中生成器的原理是什么,文章内容质量较高,因此小编分享给大家做个参考,希望大家阅读完这篇文章后对相关知识有一定的了解。Python的优点有哪些1、简单易用,与C/C++、Java、C# 等传统语言相比,...
    99+
    2023-06-14
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作