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

本文涉及的产品
云数据库 RDS MySQL Serverless,0.5-2RCU 50GB
简介:

根据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

相关实践学习
基于CentOS快速搭建LAMP环境
本教程介绍如何搭建LAMP环境,其中LAMP分别代表Linux、Apache、MySQL和PHP。
全面了解阿里云能为你做什么
阿里云在全球各地部署高效节能的绿色数据中心,利用清洁计算为万物互联的新世界提供源源不断的能源动力,目前开服的区域包括中国(华北、华东、华南、香港)、新加坡、美国(美东、美西)、欧洲、中东、澳大利亚、日本。目前阿里云的产品涵盖弹性计算、数据库、存储与CDN、分析与搜索、云通信、网络、管理与监控、应用服务、互联网中间件、移动服务、视频服务等。通过本课程,来了解阿里云能够为你的业务带来哪些帮助     相关的阿里云产品:云服务器ECS 云服务器 ECS(Elastic Compute Service)是一种弹性可伸缩的计算服务,助您降低 IT 成本,提升运维效率,使您更专注于核心业务创新。产品详情: https://www.aliyun.com/product/ecs
相关文章
|
1月前
|
关系型数据库 MySQL
Mysql常用语法总结
Mysql常用语法总结
22 0
|
1月前
|
SQL 关系型数据库 MySQL
MySQL 数据库基本语法
SQL,全称Structured Query Language(结构化查询语言),是一种用于管理关系型数据库(RDBMS)的编程语言。SQL用于创建、修改、查询和删除数据库中的数据,以及定义数据库架构。它是数据库管理系统(DBMS)与应用程序之间的标准通信协议。
77 6
|
6月前
|
SQL 关系型数据库 MySQL
MySQL数据的基础语法
MySQL数据的基础语法
|
6月前
|
存储 关系型数据库 MySQL
【ChatGPT】输出MySQL常用语法汇总
【ChatGPT】输出MySQL常用语法汇总
|
2月前
|
关系型数据库 MySQL
mysql一些常用语法
mysql一些常用语法
|
2月前
|
存储 关系型数据库 MySQL
7、Mysql语法
7、Mysql语法
21 0
|
2月前
|
存储 关系型数据库 MySQL
小课堂 -- Mysql语法
小课堂 -- Mysql语法
16 0
|
2月前
|
SQL 存储 关系型数据库
mysql语法
mysql语法
28 2
|
2月前
|
SQL 关系型数据库 MySQL
like concat 兼容h2、mysql、pgsql语法
like concat 兼容h2、mysql、pgsql语法
34 0
|
3月前
|
SQL 安全 关系型数据库
MySQL视图 视图的作用、视图常用语法
MySQL视图 视图的作用、视图常用语法
28 0