MySQL 5.7.5: 新语法WAIT_FOR_EXECUTED_GTID_SET 及存在的问题

本文涉及的产品
RDS MySQL Serverless 基础系列,0.5-2RCU 50GB
云数据库 RDS PostgreSQL,高可用系列 2核4GB
RDS MySQL DuckDB 分析主实例,集群系列 8核16GB
简介:

根据worklog的描述,该特性主要是为了解决WAIT_UNTIL_SQL_THREAD_AFTER_GTIDS的缺点:

#该功能依赖于slave来运行,如果复制线程没有启动或者出错了,就会返回错误。在某些情况下我们需要一直等待;

#返回的是执行的事件的个数,这通常是没有意义的,返回成功或者失败即可。

引入新的语法:

WAIT_FOR_EXECUTED_GTID_SET(GTID_SET [, TIMEOUT])

当GTID_SUBSET(GTID_SET, @@global.gtid_executed)成立时,即指定的GTID是gtid_executed的子集时,返回0表示成功,否则返回1,表示失败。

例如:

root@(none) 07:46:32>select @@global.gtid_executed;

+——————————————-+

| @@global.gtid_executed                    |

+——————————————-+

| 46293b73-58db-11e4-8b9c-38eaa78f3a78:1-32 |

+——————————————-+

1 row in set (0.00 sec)

root@(none) 07:48:56>select WAIT_FOR_EXECUTED_GTID_SET(‘46293b73-58db-11e4-8b9c-38eaa78f3a78:1-6′,64) as status;

+——–+

| status |

+——–+

|      0 |

+——–+

1 row in set (0.00 sec)

如下则需要等待,如果一直不满足,就会超时返回…

root@(none) 07:47:32>select WAIT_FOR_EXECUTED_GTID_SET(‘46293b73-58db-11e4-8b9c-38eaa78f3a78:1-37′,64);

老规矩,我们继续来看看代码的相关实现。另外该补丁也可能引入一个性能问题(待证实)

0.background

Mutex_cond_array:

Mutex_cond_array::wait 需要判断线程是否被kill来结束等待

增加新接口函数,等待指定sidno的condion.

inline int wait(const THD* thd, int sidno, struct timespec* abstime)

Gtid_state

增加接口函数Gtid_state::wait_for_gtid_set

Owned_gtids

sql/item_create.cc

Create_func_executed_gtid_set_wait  为新的函数增加接口类定义,解取参数item,然后创建对象Item_wait_for_executed_gtid_set

以后要增加新的函数接口,可以按照这个典型又简单的套路来实现;

文件sql/item_func.cc, sql/item_func.h新增:

类Item_wait_for_executed_gtid_set

Item_wait_for_executed_gtid_set::itemize

Item_wait_for_executed_gtid_set::val_int

{

result= gtid_state->wait_for_gtid_set(thd, gtid, timeout);

}

sql/item_func.h

Item_executed_gtid_set_wait

Item_wait_for_executed_gtid_set::itemize

Item_wait_for_executed_gtid_set::val_int

1.等待

堆栈:

mysql_select —> JOIN::exec —-> select_send::send_data —-> Protocol::send_result_set_row—> Item::send —> Item_wait_for_executed_gtid_set::val_int —> Gtid_state::wait_for_gtid_set —> Gtid_state::wait_for_gtid

Gtid_state::wait_for_gtid_set

检查请求的GTID集合 是否包含了当前的executed_gtid。如果不满足,则找出不满足的gtid的sidno (根据uuid 进行map后的整数),进入condition wait.

2.通知

在事务提交时,会发送broadcast.

Gtid_state::update_on_commit  —-> Gtid_state::broadcast_owned_sidnos

不过很显然,每次commit事务都需要做一次broadcast , 不管有没有线程在等待。感觉这部分应该可以被优化掉。

3.存在的问题

在之前版本中,如下逻辑:

开始刷Binlog cache时, gtid被加入到gtid_executed,在完成commit后,从gtid_owned移除;

在5.7.5版本里,加入到gtid_executed集合的操作被转移到完成commit后。由于在finish_commit中,各个线程是并发执行的,因此产生大量的锁竞争; 而在之前版本中,flush binlog cache总是只有一个线程进行,因此锁竞争很小。

当然这只是个人猜测,还没有回滚代码去证实,不过5.7.5的GTID改动确实引发了极大的性能退化,已经report了Bug并被verified了,感兴趣的可以看看这个bug:

http://bugs.mysql.com/bug.php?id=74328

4.代码

