MySQL 8.0新的GTID持久化线程和GTID恢复方式

虽然线程本身很简单,但是涉及到purge线程,事务/UNDO等核心概念。

水平有限,仅供参考。

一、总体变化

我们这里说的GTID持久化线程,就是我们看到的如下:

| thread/innodb/clone_gtid_thread             |         6703 |

其实整个GTID持久化线程,依赖了数据结构Clone_persist_gtid,而它本 身 也是全局变量Clone_Sys中的一个元素而已。 我们后面 再 看其中的重要元素,它在用户线程做innodb成提交的时候起到了作用,同时协调了GTID持久化线程和purge线程,是核心的数据结构。

总的说来就是下面的变化:

  • 用户线程提交事务将gtid写入到undo header,并且写入到gtid刷新链表中。

  • GTID持久化线程每100毫秒进行gtid flush链表的批量刷新到gtid_executed表中,且GTID持久化线程代替了GTID压缩线程的功能,进行GTID的压缩。

  • purge线程不允许清理未写入到gtid_executed表中事务的undo,为恢复提供基础。

  • Crash recovery的时候gtid内存值的恢复也会读取undo header,因此不再是5.7的仅仅依赖binlog和gtid executed表。

这样带来的最直观的表现是:

  • 5.7中binlog开启的情况下gtid_executed表示binlog切换更新

  • 8.0中binlog开启的情况下gtid_executed表是实时(准实时)更新

此外这一块和clone有着紧密的关系,也会后面学习clone plugin提供一个基础。

二、核心数据结构Clone_persist_gtid中的重要元素

元素 解释
静态常量s_time_threshold_ms 硬编码100毫秒,gtid 持久化线程的执行周期
静态常量s_compression_threshold 硬编码50,这个50的单位是gtid持久化线程批量刷gtid_executed表的次数,通常binlog开启就是每50次gtid批量持久化后进行一次gtid_executed表压缩
静态常量s_gtid_threshold 硬编码1024,单位是事务个数,如果用户提交线程发现积压的gtid事务有多于1024个没有写到gtid_executed表,会主动唤醒gtid持久化线程
静态常量s_max_gtid_threshold 硬编码1024*1024,单位是事务个数,如果用户提交线程发现积压的gtid事务有多于1024*1024个没有写到gtid_executed表,会主动等待gitd持久化线程写gtid_executed表
m_gtids[2] gtid刷新链表,有2个,轮询使用,每批量刷一次gtid到gtid_executed表会切换一次,并且前一个链表清空
原子变量m_active_number 单位是gtid刷新链表切换的次数,主要用确认该刷哪个链表了,代表准备刷入
原子变量m_flush_numbe
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值