MySQL是怎么保证数据不丢失的

news2024/12/23 10:39:20

一.什么是两阶段提交

1.SQL语句(update user set name=‘李四’ where id=3)的执行流程是怎样的呢?
在这里插入图片描述

1.执行器先找引擎取 ID=3这一行。ID 是主键,引擎直接用树搜索找到这一行。
2.如果 ID=3 这一行所在的数据页本来就在内存中,就直接返回给执行器;否则,需要先从磁盘读入内存,然后再返回。
3.执行器拿到引擎给的行数据,把name这个值改成李四 得到新的一行数据,再调用引擎接口写入这行新数据。
4.引擎将这行新数据更新到内存中,同时将这个更新操作记录到 redo log 里面,此时 redo log 处于 prepare 状态。然后告知执行器执行完成了,随时可以提交事务。
5.执行器生成这个操作的 binlog,并把 binlog 写入磁盘。
6.执行器调用引擎的提交事务接口,引擎把刚刚写入的 redo log 改成提交(commit)状态,更新完成。

2.redo log 和 binlog有什么不同?

1.redo log 是物理日志,记录的是“在某个数据页上做了什么修改”;
2.binlog 是逻辑日志,记录的是这个语句的原始逻辑,比如“给 ID=3 这一行的 name 字段改成李四 ”。

3.为什么必须有“两阶段提交”呢?

这是为了让两份日志之间的逻辑一致。所以只要 redo log 和 binlog 持久化到磁盘,即使 MySQL 异常,重启后数据依然可以恢复。

二:binlog是怎么写入的

1.binlog是怎么进行写入的呢?

1.事务执行过程中先把日志写到binlog cache 中,
2.吧日志写入到文件系统的 page cache中
3. 事务提交时,将 binlog cache 写入 binlog 文件

2.什么是binlog cache?

在执行事务过程中系统为每个线程分配了一片binlog cache内存。参数binlog_cache_size控制单个线程内binlog cache大小。如果超过这个大小就要暂存到磁盘,类似于先写入临时文件,在写入磁盘。

在这里插入图片描述
如上图所示,可以看到,每个线程有自己的 binlog cache,但是共用同一份 binlog 文件。

3.图中的 write,指的就是指把日志写入到文件系统的 page cache,并没有把数据持久化到磁盘,所以速度比较快。

page cache:是OS关于磁盘IO的缓存,位于内核中,不适用于大文件传输,因为大文件传输page cache的命中率比较低,这个时候page cache不仅没有起到作用还增加了一次数据从磁盘buffer到内核page cache的开销

4.图中的 fsync,才是将数据持久化到磁盘的操作。一般情况下,我们认为 fsync 才占磁盘的 IOPS。

也可以理解为,write是写入内存,而fsync才是写磁盘。

5.bin log有哪些写盘策略?
通过控制参数sync_binlog来进行控制

  1. sync_binlog=0 的时候,表示每次提交事务都只 write,不 fsync;
  2. sync_binlog=1 的时候,表示每次提交事务都会执行 fsync;(一般设置为1);
  3. sync_binlog=N(N>1) 的时候,表示每次提交事务都 write,但累积 N 个事务后才 fsync;

如果参数是0,MySQL发生异常重启会丢失内存里的bin log
如果参数是N,MySQL发生异常重启会丢失内存里的最近N个事务的bin log

三:redlog的是怎么写入的

写盘执行流程
其实redlog和binlog写盘机制都差不多,都是先写内存在写磁盘。

  1. 先写入 redo log buffer
  2. 吧 redo log buffer 写入 page cache中
  3. 持久化 到磁盘当中

1.什么是redo log buffer?

redo log buffer是一块内存,事务执行过程中会多次写入buffer,等到事务commit的时候才会写入redo log中

2.redo log buffer和binlog cache都是临时内存有什么不同

1.binlog cache是每一个线程都共有的,而redo log buffer是多个线程公用的。
2.binlog存储是以statement或者row格式存储的,
3.redo log是以page页格式存储的

