MYSQL 主从不一致的原因分析

数据库作为存储数据的组件,数据的一致性一定是要保证的前提,今天给出两个场景来分析数据不一致的原因。

binlog同步模式导致主从不一致

在MYSQL 中主库向从库同步数据是利用binlog记录修改操作,然后将binlog传递给从库进行复制,binlog的格式有3种,

row 在对update,delete,insert语句进行记录时会进行修改的行数据进行记录。row格式的坏处在于比较占用空间,比如更新十万行数据,那么row格式将会把10万数据记录下来。

statement 只会将原始的sql语句记录下来。但是这种格式可能会引起主备不一致。

mixed 是前面两种格式的混合,MYSQL会自己去判断这条sql是不是会造成主备不一致,将引起主备不一致的sql记录成row格式。

statement 为什么会主备不一致?

举一个例子来说明下,statement主备不一致的原因,例如下面的sql

update navigation.t_account set id = uuid();

当你使用 类似uuid或者now这种动态函数时,那么在主库的生成结果将会和从库不同。造成数据的主备不一致。

为什么大多数时候我们还是用row

大多时候,我们还是用row 格式写入binlog,这样带来的好处是便于恢复数据,下面我举例说明下,

  • 当你执行错delete语句,能够通过binlog日志找到删除行的所有字段信息,不过需要注意的是,需要将binlog_row_image 参数设置为FULL,才会记录所有字段信息,如果设置为MINIMAL 则只会记录删除字段信息。
  • 当你执行错update语句,通过binlog记录的修改前后的整行数据,对数据进行恢复。
  • 当你执行错insert语句,能够通过binlog找到插入数据的id,对错误插入的数据进行删除。

所以,为了避免主从不一致,还是选用row 格式记录binblog吧,或者至少还是选用mixed

主备切换导致主从不一致

第二种主从不一致的场景是发生在主备切换时,我先直接说下结论,主备切换方式其实分可靠性优先方式与可用性优先方式。

可靠性优先方式,MYSQL服务可能会存在短暂的不可提供服务的时间段,可用性优先则是保证MYSQL在切换过程中都是可用的。

为了方便,下面我将主主数据库称为master,从数据库称为slave。

可靠性优先方式

1,判断slave是否已经 seconds_behind_master,是否小于5s或更短,seconds_behind_master 代表主从同步延迟的时间,如果小于5s,则继续下一步。

2,修改master的readonly 参数为true, 将master变为只读状态。

3,判断slave的主从同步延迟是否变为0,即seconds_behind_master 等于0,等于0后,继续下一步。

4,修改 slave的 readonly参数改为false,将slave变为可读可写状态。

5,将业务请求转发到slave,原先master,修改为新master的从库。

这个切换过程,数据库是有一段时间不可写的,必须等待slave主从延迟同步变为0以后才行,所以这也是为什么要在seconds_behind_master 在一个较小的值才开始进行主备切换的原因。

可用性优先方式

接着看下保证可用性优先的主备切换方式,在上述主备切换步骤中,我们去掉第三个步骤,也就是不等到主从同步完成就去切换主备。

现在假设现在的binlog为 row格式。表定义为

mysql> CREATE TABLE `t` ( `id` int(11) unsigned NOT NULL AUTO_INCREMENT, `c` int(11) unsigned DEFAULT NULL, PRIMARY KEY (`id`)) ENGINE=InnoDB;insert into t(c) values(1),(2),(3);

业务此时进行插入操作,

insert into t(c) values(4);
insert into t(c) values(5);

当在执行完第一个sql时,进行主备切换,且假设此时备库并没有完成第一条sql的同步。如下图所示,在插入4这条数据时,将slave改为可写,接着业务系统后续的写就往slave写入了5这条数据。注意此时master的4这条数据还没有同步到slave。

image.png

接着开始准备更改主备关系,如下图所示,更改关系前,有可能slave才会进行来自master的4这条数据的写入,但是因为slave中已经有id为4的数据了,所以会导致插入失败。

image.png
修改slave为master后,插入到之前从库的(4,5)这条数据 会同步到新的slave主机(即旧master),但是这个时候也会因为旧master有id为4的这条数据导致同步失败。主备同步就会自动停止。

可以看到,最后主从数据库中有id等于4这条数据不一样。

所以,可用性优先的主备切换方式是有可能导致主备不一致的。

数据库最重要还是数据的正确性,拿许多业务场景来说,如果数据错乱了,是较难恢复的,但是如果业务失败了,还可以通过重试重新填充数据,怕就怕成功一半,失败一半。所以主备切换的时候尽量还是可靠性优先方式比较好。

