MySQL是怎么保证持久性的(redo log日志相关)

Mysql中 事务的很多实现,都是因为有日志的支撑,比如binlog、undo log、redo log等 

MySQL是怎么保证持久性的

持久性是指,事务一旦提交,它对数据库的改变就应该是永久性的,接下来的其他操作或故障不能对其有影响。InnoDB 中主要是通过 redo log 来保证事务的持久性。

redo log(重做日志),记录的是事务提交时数据页的物理修改,作用是为了保障在进行脏页刷新时而出现错误所造成的持久性的问题!

redo log 是 InnoDB 独有的,记录的是某个数据页做了什么修改,每执行一个事务就会产生相应的 redo log。当事务提交时,只需将 redo log 持久化到磁盘即可,可以暂时不考虑将 Buffer Pool 里的脏页写回,而是在合适的时机交给后台线程去做。系统故障崩溃时,MySQL 也可以在重启之后利用 redo log 里的内容恢复数据。

其中还用到了 WAL 技术。

WAL(Write Ahead Logging-先写日志) 的关键点在于 MySQL 的写操作并不是立刻写到磁盘上,而是先写日志,然后在合适的时间再写到磁盘上。具体来说,当有一条记录需要更新时,InnoDB 引擎会先把物理修改记录写到redo log里【即在commit后会立即将redolog Buffer中redo log的日志信息刷新到磁盘中的redo log file(重做日志文件)中】,这个时候整个记录的更新就算完成了。后续,InnoDB 引擎会在适当的时候,由后台线程将缓存在 Buffer Pool 里的脏页刷新到磁盘里,这个时候往往也是系统空闲的时候,以减少对用户线程的影响。

有了 redo log,当系统崩溃时,即使脏页的数据还没来得及持久化,但 redo log 已经持久化了,MySQL 就可以根据 redo log 里记录的内容,将所有的数据恢复到最新状态,整个过程也就是常说的 crash-safe 能力。

redo log日志文件由两部分构成:

- 重做日志缓冲(redo log buffer)   ---存在内存中

- 重做日志文件(redo log file)     ---存在磁盘中

下面详细阐述一下该过程:

首先用户开启事务,进行一系列的DML(增、删、改)的操作。会先去看内存结构中的缓冲池(Buffer Pool)中是否有要操作的数据,如果有直接操作。

如果没有要先用后台线程将数据从磁盘中读取出来缓存到缓冲池(Buffer Pool)中,然后DML(更新或删除)操作的就是缓冲池中的数据。

操作完缓冲池中的数据后,会立即记录当前事务中的物理修改信息(数据页物理变化)到内存结构中的重做日志缓冲区Redolog Buffer中,

相关说明 :

  • MySQL的Buffer Pool是一个内存区域,用于缓存数据页,从而提高查询性能。读写过程涉及到数据的从磁盘到内存的读取,以及在内存中的修改和写回磁盘。
  • 操作完缓存池中的数据后,数据发生变更,但磁盘中的数据未变,这种数据叫做"脏页",后续需要后台线程找个时机刷新到磁盘中,完成数据的持久化

但是需要注意的是,脏页写回磁盘是由一个后台线程进行的,在MySQL服务器空闲或负载较低时,InnoDB会进行脏页刷盘,以减少对用户线程的影响,降低对性能的影响。

当事务commit提交后,不会立即将该操作后的"脏页"直接刷新到磁盘中,而是等待一定的频率统一将脏页刷新到磁盘中去,保证缓冲池中的数据和磁盘中数据的一致性。

有了redo log后,commit后虽然不会直接刷新到磁盘中,但是在内存结构中的Redolog Buffer会记录事务中的物理修改信息(即数据页变化),在commit后会立即将redolog Buffer中redo log的日志信息刷新到磁盘中的redo log file(重做日志文件)中,持久化的保存在磁盘文件中。

              