3.red log有哪些写盘策略?
通过控制参数innodb_flush_log_at_trx_commit来进行控制

  1. 设置为 0 的时候,表示每次事务提交时都只是把 redo log 留在 redo log buffer 中;
  2. 设置为 1 的时候,表示每次事务提交时都将 redo log 直接持久化到磁盘;
  3. 设置为 2 的时候,表示每次事务提交时都只是把 redo log 写到 page cache;

4.redo log buffer什么时候 write?

1.InnoDB 有一个后台线程,每隔1秒,就会把 redo log buffer中的日志,调用 write 写到 page cache,然后 fsync 持久化到磁盘。
需要注意的是,事务执行中的 redo log 也是存在于 redo log buffer 的,也会被一起持久化到磁盘。(也就是说,一个还没有提交事务的 redo log,也可能已经被持久化到磁盘了)

2.一种是,redo log buffer 占用的空间即将达到 innodb_log_buffer_size 一半的时候,后台线程会主动写入 page cache。

5.写入 page cache后什么时候fsync?

1.当我们innodb_flush_log_at_trx_commit设置为1时,假设一个事务 A 执行到一半,已经写了一些 redo log 到 buffer 中,这时候有另外一个线程的事务 B 提交,那么按照这个参数的逻辑,事务 B 要把 redo log buffer 里的日志全部持久化到磁盘。这时候,就会带上事务 A 在 redo log buffer 里的日志一起持久化到磁盘。
2.事务提交时

四:组提交(group commit)

为什么要组提交?
简单来说其实组提交顾名思义就是是多个事务成为一’组’,一起刷盘,减少磁盘IO。
详细可以参考这篇文档 组提交的好处

在这里插入图片描述
上图就是MySQL没有优化前的提交方式。

  1. .先写入 redo log buffer
  2. 吧 redo log buffer 写入 page cache中
  3. 持久化 到磁盘当中,red log处于perpare阶段
  4. 事务执行过程中先把日志写到binlog cache 中,
  5. 把日志写入到文件系统的 page cache中
  6. 事务提交时,将 binlog cache 写入 binlog 文件
    在这里插入图片描述
    上图就是MySQL优化后的提交方式。
    1 .先写入 redo log buffer
    2.吧 redo log buffer 写入 page cache中
    3.事务执行过程中先把日志写到binlog cache 中,
    4.持久化 到磁盘当中,red log处于perpare阶段
    5 把日志写入到文件系统的 page cache中
    6.事务提交时,将 binlog cache 写入 binlog 文件

优化了哪里?
将red log持久化到磁盘当中的时间往后移了,这样组提交时可以提交组员会更多,组员越多节约磁盘 IOPS 的效果越好。

五.什么是双 ‘1’ 配置,配置后数据就不丢失吗?

只有在 sync_binlog 和 innodb_flush_log_at_trx_commit 都等于1的情况下,才能保证数据不丢失。

写 redo log 时,每次事务提交时,都将所有redo log fsync到磁盘

写 binlog 时,每次事务提交时,binlog 都会执行 fsync到磁盘。

数据丢失情况分析
在这里插入图片描述

情况一:redolog在prepare阶段持久化到磁盘(可能失败)也就是上图步骤3失败
mysql异常重启,redo log没有fsync,内存丢失,直接回滚,这种情况是不影响数据一致性

情况二:紧接着binlog持久化(可能失败)也就是上图步骤4失败
redolog fsync成功,但是binlog写入错误,此时mysql异常重启,现在有redolog的磁盘数据没有binlog的数据,此时检测redolog处于prepare阶段,但是没有binlog,回滚(虽然刚刚redolog fsync了但是不影响数据一致性,因为redolog的操作并没有写入mysql,也永远不会写入mysql)— 不懂的可以去看看我的MySQL刷脏页专栏,什么时候red log会进行刷盘

情况三:binlog完整但未commit 也就是上图步骤5失败
此时检测redolog处于prepare阶段,且binlog完整但未提交,默认添加commit标记,进而提交,写入mysql,满足数据一致性; 情况四:binlog完整且提交,写入musql,满足一致性;

情况四:binlog完整且提交,也就是图6步骤执行完成
写入musql,满足一致性;

