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语句都会隐 ...
随机推荐
- python学习-44 程序的解耦 (不是特别懂的,回头在复习)
import os def file_handler(backend_data,res=None,type='fetch'): # 查询功能 if type == 'fetch': with open ...
- S03_CH11_基于TCP的QSPI Flash bin文件网络烧写
S03_CH11_基于TCP的QSPI Flash bin文件网络烧写 11.1概述 针对ZYNQ中使用QSPI BOOT的应用,将BOOT.bin文件烧写至QSPI Flash基本都是通过USB C ...
- Luogu5327 ZJOI2019语言(树上差分+线段树合并)
暴力树剖做法显然,即使做到两个log也不那么优美. 考虑避免树剖做到一个log.那么容易想到树上差分,也即要对每个点统计所有经过他的路径产生的总贡献(显然就是所有这些路径端点所构成的斯坦纳树大小),并 ...
- MySQL5.7主从从配置
主从从,也称为级联主从,数据流向:A(主)->B(从)->C(从从),主从从级联复制. 应用场景 在主从配置的基础上,再增加一个从库,进一步提高数据安全,容灾备份. 读写分离,从库只用于查 ...
- SpringFramework5.0 @Indexed注解 简单解析
目录 使用场景 使用方法 原理说明 使用需注意点 案例说明 参考资料 纸上得来终觉浅 绝知此事要躬行 -陆游 最近在看SpringBoot核编程思想(核心篇),看到走向注解驱动编程这章,里面有讲解到: ...
- 每次开机都要按F1的解决办法
买了个新的硬盘来装电脑,装操作系统时到微软官网下载了WIN10放在U盘里制作成系统安装盘,具体操作自己百度.装好了之后发现每次开机都要按一下F1,百度了很多都没用, 一次偶然的机会,我拆开了电脑主机硬 ...
- 安装Nvida 显示环境
查看是否能正确加载nvidia 驱动 在终端输入 (glxinfo 需要安装mesa-utils) 如果可以正确加载了nvidia驱动 那么在输入的内容中可以看到NVIDIA 字样 如果GPU是Int ...
- vue之生命周期与导航守卫
组件钩子函数: beforeCreate.created.beforeMount.mounted.beforeUpdate.updated.beforeDestroy.destoryed 还有两个特殊 ...
- C++线程同步之原子操作
所谓的原子操作就是指一个线程对于某一个资源做操作的时候能够保证没有其它的线程能够对此资源进行访问. 原子操作仅仅能够解决某一个变量的问题,只能使得一个整型数据做简单算术运算的时候是原子的. 以下案例需 ...
- 为什么需要 RPC 服务?
链接:https://www.jianshu.com/p/362880b635f0 在传统的开发模式中,我们通常将系统的各个服务部署在单台机器,随着服务的扩展,这种方式已经完全无法满足系统大规模的扩展 ...