Loading [MathJax]/jax/output/CommonHTML/config.js
前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >深入理解MySQL 5.7 GTID系列(九):实际案例一

深入理解MySQL 5.7 GTID系列(九):实际案例一

作者头像
田帅萌
发布于 2018-09-14 10:55:35
发布于 2018-09-14 10:55:35
78100
代码可运行
举报
文章被收录于专栏:「3306 Pai」社区「3306 Pai」社区
运行总次数:0
代码可运行

导 读

作者:高鹏(重庆八怪) 原文地址: https://www.jianshu.com/p/2c25842d58d3 深入理解MySQL 5.7 GTID系列文章共十篇,本文为第四篇,点击查看: 第一篇:深入理解MySQL 5.7 GTID系列(一) 第二篇:深入理解MySQL 5.7 GTID系列(二):GTID相关内部数据结构 第三篇:深入理解MySQL 5.7 GTID系列(三):GTID的生成时机 第四篇: 深入理解MySQL 5.7 GTID系列(四):mysql.gtid_executed&PREVIOUS GTID EVENT 第五篇:深入理解MySQL 5.7 GTID系列(五) gtid_executed&gtid_purged什么时候更新 第六篇:深入理解MySQL 5.7 GTID系列(六):MySQL启动初始化GTID模块 第七篇:深入理解MySQL 5.7 GTID系列(七)binlog_gtid_simple_recovery参数的影响总结 第八篇:深入理解MySQL 5.7 GTID系列(八):GTID带来的运维改变 该系列文章将陆续不定期更新~

本案例是一个朋友的案例,他也做过分享:

https://mp.weixin.qq.com/s/XSnFkuYzIlGWMaXIl-oPeQ

一、触发条件

  • binlog_gtid_simple_recovery=false。
  • 5.7.6以上版本。
  • GTID 关闭或者GTID中途开启有大量的未开启GTID的BINLOG。

二、本案例回顾

  • 版本:MySQL版本 5.7.19。
  • 故障为:大概每半小时发生一次故障,整个MySQL压力巨大,很多简单的操作都相应缓慢。使用iotop,top等工具都发现MySQL某个线程有大量的I/O。
  • 分析方法:使用strace发现有大量的BINLOG文件读取。
  • binlog_gtid_simple_recovery=false。
  • GTID关闭,中途开启,但是留下了很多未开启GTID的BINLOG。
  • 数据库没有重启,但是由于expire_logs_days触发了BINLOG删除。

三、故障分析

其实本案例就是前文第七部分总结中的:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
Gtid关闭,simple_recovery=flase
5.7.6以上:这种方式一定得到正确的Gtid集合
重启Mysql不扫秒全部的binlog,如果是中途打开GTID重启任然需要扫描多个binlog因为需要找到Gtid event。
purge binlog或者超过参数expire_logs_days参数设置不触发全binlog扫描,如果是中途打开GTID重启
仍然需要扫描多个binlog因为需要找到Gtid event。

从案例中我们得知是中途开启的GTID,但是留下了很多未开启GTID的BINLOG,从第六部分源码bool MYSQL_BIN_LOG::init_gtid_sets()函数的分析,我们知道删除BINLOG后也会触发正向查找来获取gtid_purged(Gtid_state.lost_gtids)。当读取到第一个BINLOG的时候虽然获取到了PREVIOUS GTID EVENT但是没有GTID EVENT,而simple_recovery=flase所以需要继续查找下一个文件,直到找到同时包含PREVIOUS GTID EVENT和GTID EVENT的 那个BINLOG才会停止,那么显然这种情况下那些GTID关闭的时候生成的BINLOG将会全部扫描一遍,如果量大那么代价将是巨大的。 而案例中每半个小时会触发一次BINLOG切换,因为触发超过expire_logs_days参数设置导致BINLOG进行删除,触发了大量的BINLOG扫描。 显然有了前面的基础这个案例很容易分析。

四、案例模拟

