MySQL是怎么保证数据不丢的

news2024/10/7 12:25:15

一.什么是两阶段提交

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/1322.html

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

相关文章

【FLASH存储器系列二】非易失性存储器基本原理之EEPROM和FLASH

1 EEPROM 通过EPROM的原理分析我们知道,由于叠栅雪崩注入MOS晶体管(SAMOS)的结构特性(浮栅周围是二氧化硅的绝缘层),而且由于早期工艺的原因,这个二氧化硅层比较厚,势垒比较高&#…

HTTP协议

哈喽,友友你好呀~今天要给大家分享的是关于HTTP协议的相关知识点,这部分的知识在web开发中还是很重要的一部分知识,耐点心看完,肯定会有收获滴~~ 目录 1.什么是HTTP 2.HTTP协议工作过程 3.什么是抓包工具 4.HTTP协议格式 4.1 HTTP请求(Request) 4.2 HTTP响应(Response) …

基于javaweb的停车库管理系统(java+jsp+jquery+servlet+mysql)

基于javaweb的停车库管理系统(javajspjqueryservletmysql) 运行环境 Java≥8、MySQL≥5.7、Tomcat≥8 开发工具 eclipse/idea/myeclipse/sts等均可配置运行 适用 课程设计,大作业,毕业设计,项目练习,学习演示等 功能说明 基…

补环境:vm2 transformer.js 源码分析

在补环境框架的文件夹里执行 vm2 文件能成功得到结果,但是将合并了环境和原 js 文件后的代码内容单独提取出来通过 vm2 调用却报错提示 SyntaxError: Use of internal vm2 state variable: 通过 transformer.js 源码,分析 VM2_INTERNAL_STATE…

【韩顺平老师讲MySQL】函数和多表查询

文章目录P33.数学函数P34.日期函数P37.加密函数P38.流程控制函数P39.查询增强P40.分页查询P41.分组查询P42.多子句查询P43.多表查询笛卡尔积(重难点)P44.多表查询P45.自连接P46.多行子查询P33.数学函数 # 绝对值 SELECT ABS(-12) FROM DUAL;# 十进制转为二进制 SELECT BIN(10) …

【offer拿到手软系列】面试小贴士

​ 学习好一门语言贵在坚持——初识JavaScript🏹💁‍♂️! 首先: 博主是👦一个帅气的boy,你可以叫我山鱼君 🖱 ⌨个人主页:山鱼菌的个人主页 💖💖如果对你有帮…

vmlogin多登防关联浏览器中配置Geolocation定位插件的使用教程

Geolocation 接口是一个用来获取设备地理位置的可编程的对象,它可以让Web内容访问到设备的地理位置,这将允许Web应用基于用户的地理位置提供定制的信息。说实话:其实Geolocation 就是用来获取到当前设备的经纬度(位置)…

Zookeeper ---- Zookeeper集群操作

Zookeeper ---- Zookeeper集群操作1. 集群操作1. 集群规划2. 选举机制(面试重点)3. ZK集群启动停止脚本2. 客户端命令操作1. 命令行语法2. znode节点数据信息3. 节点类型(持久/短暂/有序号/无序号)4. 监听器原理5. 节点删除与查看…

2022年NPDP新版教材知识集锦--【第三章节】(1)

【新产品开发概论】 产品创新是“风险与回报”的过程 随着新产品的累积成本增加,产品的不确定性降低。成功率在很大程度上取决于企业采用的新产品开发实践和流程的质量。 【决策基本框架】 ⚫识别问题或机会 ⚫收集信息(信息来源:内部、外部、内外部…

iOS开发之Undefined symbol:_OBJC_CLASS_$_****

更新了Xcode14.0.1以后,项目突然曝出了此问题Undefined symbol:_OBJC_CLASS_$_****,因此记录一下,解决此问题的步骤: 第一步:首先在Build Phases中找到 Compile Sources,查看是否有对应的***.m文件&#x…

查找算法【二叉查找树】 - 二叉查找树的插入

查找算法【二叉查找树】 - 二叉查找树的插入 因为二叉查找树的中序遍历存在有序性,所以首先要查找待插入关键字的插入位置,当查找不成功时,再将待插入关键字作为新的叶子节点成为最后一个查找节点的左孩子或右孩子。 【算法步骤】 ① 若二…

vim编辑器使用和vim一键配置

1.vim的三种模式 开始之前,先简单说,vim并不是只有这三种模式。总的来说vim大概有12种模式,不同的版本可能也有一些具体的区别。今天我们先介绍三种常用的模式。 先用一张图来大概介绍三种模式之间的转换 命令模式(Normal mod…

强化学习算法实践(一)——策略梯度算法

文章目录Reference1. REINFORCE1.1 Basic1.2 Code2. Improvement Tips2.1 Assign Suitable Credit2.2 Add a Baseline2.3 Advantage Function3. Actor-Critic(A2C)3.1 Basic3.2 Code策略梯度是一种基于策略的算法,相比于DQN一类的基于价值的算法,它会直接…

C语言分支与循环--循环篇(图片,动画演示),彻底搞定C语言循环

前言 👻作者:龟龟不断向前 👻简介:宁愿做一只不停跑的慢乌龟,也不想当一只三分钟热度的兔子。 👻专栏:C初阶知识点 👻工具分享: 刷题: 牛客网 leetcode笔记软…

jupyter怎么换环境?

1.为什么要换环境而不用使用默认环境? 在这之前我只知道,要pip安装很多环境包,来在程序中调用使用,但是在不同的项目中,环境总是相互矛盾,总会出现诸多版本问题。所以需要每个项目对应一个环境。conda默认…

2022第二届中国高校大数据竞赛A题(实时更新)

题目 制造业是国民经济的主体,近十年来,嫦娥探月、祝融探火、北斗组网,一大批重大标志性创新成果引领中国制造业不断攀上新高度。作为制造业的核心,机械设备在工业生产的各个环节都扮演着不可或缺的重要角色。但是,在…

【FTP工具】FileZila安装以及使用详解

一、FTP概念 安装FTP主要是为了传输文件,FTP是持久的,只有一次认证过程,传输多个文件都是使用同一个连接。因为FTP就是为远程文件交互而设计的,有些时候只是为了单纯做一个文件传输,往往搭建FTP服务更省时和节约成本。…

【每日刷题】之【Z字形变换】

✨✨hello,愿意点进来的小伙伴们,你们好呐! 🐻🐻系列专栏:【力扣刷题篇】 🐲🐲本篇内容: 每日刷题 🐯🐯作者简介:一名现大二的三非编程小白&#…

BI设计上篇 - 像设计师一样思考

形式服从功能。这句产品设计的箴言也适用于数据可视化。就数据可视化的形式和功能而言,我们首先考虑的是我们希望受众能用数据做什么(功能),然后才是用可视化(形式)来简化这个过程。在本文中,我…

总结flutter玩转之-安卓view 承载flutter 的页面

1.假设你已经熟悉flutter 开发熟悉dart 语言 android 原生开发技能 一、在安卓原生项目添加代码 1.创建示例布局 <?xml version"1.0" encoding"utf-8"?> <LinearLayout xmlns:android"http://schemas.android.com/apk/res/android"…