这样的话,在一段时间后,Buffer Pool里的脏页刷新到 磁盘的过程中,即使出错了,那么也可以通过磁盘中的redo log file日志文件来进行数据恢复,保证 数据的持久化!

  • 后来脏页中的数据页顺利刷新到磁盘当中后,那么磁盘中的redo log的一些记录信息就没用了。所以每隔一段时间,就会去清理redo log日志!
  • redo log日志文件中有两个文件,这两个文件是循环写的!循环写 就是日志的空间大小是固定的,写满 就需要先刷新脏页,然后继续从头写。

总结:redo log是为了保障在进行脏页刷新时而出现错误所造成的持久性的问题!

思考:

为什么用户commit后,不直接将缓冲池中修改的数据页(脏页)直接刷新回磁盘?

答: 直接将脏页刷新回磁盘,存在严重的性能问题。因为很多DML语句操作数据页的时候,都是随机的。直接操作磁盘,这属于大量的随机磁盘IO。

而commit的时候都是先将redo log日志文件刷新到磁盘中,是因为它是日志文件,日志文件都是追加的形式。这是一种顺序的磁盘IO。效率更高!这种机制叫做 WAL(writting - ahead - logging)

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

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

相关文章

大数据数据治理

大数据数据治理介绍 大数据数据治理是一个复杂的过程,涉及到数据的标准化、融通、关联、解析、聚合等一系列活动。其核心目标是在确保数据安全的基础上,提高大数据资源和资产的可用性、易用性和可靠性,从而显著提升大数据资源和资产的价值7。…

Ktor库的高级用法:代理服务器与JSON处理

在现代网络编程中,Ktor是一个高性能且易于使用的框架,它提供了对异步编程、WebSockets、HTTP客户端和服务器等特性的原生支持。Ktor是使用Kotlin语言编写的,充分利用了Kotlin的协程特性来简化异步编程。本文将深入探讨Ktor库的高级用法&#…

AlDente Pro for Mac(电池最大充电限制工具)v1.24激活版

AlDente Pro for Mac是一款运行在MacOS平台上专业的电池最大充电限制工具。通过 AlDente Pro 您可以设置电池的最大充电百分比设置为 20% 至 100%,然后,它将保持在所需的电池百分比,然后再次使用电源适配器进行充电。 …

安徽某高校数据挖掘作业4-5 (与一些碎碎念)

1. 编写程序求函数、、的极限。 解答: import sympy as sp# 定义符号变量 x x sp.symbols(x)# 定义函数 f1 sp.sin(20 * x) / x f2 (1 4 * x)**(2 / x) f3 (1 4 / x)**(2 * x)# 计算极限 limit1 sp.limit(f1, x, 0) limit2 sp.limit(f2, x, 0) limit3 sp…

跨域请求解决方法----不允许有多个 ‘Access-Control-Allow-Origin‘ CORS 头