至此MySQL的bin log和red log的两阶段提交,可以完整的保证我们数据一致性,从而保证数据不丢失。

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Android 开发学习(三)

文章目录1. ListView 的 使用2. RecyclerView 的 使用 (推荐)3. 动画3.1 逐帧动画3.2 补间动画3.2.1 补间动画 之 alpha透明度3.2.2 补间动画 之 rotate旋转3.2.3 补间动画 之 scale(缩放)3.2.3 补间动画 之 translate(平移)3.3 属性动画4. 单位 和 尺寸5. ViewPager 的使用6. …

程序员最浪漫的表白方式,将情书写在她的照片里,Python简直太厉害啦~

人生苦短,我用Python序言实现步骤1、准备工作2、Pillow 介绍3、实战演练序言 这不光棍节快到了,表弟准备写一封情书给他的女神,想在光棍节之前脱单。 为了提高成功率,于是跑来找我给他参谋参谋,本来我是不想理他的&am…

无刷电机控制基础(3)——FOC矢量控制入门

本节我们讲一些无刷电机FOC矢量控制的入门知识。 1)FOC矢量控制的作用 我们前两节讲的无刷电机(BLDC),是最简单的结构,当转子匀速转动时,定子内产生的反电动势是梯形波;在驱动无刷电机转动时&a…

【大二Web课程设计】基于HTML+CSS技术制作抗疫感动专题网页设计

