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进行数据分析 第4章 NumPy基础-数组与向量化计算(3)
4.2 通用函数:快速的元素级数组函数 通用函数(即ufunc)是一种对ndarray中的数据执行元素级运算的函数. 1)一元(unary)ufunc,如,sqrt和exp函数 2)二元(unary) ...
- 1187: 零起点学算法94——今年暑假不AC(Java)
1187:零起点学算法94--今年暑假不AC Time Limit: 1 Sec Memory Limit: 32 MB 64bit IO Format: %lld Description " ...
- GPIO 输出—使用固件库点亮 LED
编程要点 1. 使能 GPIO 端口时钟: 2. 初始化 GPIO 目标引脚为推挽输出模式: 3. 编写简单测试程序,控制 GPIO 引脚输出高.低电平. LED的电路图 过程: 1.拷贝一个库函 ...
- SAS学习笔记32 select语句
- Centos7安装gitlab11 学习笔记之备份恢复及邮箱配置
一.备份 修改配置文件 vim /etc/gitlab/gitlab.rb 默认路径为 # gitlab_rails['backup_path'] = "/var/opt/gitlab/ba ...
- SQL优化中的重要概念:事务
原文:SQL优化中的重要概念:事务 sql 优化和事务有关系? 从表面上看,让sql跑的更快,似乎和事务这个概念没什么联系,但是关系数据库中最重要的2个概念就是 关系.事务. 关系,对应到sql中,是 ...
- c#获取本月有哪些周六、周日
最近项目中有用到本月所有的周六,周日,特此分享一下! 算法思路:写一个循环,条件为本月开始日期.本月截至日期,通过循环获取第一个周六,加一天就是周日,每增加六天就是下一个周六,依次类推,循环到月末 代 ...
- 华为Python面试题
最近在网上偶然看到此题: 有两个序列a,b,大小都为n,序列元素的值任意整形数,无序: 要求:通过交换a,b中的元素,使[序列a元素的和]与[序列b元素的和]之间的差最小 经过一番思索,我试着用穷举法 ...
- Lua table直接索引VS缓存索引性能测试小示例
local p = {} p.t = {} p.t.p = {} p.t.p.t = {} p.t.p.t.p = {} p.t.p.t.p.t = {} p.t.p.t.p.t.p = {} p.t ...
- React/动态绑定class
第一种 字符串拼接 <i className={["iconfont"+" "+item.icon]} ></i> 第二种 有判断条件的 ...