转载自: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案例分析 --大量压测后主从不同步的更多相关文章

  1. MySQL触发器的正确使用与案例分析

    以下的文章主要向大家讲述的是MySQL触发器的实际使用详细说明与实际案例分析,同时本文也列举了一些在MySQL触发器的实际式操作中的代码,以下就是文章的详细内容介绍,望大家借鉴. 触发器案例 mysq ...

  2. MySQL服务器发生OOM的案例分析

    [问题] 有一台MySQL5.6.21的服务器发生OOM,分析下来与多种因素有关 [分析过程] 1.服务器物理内存相对热点数据文件偏小,62G物理内存+8G的SWAP,数据文件大小约550G 触发OO ...

  3. 一个 redis 异常访问引发 oom 的案例分析

    「推断的前提是以事实为依据.」 这两天碰到一个线上系统的偶尔出现突然堆内存暴涨,这倒不是个什么疑难杂症, 只是过程中有些思路觉得可以借鉴参考,故总结下并写下来. 现象 内存情况可以看看下面这张监控图. ...

  4. MySQL的索引单表优化案例分析

    建表 建立本次优化案例中所需的数据库及数据表 CREATE DATABASE db0206; USE db0206; CREATE TABLE `db0206`.`article`( `id` INT ...

  5. MySQL排序原理与MySQL5.6案例分析【转】

    本文来自:http://www.cnblogs.com/cchust/p/5304594.html,其中对于自己觉得是重点的加了标记,方便自己查阅.更多详细的说明可以看沃趣科技的文章说明. 前言    ...

  6. 一个bug案例分析

    Bug描述: 某大型系统的一个提供基础数据服务的子系统A进行了一次升级.升级的内容为:优化了失败重传功能,在优化的同时,开发人员发现传输数据的时间戳精度只是精确到了秒,于是顺手把精度改成了1/100秒 ...

  7. MySQL实例crash的案例分析

    [作者] 王栋:携程技术保障中心数据库专家,对数据库疑难问题的排查和数据库自动化智能化运维工具的开发有强烈的兴趣. [问题描述] 我们生产环境有一组集群的多台MySQL服务器(MySQL 5.6.21 ...

  8. (转)一个MySQL 5.7 分区表性能下降的案例分析

    一个MySQL 5.7 分区表性能下降的案例分析 原文:http://www.talkwithtrend.com/Article/216803 前言 希望通过本文,使MySQL5.7.18的使用者知晓 ...

  9. 【MySQL】排序原理与案例分析

    前言 排序是数据库中的一个基本功能,MySQL也不例外.用户通过Order by语句即能达到将指定的结果集排序的目的,其实不仅仅是Order by语句,Group by语句,Distinct语句都会隐 ...

随机推荐

  1. WUSTOJ 1287: B304(Java:355ms,C:8ms)

    题目:

  2. qt聊天室bug-- error: no matching function for call to 'Ui::Widget::setupUi(Widget*)' ui->setupUi(this); ^

  3. QMap里面的值任然是一个QMap,在做循环插入的时候需要记得清空。

    这个问题是我以前的一个问题,当时由于有其他的事情去处理就忘记了,前段时间我的项目要进行集成测试了,为了避免这个缺陷,只能再把这个问题想起来了,再进行解决.有很多问题你觉得不应该发生,其实很多时候都是逻 ...

  4. C# 延迟初始化 Lazy<T>

    概念:延时初始化重点是延时,用时加载,意思是对象在使用的时候创建而不是在实例化的的时候才创建.   延时加载主要应用的场景: 数据层(ADO.NET或Entity Framework等ORM,Java ...

  5. centOS 7单机安装 kong

    kong 网关 单机部署 环境:centOS 7:依赖:jdk1.8 安装内容:postgresql数据库, kong 网关,nodeJs和npm,kong Dashboard (可视化管理界面) 版 ...

  6. 简单SQL注入试探、二

    DVWA——简单SQL注入小记 今天我们来记录简单的盲注过程 简单的SQL injection(blind) Level:low 登陆后选择SQL Injection(Blind) 能看到这样的界面 ...

  7. jvm系列(七):jvm调优

    转自:https://www.cnblogs.com/ityouknow/p/6437037.html 16年的时候花了一些时间整理了一些关于jvm的介绍文章,到现在回顾起来还是一些还没有补充全面,其 ...

  8. laravel 的安装与配置

    1.工作环境 php 7.0+ .MySQL5.1+ 这里可以用开发环境包一键安装: 自己用的是wamp(windows)http://www.wampserver.com/en/ linux系统和m ...

  9. HashMap、HashTable差异详解

    HashMap和HashTable有什么不同?在面试和被面试的过程中,我问过也被问过这个问题,也见过了不少回答,今天决定写一写自己心目中的理想答案. 代码版本 JDK每一版本都在改进.本文讨论的Has ...

  10. ubuntu 14.04 登录 界面 root

    打开终端. sudo gedit /usr/share/lightdm/lightdm.conf.d/50-ubuntu.conf 在弹出的编辑框里输入:greeter-show-manual-log ...