MySQL 5.7 GTID OOM bug案例分析 --大量压测后主从不同步
转载自:http://www.sohu.com/a/231766385_487483
MySQL 5.7是十年内最为经典的版本,这个观点区区已经表示过很多次。然而,经典也是由不断地迭代所打造的传奇。5.7给我印象最深的莫过于各种OOM,比如线程池、XA事务、information_schema等OOM的各种场景,之前在网易时就遇到了不少。
遇到OOM问题是非常令人头疼的,因为这类问题可能是最难排查的故障,复现需要很长的时间。好在5.7的performance_schema能够各种维度监控MySQL的内存使用情况,使得DBA拥有了一定的线索或可能来排查问题,具体可见一年之前发表的文章:MySQL 5.7 OOM问题诊断——就是这么简单
OOM问题虽烦人,但至少说明负责的DB业务相对是比较大的。若能遇到并解决这样的问题,无疑level就会+1,成就+1,这不就是DBA应该追求的挑战么?只喝咖啡刷微信群,又如何能够成为业界Top 5(前5%)的DBA?
今天分享最近在线上遇到的一例OOM问题实战。简单来说,若满足下面条件,则你线上的从机DB必然会遇到OOM问题:
- MySQL version <= 5.7.17;
- 开启了GTID和GTID合并功能;
- Slave设置super_read_only=1;
MySQL 5.7引入了表gtid_executed,解决了开启GTID必须要开启参数log_slave_updates的小困扰,因为开启log_slave_updates会多写一份二进制日志,存储会有一定额外的开销。具体见:MySQL 5.7中新增的表gtid_executed,看看是否解决了你的痛点。
若启用GTID并且不启用线程log_slave_updates,则表gtid_executed会不断增大,每次事务提交会将当前GTID写入到该表。为了避免此表不断增大,MySQL引入GTID合并线程thread/sql/compress_gtid_table,定期来合并这张表。参数gtid_executed_compression_period用来控制GTID合并的频率。
然而,在MySQL 5.7.17及之前的版本中,当从机设置super_read_only = 1时,MySQL会认为当前是只读的,应该阻止所有DML操作,因此GTID合并线程也会失败,而失败的GTID合并线程会不断地重试。此外,由于合并失败,表gtid_executed的记录数会不断增大,合并所需占用的内存不断增加,从而导致OOM。
通过命令SHOW ENGINE INNODB STATUS可以看到类似如下的情况:
mysql >SHOW ENGINE INNODB STATUSG
......
---TRANSACTION 7629816744, ACTIVE 402 sec rollback
mysql tables in use 1, locked 1
ROLLING BACK 287907 lock struct(s), heap size 32514256, 59334816 row lock(s), undo log entries 33575312
MySQL thread id 3, OS thread handle 139678174787328, query id 0 Compressing gtid_executed table
......
mysql > SELECT COUNT(1)
-> FROM mysql.gtid_executedG
****** 1. row ******
COUNT(1): 59334816
1 row in set (19.97 sec)
可以发现ID为3的线程一直处于回滚状态,持有的记录锁近6000W。而从MySQL 5.5版本开始记录锁的内存从操作系统申请,而不再通过BP分配,所以当表gtid_executed不断增大时,最终会导致MySQL OOM。
另外一个异常状态是,虽然从机开启了只读选项,但线上的DML统计值依然非常大:
Number of rows inserted 5096110378, updated 120106820, deleted 71297166352, read 76453180531
将参数log_slave_updates设置为0,模拟原5.6的场景能否绕过这个bug呢?很可惜,依然不能。因为表gtid_executed虽然不再实时更新,然而每次二进制日志rotate时,依然会更新表gitd_executed。而这时GTID合并线程依然会被激活,只是OOM所需的时间可能会要更长。
MySQL 5.7.18虽然修复了这个bug,具体可查github提交,bug号:#84332。然而此修复却引入了新的bug,相信很多同学可能已经遇到过类似如下的问题:
The MySQL server is running with the --super-read-only option so it cannot execute this statement
所以如果想要彻底的解决上述问题,务必升级到MySQL 5.7.19。当然5.7.19版本还解决了并行复制可能导致主从数据不一致的bug。总之,尽快升级到最新的MySQL 5.7.22。为什么是5.7.22版本而不是19呢?因为MySQL团队继MGR后又放出了一个超大招,下篇文章姜老师将揭晓哦。
MySQL 5.7 GTID OOM bug案例分析 --大量压测后主从不同步的更多相关文章
- MySQL触发器的正确使用与案例分析
以下的文章主要向大家讲述的是MySQL触发器的实际使用详细说明与实际案例分析,同时本文也列举了一些在MySQL触发器的实际式操作中的代码,以下就是文章的详细内容介绍,望大家借鉴. 触发器案例 mysq ...
- MySQL服务器发生OOM的案例分析
[问题] 有一台MySQL5.6.21的服务器发生OOM,分析下来与多种因素有关 [分析过程] 1.服务器物理内存相对热点数据文件偏小,62G物理内存+8G的SWAP,数据文件大小约550G 触发OO ...
- 一个 redis 异常访问引发 oom 的案例分析
「推断的前提是以事实为依据.」 这两天碰到一个线上系统的偶尔出现突然堆内存暴涨,这倒不是个什么疑难杂症, 只是过程中有些思路觉得可以借鉴参考,故总结下并写下来. 现象 内存情况可以看看下面这张监控图. ...
- MySQL的索引单表优化案例分析
建表 建立本次优化案例中所需的数据库及数据表 CREATE DATABASE db0206; USE db0206; CREATE TABLE `db0206`.`article`( `id` INT ...
- MySQL排序原理与MySQL5.6案例分析【转】
本文来自:http://www.cnblogs.com/cchust/p/5304594.html,其中对于自己觉得是重点的加了标记,方便自己查阅.更多详细的说明可以看沃趣科技的文章说明. 前言 ...
- 一个bug案例分析
Bug描述: 某大型系统的一个提供基础数据服务的子系统A进行了一次升级.升级的内容为:优化了失败重传功能,在优化的同时,开发人员发现传输数据的时间戳精度只是精确到了秒,于是顺手把精度改成了1/100秒 ...
- MySQL实例crash的案例分析
[作者] 王栋:携程技术保障中心数据库专家,对数据库疑难问题的排查和数据库自动化智能化运维工具的开发有强烈的兴趣. [问题描述] 我们生产环境有一组集群的多台MySQL服务器(MySQL 5.6.21 ...
- (转)一个MySQL 5.7 分区表性能下降的案例分析
一个MySQL 5.7 分区表性能下降的案例分析 原文:http://www.talkwithtrend.com/Article/216803 前言 希望通过本文,使MySQL5.7.18的使用者知晓 ...
- 【MySQL】排序原理与案例分析
前言 排序是数据库中的一个基本功能,MySQL也不例外.用户通过Order by语句即能达到将指定的结果集排序的目的,其实不仅仅是Order by语句,Group by语句,Distinct语句都会隐 ...
随机推荐
- EXTI中断开关点亮LED源码
在KEY点亮LED源码的基础上 USER下新建EXIT文件夹,新建bsp_exit.c和bsp_exit.h,添加到工程中(魔术棒添加头文件所在文件夹) bsp_exit.h内容 #ifndef BS ...
- PyCryptodome安装使用方法
PyCryptodome是PyCrypto的一个分支.基于PyCrypto2.6.1,多了以下特性: Authenticated encryption modes (GCM, CCM, EAX, SI ...
- Redis键的基本操作
1.Redis键的键名查询 ·命令名称:KEYS ·语法:KEYS pattern ·Pattern的用法: ? 任意一个字符 * 任意个任意字符 [ae] a或者e [^ae] 除了a和e [a-c ...
- 西门子软件sinutrain-for-sinumerik-operate-v4.8安装报错的处理
西门子软件sinutrain-for-sinumerik-operate-v4.8安装报错的处理 安装时报错提示: 原因: 可能缺少某些文件 处理: 安装 海康ivms-4200后,可直接安装西 ...
- (四)Hibernate的增删改查操作(1)
Hiberntae的查找操作有多种: 1. 使用Criteria接口查询 Query_Criteria.java package action; import java.util.ArrayList ...
- 上传文件-layui+ashx
public void ProcessRequest (HttpContext context) { if (true) { context.Response.ContentType = " ...
- ASP.NET Core 入门(4)(IIS 部署前后端站点)
.NET Core发布部署的文章园内有很多了,大家可以自行百度,该篇主要想总结需要注意的地方,列举前后端(比如前段 Vue,后端 WebAPI)在同一台服务器上的主要两种方式. 两种方式: 1. 前后 ...
- VBA if语句
一个if语句由一个布尔表达式和一个或多个语句组成.如果条件被评估为True,则执行If条件块下的语句.如果条件被评估为False,则执行If循环块后面的语句. 语法 以下是VBScript中的If语句 ...
- JavaScript--Function对象(函数)的声明和作用域
Funtion 封装了可重复使用的代码块对象,函数名是一个引用函数对象的变量 声明提前:在程序开始执行之前,将var 变量和function函数提前声明 但赋值并不会提前 它的三种创建方法: 创建1 ...
- FlowPortal BPM 验证组的使用方法
1.在表单上指定验证组 2.在流程上指定验证组 3.启用多个验证组 流程审批线上设置验证组时可以设置多个验证组,多个验证组之间以分号分割,如:AAA;BBB.