最后,

自荐一波✅:

欢迎朋友们关注我的公众号📢📢:【蓝胖子的编程梦】!

学习容器知识🐳,性能监控🚀,Golang🐋 相关编程知识

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/535624.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

独家原创!微电网OR综合能源系统用户用电行为分析程序代码!

适用平台:MatlabYalmipCplex 程序以含分布式新能源、储能、微型燃气轮机作为主要电力来源,以照明设备、电视、洗衣机和空调等主要家庭用电设备作为电负荷,仿真了3种典型家庭用户的用电行为。程序算例丰富、注释清晰、干货满满,可…

(done) NLP “bag-of-words“ 方法 (带有二元分类和多元分类两个例子)词袋模型、BoW

一个视频:https://www.bilibili.com/video/BV1mb4y1y7EB/?spm_id_from333.337.search-card.all.click&vd_source7a1a0bc74158c6993c7355c5490fc600 这里有个视频,讲解得更加生动形象一些 总得来说,词袋模型(Bow, bag-of-words) 是最简…

如果 “ 2X ”的补码是“ 90H ”,那么 X 的真值是( )(超级详细百分白听懂)

如果 “ 2X ”的补码是“ 90H ”,那么 X 的真值是( )。 A、72 B、-56 C、56 D、111 答案:B 答案解析:

《vtk9 book》 官方web版 第3章 - 计算机图形基础 (5 / 5)

vtkProp的组件和其他类型 通常希望将演员收集到一个依赖于变换的层次结构中。例如,一个机器人手臂可以由刚性连接的链接表示,这些链接在肩关节、上臂、肘部、下臂、腕关节和手部等关节处连接在一起。在这种配置中,当肩关节旋转时,…

苍穹外卖学习-----2024/03/010---redis,店铺营业状态设置

1.Redis入门 2.在Java中操作Redis 3.店铺营业状态设置 BUG!!! 今天在启动项目时,用到了Redis缓存数据库,但是却出现了报错信息: ERR Client sent AUTH, but no password is set。Caused by: io.lettuce.core.RedisCommandExecutionException…

接口测试开始前做什么?这10步缺一不可!

在进行接口测试之前,测试工程师需要进行一系列的准备工作,以确保测试的顺利进行。以下是接口测试开始之前的准备工作,并附有示例说明: 1. 了解项目和接口文档: 在开始测试之前,测试工程师需要仔细阅读项目…

每日OJ题_牛客_杨辉三角的变形(IO型OJ)

目录 牛客_杨辉三角的变形 解析代码 牛客_杨辉三角的变形 杨辉三角的变形_牛客题霸_牛客网 解析代码 这题通过的代码首找规律的代码:(在下面还贴了普通思路,但超过内存限制的代码) 观察分析如果n % 2 1则该行的第一个偶数的位…

【海贼王的数据航海】排序——概念|直接插入排序|希尔排序

目录 1 -> 排序的概念及其运用 1.1 -> 排序的概念 1.2 -> 常见的排序算法 2 -> 插入排序 2.1 -> 基本思想 2.2 -> 直接插入排序 2.2.1 -> 代码实现 2.3 -> 希尔排序(缩小增量排序) 2.3.1 -> 代码实现 1 -> 排序的概念及其运用 1.1 -&g…

cmake初识

cmake 什么是软件构建和编译工具cmake安装cmakewindowsLinux 通过cmake编译代码准备CMakeLists.txt注释块状注释cmake_minimum_required:确定cmake的最低版本project:定义工程名称:add_executable:定义工程会生成一个可执行程序准备生成可执行…

力扣串题:验证回文串

笔者的代码与大佬的代码思路相同,但存在一个问题就是将字符串存到另一个数组中,存在strlen与sizeof,\0,进制转换等多种问题,判断也会出现部分问题,所以,尽量在原字符串上操作 bool isAlphanume…

Volatile与JMM

被Volatile修饰的变量有两大特点 可见性 有序性(禁重排) 如何保证的?内存屏障 Volatile的内存语义 当写一个Volatile变量的时候,JMM会把该线程对应的本地内存共享变量值立即刷新回主内存。 当读一个Volatile变量的时候&…

五子棋小游戏(sut实验报告)

实验目的 实现人与人或人与电脑进行五子棋对弈 实验内容 启动游戏,显示游戏参数设置界面,用户输入参数后进入游戏界面,显示棋盘及双方博弈过程,游戏过程中可选择退出游戏。判定一方获胜后结束本局游戏,可选择继续下…