🎉精彩专栏推荐 💭文末获取联系 ✍️ 作者简介: 一个热爱把逻辑思维转变为代码的技术博主 💂 作者主页: 【主页——🚀获取更多优质源码】 🎓 web前端期末大作业: 【📚毕设项目精品实战案例 (10…

Vue2 带纵向合并的原生表格实现切割侧栏分页

文章目录前言一、目标效果二、失败方案三、正确方案四、解决正确方案中的一个Bug总结前言 前端表格分页. 带纵向合并的表格, 到达固定行数强制分页, 截断本页纵向合并, 在下页展示该纵向列的剩余部分, 代码多为前端数据处理, 所以仅提供思路. 这并不难, 你可以直接看第三节. 一…

嵌入式系统-开关机测试笔记

在嵌入式系统中,产品在出厂前需要对开发板的开关机进行测试,用于验证产品在大量次数的开关机过程中是否出现异常.实现方法如下: 1.电源准备 我们不可能完全人工操作,太耽误时间和效率.在这里我选用了一款稳压源GW INSTEK GPD 3303这款产品支持串口编程控制,花了一些时间编写了…

智能车图像处理去畸变+逆透视教程

逆透视请参考:智能车逆透视教程(含上位机、源码)_LoseHu的博客-CSDN博客 去畸变请参考:智能车去畸变教程(含上位机、源码)_LoseHu的博客-CSDN博客 逆透视去畸变:如下 1.简介 在前两个博文中已经分别说明了单独去畸变、逆透视的方法。为了同…

web前端进阶之一些动画

1.字体图标的基本使用 首先下载iconfont文件夹&#xff0c;用link标签引入&#xff0c;使用如下&#xff1a; <i class"iconfont icon-favorites-fill green"></i> //改样式的话使用iconfont或者使用 .green(自己设置的类名) .iconfont {font-size: 60…

React.memo 和 useMemo 的使用

文章の目录问题背景useMemo 进行优化React.memo 进行优化props的值是基本类型props的值是引用类型写在最后问题背景 大家在使用 React 框架进行开发时一定遇到过以下问题&#xff1a; 当函数式组件中的某一状态改变&#xff0c;整个组件刷新&#xff0c;重新渲染在类组件中 s…

解决虚拟机下 “Linux和Windows之间复制粘贴” 的问题

大家在安装完虚拟机后&#xff0c;其实很多东西都还是要跟Windows打交道的&#xff0c;比如像Linux下某个软件的环境配置&#xff0c;你在Linux下遇到种种问题&#xff0c;这时你已习惯回到Windows下&#xff0c;默默的打开了“一亿名程序员都在用的CSDN平台”&#xff0c;找到…

腾讯疯狂招人,肝完自动化测试这关,20k+妥了

前言 对于程序员来说&#xff0c;BAT 为首的一线互联网公司肯定是自己的心仪对象&#xff0c;毕竟能到这些大厂工作&#xff0c;不仅薪资高待遇好&#xff0c;而且能力技术都能够得到提升&#xff0c;最关键的是还能够给自己镀上一层金&#xff0c;让人瞻仰。 最近很多同行群…

测试开发工程师到底是做什么的?

&#x1f680; 优质资源分享 &#x1f680; 学习路线指引&#xff08;点击解锁&#xff09;知识定位人群定位&#x1f9e1; Python实战微信订餐小程序 &#x1f9e1;进阶级本课程是python flask微信小程序的完美结合&#xff0c;从项目搭建到腾讯云部署上线&#xff0c;打造一…

本地电脑搭建SFTP服务器,并实现公网访问

1. 搭建SFTP服务器 1.1 下载 freesshd 服务器软件 下载地址&#xff1a;freeSSHd and freeFTPd image_1gbuejept12741719ta61ubn8ej9.png-63.1kB 选择freeFTPD.exe下载 下载后&#xff0c;点击安装 image_1gbueks891c258ee2o315kmf9m.png-57.7kB 安装之后&#xff0c;它会提…

Reactor反应器模式

单线程Reactor反应器模式 在事件驱动模式中&#xff0c;当有事件触发时&#xff0c;事件源会将事件dispatch分发到handler处理器进行事件处理。反应器模式中的反应器角色&#xff0c;类似于事件驱动模式中的dispatcher事件分发器角色。 在反应器模式中&#xff0c;有Reactor反…

企业进行高质量数据管理,实施数据治理的关键是什么?

随着数据通过各种方式创造了巨大价值&#xff0c;各领域的企业开始不断挖掘数据的作用&#xff0c;数据的重要性得到了社会各界的共同认可。像我们熟知的数据治理、数据管理、数据标准以及数据资产都是因为数据地位不断提升&#xff0c;企业开始重视起数据全生命周期流程&#…

SpringBoot笔记(一)核心内容

官网&#xff1a;https://spring.io/projects/spring-boot Spring Boot可以轻松创建独立的、基于Spring的生产级应用程序&#xff0c;它可以让你“运行即可”。大多数Spring Boot应用程序只需要少量的Spring配置。 SpringBoot功能&#xff1a; 创建独立的Spring应用程序直接嵌…

2022.11.1 固体物理

Drude Model 原子由原子核和核外电子组成 我们首先看一下不同材料的自由电子密度 知道原子数目基本就知道了核外电子的数目 如果是单位体积内的&#xff0c;知道密度&#xff0c;我们就可以知道质量&#xff0c;根据摩尔质量和阿伏伽德罗常数&#xff0c;我们就可以知道原子…

网络层——IP协议

网络层 网络层概述 网络层主要考虑数据传输的路上问题&#xff0c;在复杂的网络环境中确定一个合适的路径。 网络层设计要尽量简单&#xff0c;向上层只提供简单灵活的、无连接的、不保证可靠性的数据报服务。网络层不提供服务质量的承诺&#xff01; IP 数据报的格式 如何分…

计算机网络---第四章网络层---ipv4---选择题

9# 1IPV4在第一个4B&#xff0c;5678位。当它为0101时&#xff0c;表示首部长度为5420B&#xff0c;这也是最常见的。当它为1111时&#xff0c;表示首部长度为15460B&#xff0c;此时加上了可选字段40B 2协议字段在第三个4B的9到16位&#xff0c;表示IP的上层协议&#xff0c;…

聚观早报 | 吉利汽车拟将极氪独立上市;比亚迪斥资近50亿元造船

今日要闻&#xff1a;吉利汽车拟将极氪独立上市&#xff1b;比亚迪斥资近50亿元造船&#xff1b;华硕开设首个AI智能工厂&#xff1b;升级款Mac将于明年3月推出&#xff1b;世界互联网大会将于11月9日举行吉利汽车拟将极氪独立上市 10 月 31 日消息&#xff0c;吉利汽车午间在港…