这个案例非常好模拟。我打算直接使用strace查看。因为不是每位朋友都能方便使用GDB调试。 使用测试版本社区版本5.7.17:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
+---------------+-----------+
| Log_name      | File_size |
+---------------+-----------+
| binlog.000027 |       198 |
| binlog.000028 |       198 |
| binlog.000029 |       198 |
| binlog.000030 |       198 |
| binlog.000031 |       198 |
| binlog.000032 |       198 |
| binlog.000033 |       198 |
| binlog.000034 |       198 |
| binlog.000035 |       198 |
| binlog.000036 |       198 |
| binlog.000037 |       198 |
| binlog.000038 |       198 |
| binlog.000039 |       198 |
| binlog.000040 |       198 |
| binlog.000041 |       198 |
| binlog.000042 |       198 |
| binlog.000043 |       154 |
+---------------+-----------+

mysql> show variables like '%gtid%';
+----------------------------------+-----------+
| Variable_name                    | Value     |
+----------------------------------+-----------+
| binlog_gtid_simple_recovery      | OFF       |
| enforce_gtid_consistency         | ON        |
| gtid_executed_compression_period | 1000      |
| gtid_mode                        | OFF       |
| gtid_next                        | AUTOMATIC |
| gtid_owned                       |           |
| gtid_purged                      |           |
| session_track_gtids              | OFF       |
+----------------------------------+-----------+
8 rows in set (0.02 sec)
mysql> show variables like '%expir%';
+--------------------------------+-------+
| Variable_name                  | Value |
+--------------------------------+-------+
| disconnect_on_expired_password | ON    |
| expire_logs_days               | 1     |
+--------------------------------+-------+
2 rows in set (0.06 sec)

然后我修改了系统时间同时MySQL开启GTID:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
[root@test1 ~]# date -s '2017-12-13 10:10:10'
Wed Dec 13 10:10:10 CST 2017
mysql> set global gtid_mode=1;
Query OK, 0 rows affected (0.02 sec)

mysql> set global gtid_mode=2;
Query OK, 0 rows affected (0.01 sec)

mysql> set global gtid_mode=3;
Query OK, 0 rows affected (0.02 sec)

mysql> show variables like '%gtid_mode%';
+---------------+-------+
| Variable_name | Value |
+---------------+-------+
| gtid_mode     | ON    |
+---------------+-------+
1 row in set (0.02 sec)

到一步我们已经达到了触发的标准,只要手动触发一次flush binary logs,让BINLOG刷新就会看到。当然线上是BINLOG满了做的切换。 这个时候开始做strace,并且做flush binary logs ,我们观察到:

受限篇幅我这里删除了一些。我们看到很多read/lseek系统调用正是读取BINLOG的证据。 至此整个案例模拟完成。

五、总结

