MYSQL 5.7中新增的表GTID_EXECUTED

正文

MySQL 5.6版本开启GTID模式,必须要先打开参数log_slave_updates,简单来说就是一定在从机上再记录一份二进制日志。这样的无论对性能还是存储的开销,无疑会相应的增大。而MySQL 5.7版本开始无需在GTID模式下启用参数log_slave_updates,其中最重要的原因在于5.7在mysql库下引入了新的表gtid_executed,其表结构如下所示:

mysql> SHOW CREATE TABLE mysql.gtid_executed\G

*************************** 1. row ***************************

Table: gtid_executed

Create Table: CREATE TABLE `gtid_executed` (

`source_uuid` char(36) NOT NULL COMMENT 'uuid of the source where the transaction was originally executed.',

`interval_start` bigint(20) NOT NULL COMMENT 'First number of interval.',

`interval_end` bigint(20) NOT NULL COMMENT 'Last number of interval.',

PRIMARY KEY (`source_uuid`,`interval_start`)

) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 STATS_PERSISTENT=0

1 row in set (0.00 sec)

简单来说,该表会记录当前执行的GTID。列source对应UUID,列interval_start/interval_end表示的是事务号。在MySQL 5.6中必须配置参数log_slave_updates的最重要原因在于当slave重启后,无法得知当前slave已经运行到的GTID位置,因为变量gtid_executed是一个内存值:

mysql> select @@global.gtid_executed\G

*************************** 1. row ***************************

@@global.gtid_executed: 7af7d3ea-933b-11e5-9da7-fa163e30f9a2:1-72054

1 row in set (0.00 sec)

所以MySQL 5.6的处理方法就是启动时扫描最后一个二进制日志,获取当前执行到的GTID位置信息。当然,如果DBA不小心将二进制日志删除了,那么这又会带来灾难性的问题。

因此,MySQL 5.7将gtid_executed这个值给持久化了。采用的技巧与MySQL 5.6处理SQL thread保存位置的方式一样,即将GTID值持久化保存在一张InnoDB表中,并与用户事务一起进行提交,从而实现数据的一致性:

START TRANSACTION;

# user statement

......

INSERT INTO mysql.gtid_executed VALUES (...)

END;

需要注意的是表mysql.gtid_executed是在主服务器和从服务器上有进行更新的,而表slave_relay_log_info仅在从服务器上更新。

MySQL 5.7对于表mysql.gtid_executed的更新策略也有些不同,如果没有主服务器没有开启log_bin或者从服务器没有开启log_slave_updates,其会每一个事物更新表gtid_executed,这样服务器重启后可以快速知道当前服务器执行到的GTID位置。因此,用户可能在服务器上看到类似如下的内容:

mysql> select * from mysql.gtid_executed;

+--------------------------------------+----------------+--------------+

| source_uuid | interval_start | interval_end |

+--------------------------------------+----------------+--------------+

| 05e16691-bf69-11e5-97cf-fa163e30f9a2 | 1 | 4334294 |

| 05e16691-bf69-11e5-97cf-fa163e30f9a2 | 4334296 | 4352984 |

| 05e16691-bf69-11e5-97cf-fa163e30f9a2 | 4352985 | 4352985 |

| 05e16691-bf69-11e5-97cf-fa163e30f9a2 | 4352986 | 4352986 |

| 05e16691-bf69-11e5-97cf-fa163e30f9a2 | 4352987 | 4352987 |

| 05e16691-bf69-11e5-97cf-fa163e30f9a2 | 4352988 | 4352988 |

......

那这样岂不是表gtid_executed中的记录会疯狂增长。为此,MySQL 5.7又引入了新的线程,用来对此表进行压缩,该线程如下所示:

mysql> select thread_id,thread_os_id,name,

-> processlist_command,processlist_state from threads

-> where name like '%compress%'\G

*************************** 1. row ***************************

thread_id: 39

thread_os_id: 23816

name: thread/sql/compress_gtid_table

processlist_command: Daemon

processlist_state: Suspending

1 row in set (0.01 sec)

参数gtid_executed_compression_period用来控制每执行多少个事务,对此表进行压缩,默认值为1000。因此,过一段时间后,上述的表mysql.gtid_executed会压缩成如下的内容:

mysql> select * from mysql.gtid_executed;

+--------------------------------------+----------------+--------------+

| source_uuid | interval_start | interval_end |

+--------------------------------------+----------------+--------------+

| 05e16691-bf69-11e5-97cf-fa163e30f9a2 | 1 | 4334294 |

| 05e16691-bf69-11e5-97cf-fa163e30f9a2 | 4334296 | 4354329 |

......

如果MySQL服务器启用了二进制日志,则表mysql.gtid_executed的更新仅在二进制rotation时发生,因为发生重启等情况依旧可以通过扫描二进制日志判断得知当前运行的GTID位置。