后端配置了代码: spring:application:name: spzx-server-gatewaycloud:nacos:discovery:server-addr: localhost:8848gateway:discovery:locator:enabled: trueglobalcors:cors-configurations:[/**]:allowedOriginPatterns: "*"# 允许请求中携带的头信息…

连锁门面预付费电表管理系统

1.什么叫连锁门面预付费电表管理系统? 连锁门面预付费电表管理系统是一种前沿的电力管理解决方案,尤其适用于拥有众多分店的服务提供商。该系统容许用户使用电力以前预先支付花费,有效解决传统式后付模式的收支明细纠纷案件和扣费难题。 2.系统的核心…

非递归实现快排排序及归并排序(尾篇)

1.快速排序(双指针实现) 2.非递归实现快排 3.递归实现归并排序 4.非递归实现归并排序 5.总代码 1.快速排序(双指针实现) 俩有个指针一前一后的排放着,cur先走并且去找比kye对应值小的数组值,一旦找到后…

x86国产化麒麟系统上安装docker及问题解决

以前感觉安装docker没有问题,所以没有记录怎么安装的,最近在国产化系统上安装docker总是失败,经过仔细研究完全解决了该问题,特此记录。 参考链接: 在 OpenKylin 上安装 Docker 按照上面的链接可以知道整个docker安装…

EMC整改学习-笔记

EMC整改学习-笔记 来自赛盛技术的笔记 如果我拿到一个产品超标的一个频谱图的话,首先我们可以对比做一个分析。来确定你干扰源的一个分类和定义是哪些。是你这个产品类型,什么样的电路对应什么样的一个。从我们的一个大量的一个测试数据的经验来看&…

超全面,编程语言汇总,看看哪些语言适合GIS开发?

最近总有很多人关心GIS开发语言的问题,这个确实很重要,毕竟学习一门编程语言需要花费不少时间和精力,找不到合适GIS的编程语言意味着浪费时间。 首先我们来简单看一下常见的编程语言有哪些,后续再给大家介绍哪些语言适合GIS开发&a…

如何获知SylixOS某API调用方法?

问题背景 SylixOS从2006年韩总在大学时开始开发,到今年2024年已走过18个年头,这18年一直在不断迭代更新,也经过无数实际项目的考验,SylixOS无论从功能还是性能上看,都毫无疑问是世界一流的大型实时操作系统。 但实时…

AI大模型还没有到卷长文的时候

AI风口上,国内大模型技术突飞猛进,很多人都沉浸在用AI来辅助办公,辅助学习等等工具化应用落地,但也有趁着风口想大赚一笔,为了估值什么都敢说的。 前几天,Kimi对外宣称自己的技术狂飙到能读200万字甚至100…

标准发布 | 高氨氮废水厌氧氨氧化处理应用技术规范

高氨氮废水厌氧氨氧化处理应用技术规范 Technical specification for anammox treatment of high strength ammonia nitrogen wastewater 一、编制单位 本文件由中华环保联合会水环境治理专业委员会提出。 本文件由中华环保联合会归口。 本文件主编单位:北京城市…

SSRF思路及步骤

什么是SSRF? SERVER SIDE REQUEST FORGERY的简写 因为服务器本身提供了资源获取相关的服务,在资源地址能够被用户控制时,将可能导致攻击者利用服务器身份获取预期外的资源的后果 危害? 条件满足的情况下:突破网络防…

佛教祭拜小程序-寺庙小程序-纪念馆小程序

大家好,我是程序员小孟。 现在有很多的产品或者工具都开始信息话了,寺庙或者佛教也需要小程序吗? 当然了! 前面我们还开发了很多寺庙相关的小程序,都有相关的介绍: 1,优质的寺庙小程序-H5寺庙网页 今天…

机器学习多场景实战

机器学习已不再局限于理论探讨,而是广泛渗透到我们生活的方方面面,成为解决复杂问题、优化决策过程的强有力工具。从智能推荐系统个性化推送你可能喜爱的电影和商品,到金融风控领域精准识别欺诈交易;每一个应用场景都是机器学习技…

(学习笔记)数仓建模

数仓建模 OLAP数仓分层数据模型数据模型建设方法模型建设具体流程模型数据域事实表设计事实表拉链表 数据模型规范表命名(采用阿里one-data设计)字段命名(采用阿里one-data设计)数据模型标注规范 数据模型发展周期 OLAP OLTP:概念全称OnLine Transaction Processin…

实验七、创建小型实验拓扑《计算机网络》

早检到底是谁发明出来的。 一、实验目的 完成本实验后,您将能够: • 设计逻辑网络。 • 配置物理实验拓扑。 • 配置 LAN 逻辑拓扑。 • 验证 LAN 连通性。 二、实验任务 在本实验中,将要求您连接网络设备并配置主机实现基本的网络…

【YOLO系列】YOLOv10论文超详细解读(翻译 +学习笔记)

前言 研究AI的同学们面对的一个普遍痛点是,刚开始深入研究一项新技术,没等明白透彻,就又迎来了新的更新版本——就像我还在忙着逐行分析2月份发布的YOLOv9代码,5月底清华的大佬们就推出了全新的v10。。。 在繁忙之余&#xff0…

第101天:权限提升-Win 本地用户进程注入令牌窃取ATSCPS 服务命令

目录 思维导图 案例一: WIN-本地用户-AT&SC&PS 命令 AT命令 sc PS 案例二:WIN-本地用户-进程迁移注入获取 msf 案例三:WIN-本地&Web-令牌窃取&土豆溢出 令牌窃取 土豆溢出 案例四: uac原理与绕过 思维…