前文已经描述过在5.7.6以上binlog_gtid_simple_recovery应该设置为true,这样可以避免可能的大量的BINLOG的扫描。具体分析可以参考第七节和从第六部分源码bool MYSQL_BIN_LOG::init_gtid_sets()函数的分析。

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2018-04-13,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 3306pai 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
深入理解MySQL 5.7 GTID系列(九):实际案例一
从案例中我们得知是中途开启的GTID,但是留下了很多未开启GTID的BINLOG,从第六部分源码bool MYSQL_BIN_LOG::init_gtid_sets()函数的分析,我们知道删除BINLOG后也会触发正向查找来获取gtid_purged(Gtid_state.lost_gtids)。当读取到第一个BINLOG的时候虽然获取到了PREVIOUS GTID EVENT但是没有GTID EVENT,而simple_recovery=flase所以需要继续查找下一个文件,直到找到同时包含PREVIOUS GTID EVENT和GTID EVENT的 那个BINLOG才会停止,那么显然这种情况下那些GTID关闭的时候生成的BINLOG将会全部扫描一遍,如果量大那么代价将是巨大的。 而案例中每半个小时会触发一次BINLOG切换,因为触发超过expire_logs_days参数设置导致BINLOG进行删除,触发了大量的BINLOG扫描。 显然有了前面的基础这个案例很容易分析。
wubx
2019/02/27
6360
深入理解MySQL 5.7 GTID系列(九):实际案例一
深入理解 MySQL 5.7 GTID系列(七): binlog_gtid_simple_recovery 参数的影响总结
默认值就是最合理的设置。 因为参数名更改了所以下面统称simple_recovery来代替。
wubx
2019/02/27
1.6K0
深入理解MySQL 5.7 GTID系列(十):实际案例二
本案例是我真实遇到过的一个坑,也在前文中不止一次地提到,当时也是非常纳闷,其实知道原因后只能说为什么会这么坑。
田帅萌
2018/09/14
8510
深入理解MySQL 5.7 GTID系列(十):实际案例二
深入理解 MySQL 5.7 GTID 系列(六):MySQL 启动初始化 GTID 模块
本节也是一个重头戏,后面的故障案例也和本节有关。本节将详细介绍Gtid模块的初始化,以及什么时候读取了我们前文提及的两个GTID持久化介质:
wubx
2019/02/27
1.2K0
深入理解MySQL 5.7 GTID系列(四):mysql.gtid_executed&PREVIOUS GTID EVENT
之所以把MySQL.GTID_EXECUTED表的作用和PREVIOUS GTID EVENT的改变放到一起进行描述是因为它们后面文章探讨的基础。这部分使用到了我自己使用C语言写的原生BINLOG解析工具INFOBIN。 百度云盘下载如下:http://pan.baidu.com/s/1jHIWUN0
wubx
2019/04/24
7550
MySQL传统点位复制在线转为GTID模式复制
MySQL传统点位复制在5.7版本前是主要的主从复制模式,而随着MySQL5.6版本引入GTID,并且MySQL5.7进行各方面的优化以后,在mySQL5.7(尤其是MySQL5.7.6)版本后GTID模式的主从复制方式成为一个新的选择方式。要使用GTID模式,首先也需知其优缺点,其主要的优缺点如下:
俊才
2019/11/18
2K0
MySQL传统点位复制在线转为GTID模式复制
深入理解MySQL 5.7 GTID系列(一)
MySQL GTID特性是5.6加入的一个强大的特性,它的目的在于使用GTID的MySQL能够在整个复制环境中能够自动地切换,而不像以前需要指定文件和位置,这也一定是未来发展的方向,我们熟知的MGR也是基于GTID的,所以了解GTID的原理也是必要的。
用户1278550
2020/12/15
7860
深入理解MySQL 5.7 GTID系列(一)
深入理解MySQL 5.7 GTID系列(八):GTID带来的运维改变
依托前文的解析来讲5.7中 GTID带来的运维改变,我想理解应该是更加深刻,这节主要讨论以下几个部分:
wubx
2019/02/27
3.3K0
深入理解MySQL 5.7 GTID系列(八):GTID带来的运维改变
深入理解MySQL 5.7 GTID系列(四): PREVIOUS GTID EVENT
之所以把MySQL.GTID_EXECUTED表的作用和PREVIOUS GTID EVENT的改变放到一起进行描述是因为它们后面文章探讨的基础。这部分使用到了我自己使用C语言写的原生BINLOG解析工具INFOBIN。 百度云盘下载如下:http://pan.baidu.com/s/1jHIWUN0
wubx
2019/02/27
1.9K0
一个线上GTID搭建主从复制的问题
今天上午,我给一台单实例节点成功挂载了一个NFS备份机,挂载完成之后,尝试给这个单实例节点利用xtrabackup的方式搭建一套主从环境,在搭建的过程中出现了一点儿问题,这里记录下来,以供日后回溯。
AsiaYe
2019/11/06
9650
关于 MySQL GTID 复制
MySQL5.7以后都基本用GTID方式复制了,相对于binlog和position号方式,在failover时候减少很多人工切换操作
星哥玩云
2022/08/18
4430
mysql 5.7主从安装和配置
本文主要介绍mysql 5.7主从复制,转载请注明出处 下载地址 模块 版本 下载地址 mysql 5.7 https://dev.mysql.com/downloads/mysql/ libaio(可选) 0.3.110 http://ftp.altlinux.org/pub/distributions/ALTLinux/Sisyphus/x86_64/RPMS.classic//libaio-0.3.110-alt1.1.x86_64.rpm net-tools(可选) 2.0.22 htt
程序员同行者
2018/07/02
1.9K0
MYSQL数据同步之基于GTID事务数据同步
本文通过Docker以及mysql5.7 镜像进行基于GTID数据复制的同步实践。
公众号: 云原生生态圈
2020/09/21
5.1K0
MYSQL数据同步之基于GTID事务数据同步
MySQL主从复制---偏移量改为GTID
今天上午,做了一个比较有意思的操作,之前一直没有做过,就是把一套比较老的主从复制环境从基于偏移量的复制方式改为了基于GTID的复制方式,这里记录一下过程,如果大家有这方面的需求,可以参考一下:
AsiaYe
2019/11/06
3.6K0
传统复制在线变更为GTID复制
1.在所有数据库上执行SET @@GLOBAL.ENFORCE_GTID_CONSISTENCY = WARN;
wangwei-dba
2021/06/17
3650
MySQL 基于GTID主从复制
一、基于GTID的主从复制# 1.什么是GTID Copy 1.全局事务标识符 2.组成:UUID + TID f03a53e0-cd46-11ea-a2c4-000c292c767e:1 2.GTID主从复制的优点 Copy 1.GTID同步时开启多个SQL线程,每一个库同步时开启一个线程,由原本的串行sql线程变成并行开启多个sql线程,加快读取中继日志速度。 2.binlog在rows模式下,binlog内容比寻常的主从更加简洁 3.GTID主从复制会记录主从信息,不需要手动配置bi
Linux运维技术之路
2022/06/07
3890
深入理解 MySQL 5.7 GTID 系列(十):实际案例二
本案列我测试过4个版本: percona Mysql 5.7.14 官方社区 Mysql 5.7.17 percona Mysql 5.7.19 percona Mysql 5.7.15 其中percona Mysql 5.7.14和官方社区 Mysql 5.7.17有这个问题。其他版本未知
wubx
2019/02/27
9220
深入理解 MySQL 5.7 GTID 系列(十):实际案例二
深入理解MySQL 5.7 GTID系列(五) gtid_executed&gtid_purged什么时候更新
本节将集中讨论下面三种GTID更新的时机,这部分相当重要,后面的故障案列会和这节有关。下面先来看一下他们的定义:
wubx
2019/02/27
1.3K0
MySQL 5.7基于GTID及多线程主从复制
MySQL主从同步是在MySQL主从复制(Master-Slave Replication)基础上实现的,通过设置在Master MySQL上的binlog(使其处于打开状态),Slave MySQL上通过一个I/O线程从Master MySQL上读取binlog,然后传输到Slave MySQL的中继日志中,然后Slave MySQL的SQL线程从中继日志中读取中继日志,然后应用到Slave MySQL的数据库中。这样实现了主从数据同步功能。
小小科
2020/06/23
2.5K0
MySQL 8 复制(五)——配置GTID复制
上篇解释了许多GTID的原理,以及在MySQL复制中所起的作用,并且进行了很多实验加以辅助说明。本篇演示如何从头开始一步步配置GTID复制。实验环境同https://wxy0327.blog.csdn.net/article/details/90081518#%E4%BA%8C%E3%80%81%E5%A4%8D%E5%88%B6%E5%AE%9E%E9%AA%8C%E7%8E%AF%E5%A2%83。这里只讨论在联机情况下进行配置,因为相对于空库或脱机等理想情况,联机配置复制的需求更为典型和常见。
用户1148526
2019/07/02
4.6K0
MySQL 8 复制(五)——配置GTID复制
推荐阅读
相关推荐
深入理解MySQL 5.7 GTID系列(九):实际案例一
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
本文部分代码块支持一键运行,欢迎体验
本文部分代码块支持一键运行,欢迎体验