开启log_slave_updates后,主从服务器性能有多少的差异,这是一个比较有意思的问题。不过IMG社区群中的西毒同学,已经发现了另一个有意思的问题,即主服务器将innodb_flush_log_at_trx_commit设置为0,依然能保证crash safe。

mysql.gtid executed_MYSQL 5.7中新增的表GTID_EXECUTED相关推荐

  1. mysql 视图列信息_MySQL 中获取用户表、用户视图、用户表中列信息

    /// ///MySql 数据库维护中心/// public classMySqlDbMaintenance:DbMaintenanceProvider {/// ///获取视图信息列表 Sql语句/ ...

  2. mysql搜索所有表,mySQL查询来搜索数据库中的所有表以查找字符串?

    Is there a mySQL query to search all tables within a database? If not can you search all tables with ...

  3. HTML5中新增的表单元素[智能表单]

    [HTML5 智能表单] H5新增input的form属性,用于指向特定form表单的id,实现input无需放在form标签之中,即可通过表单进行提交. <FORM id=foo> - ...

  4. Html5中新增的表单元素详解

    HTML5 的新的表单元素: HTML5 拥有若干涉及表单的元素和属性. •datalist •keygen •output datalist 元素 datalist 元素规定输入域的选项列表.列表是 ...

  5. 清空mysql一个库中的所有表_mysql怎样清空一个数据库中的所有表_MySQL

    转载自:http://blog.csdn.net/zhangzhizhen1988/article/details/8432146 Mysql清空表是很重要的操作,也是最常见的操作之一,下面就为您详细 ...

  6. 实战:从Mysql数据库frm文件中,提取表结构创建SQL语句

    需求 在某些特殊的场景下,例如你的mysql数据库无法启动,需要你将表的ibd文件拷贝到另一个数据库中,恢复业务数据库,恢复业务数据的前提,是你需要在另一个数据库中,创建好一模一样的表结构.这时你就需 ...

  7. linux mysql 清空数据库_mysql 怎样清空一个数据库中的所有表

    Mysql清空表是很重要的操作,也是最常见的操作之一,下面就为您详细介绍Mysql清空表的实现方法,希望能够对您有所帮助. 方法1:重建库和表 一.只导出表结构 导出整个数据库结构(不包含数据) my ...

  8. mysql.gtid executed_【20180608】MySQL5.7新增表mysql.gtid_executed

    MySQL5.7新增表mysql.gtid_executed MySQL5.6主从,从库获取gtid_executed 在MySQL5.6的时候,主从复制开启了GTID,在slave执行show sl ...

  9. mysql gtid 还是pxc_记一次 PXC 集群拆分引发的思考

    原标题:记一次 PXC 集群拆分引发的思考 作者简介 冷正磊 2018年2月加入去哪儿网 DBA 团队,主要负责机票业务的 MySQL 和 Redis 数据库的运维管理工作,以及数据库自动化运维平台部 ...

最新文章

  1. [AaronYang]C#人爱学不学8[事件和.net4.5的弱事件深入浅出]
  2. 微信8年,干掉了短信也杀死了媒体?
  3. JAVA系统和DOMINO通过LDAP集成方
  4. 机械学python_机械学习 · python深度学习 · 看云
  5. c#泛型作为返回类型的写法
  6. leetcode 1370. 上升下降字符串
  7. 【数据结构与算法】二叉树基本算法锦集
  8. Simulink之电网电压换流式有源逆变电路
  9. java/01/java简介,java基本概念,java基本类型的划分
  10. asp mysql 设置编码_ASP对数据库各种操作的代码
  11. 乌班图mysql8.0安装第一次手工启动_Ubuntu Server 16.04下mysql8.0安装配置图文教程
  12. Spring字段注入
  13. 关于蛙跳算法的计算机文献,文化蛙跳算法性能分析研究.PDF
  14. 轻松解决Mac和Windows中Unity汉化问题
  15. Vscode 配置cmake
  16. JavaSE实战项目:飞翔的小鸟(完整版)
  17. 现有的DoS(DDoS)防御技术整理
  18. Dynamic Knowledge Graph Completionwith Jointly Structural and Textual Dependency
  19. checkm基因组_checkm8漏洞利用的技术分析
  20. 微型计算机 运算器的功能,微型机运算器的主要功能

热门文章

  1. PCT: Point Cloud Transformer
  2. html把图片色调一致,PS如何让一张图片周围的颜色变得一致?
  3. web 打印控件 lodop
  4. ROS teb_local_planner使用
  5. android splash 公司,正确地写一个Android Splash页面
  6. 运营-15.涉及促销活动的计算原则
  7. 垃圾当当网_longware_新浪博客
  8. 卡尔曼滤波公式及参数详解
  9. MiniGPT-4开源了,史无前例的AI图片内容分析,甚至能用于逻辑验证码推理识别
  10. java中的isEmpty方法,以及与引号区别