http://bazaar.launchpad.net/~mysql/mysql-server/5.7/revision/8460

相关实践学习
每个IT人都想学的“Web应用上云经典架构”实战
本实验从Web应用上云这个最基本的、最普遍的需求出发,帮助IT从业者们通过“阿里云Web应用上云解决方案”,了解一个企业级Web应用上云的常见架构,了解如何构建一个高可用、可扩展的企业级应用架构。
MySQL数据库入门学习
本课程通过最流行的开源数据库MySQL带你了解数据库的世界。   相关的阿里云产品:云数据库RDS MySQL 版 阿里云关系型数据库RDS(Relational Database Service)是一种稳定可靠、可弹性伸缩的在线数据库服务,提供容灾、备份、恢复、迁移等方面的全套解决方案,彻底解决数据库运维的烦恼。 了解产品详情: https://www.aliyun.com/product/rds/mysql 
相关文章
|
3月前
|
SQL 关系型数据库 MySQL
MySQL的查询操作语法要点
储存过程(Stored Procedures) 和 函数(Functions) : 储存过程和函数允许用户编写 SQL 脚本执行复杂任务.
239 14
|
3月前
|
SQL 关系型数据库 MySQL
MySQL的查询操作语法要点
以上概述了MySQL 中常见且重要 的几种 SQL 查询及其相关概念 这些知识点对任何希望有效利用 MySQL 进行数据库管理工作者都至关重要
120 15
|
5月前
|
Oracle 关系型数据库 MySQL
比较Oracle和MySQL的语法差异。
在使用Oracle和MySQL时,数据库设计、查询优化、以及日常管理的方式会因为这些差异而有不同的考虑和应用策略。因此,开发人员和数据库管理员必须了解各自数据库的特性和语法差异,以便更有效地利用数据库资源。适应这些语法和功能上的差异对于维护跨数据库平台应用至关重要。
311 0
|
7月前
|
SQL 关系型数据库 MySQL
MySQL探索:详解WITH AS语法的使用。
总的来说,MySQL的 `WITH AS`语法就如同我们路途中的导航设备,能帮助我们更好地组织和简化查询, 增强了我们和数据沟通的能力,使得复杂问题变得可控且更有趣。不论是在森林深处,还是在数据的海洋中,都能找到自己想要的路途和方向。
1165 12
|
12月前
|
SQL 存储 关系型数据库
【MySQL基础篇】全面学习总结SQL语法、DataGrip安装教程
本文详细介绍了MySQL中的SQL语法,包括数据定义(DDL)、数据操作(DML)、数据查询(DQL)和数据控制(DCL)四个主要部分。内容涵盖了创建、修改和删除数据库、表以及表字段的操作,以及通过图形化工具DataGrip进行数据库管理和查询。此外,还讲解了数据的增、删、改、查操作,以及查询语句的条件、聚合函数、分组、排序和分页等知识点。
1047 56
【MySQL基础篇】全面学习总结SQL语法、DataGrip安装教程
|
9月前
|
SQL 关系型数据库 MySQL
【YashanDB知识库】MySQL的FIND_IN_SET如何在YashanDB改写
本文来自YashanDB官网,探讨了MySQL中使用`FIND_IN_SET`函数在YashanDB中不兼容的问题及解决方法。由于YashanDB的`tinyint`类型无法参与条件运算,而MySQL的Boolean类型是`tinyint`的同义词,导致直接迁移时出现错误。文章通过分析原因,提出改写方案:将`where find_in_set(`替换为`where 0 < find_in_set(`,从而实现兼容性调整,方便用户快速迁移和改写SQL语句。
|
12月前
|
存储 SQL 关系型数据库
【MySQL基础篇】MySQL约束语法
文章介绍了MySQL中表的约束概念,包括非空、唯一、主键、默认和外键约束,以及如何在创建和修改表时指定这些约束。外键约束用于保持数据的一致性和完整性,文章通过示例展示了添加、删除外键的语法,并讨论了不同的删除/更新行为,如CASCADE和SETNULL。
【MySQL基础篇】MySQL约束语法
|
关系型数据库 MySQL 数据库
MySQL的语法涵盖了数据定义、数据操作、数据查询和数据控制等多个方面
MySQL的语法涵盖了数据定义、数据操作、数据查询和数据控制等多个方面
281 6
|
关系型数据库 MySQL 数据库
MySQL的语法知识
MySQL的语法知识
91 5
|
SQL 关系型数据库 MySQL
MySQL语法
MySQL语法
290 4

推荐镜像

更多