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)

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

VR 软件对工业设计有哪些好处

虚拟现实(VR)技术自其诞生以来,确实为多个行业带来了革命性的变革,特别是在工业设计、教育培训和制造业等领域。以下是对VR技术在这些领域中应用的进一步分析: 1. 增强设计过程 VR技术的引入使得工业设计过程变得更加直…

电子凭证3.0,助力企业实现报销自动化

在数字化浪潮汹涌澎湃的今天,企业对于高效、便捷、安全的财务管理需求日益凸显。传统的报销流程繁琐、耗时,不仅增加了企业的运营成本,还影响了员工的工作效率和满意度。用友BIP电子凭证3.0的发布,无疑为企业实现报销自动化提供了…

【网络安全技术】——期末复习(冲刺篇)

📖 前言:快考试了,做篇期末总结,都是重点与必考点。 题型:材料分析题、简答题、看图分析题 课本: 目录 🕒 1. 计算机网络安全概述🕘 1.1 安全目标🕘 1.2 常见的网络安全…

OS复习笔记ch7-2

页式管理 学过计组的同学都了解一点页式管理,就是将内存划分成较小的、大小固定的、等大的块。现在OS引入了进程的概念,那么为了匹配内存的分块,同样把进程也划分成同样大小的块。 这里区分两个概念 The chunks of a process are called p…

MFC 教程-回车时窗口退出问题

【问题描述】 MFC窗口默认时,按回车窗口会退出 【原因分析】 默认调用OnOK() 【解决办法】 重写虚函PreTranslateMessage BOOL CTESTMFCDlg::PreTranslateMessage(MSG* pMsg) {// TODO: 在此添加专用代码和/或调用基类// 修改回车键的操作反应 if (pMsg->…

Coolmuster iOS 数据擦除:隐私保护的终极方案

手机和平板电脑是我们不可或缺的伙伴,它们存储着我们的照片、联系人、私人消息以及工作文件。然而,当这些设备需要更换或者出售时,如何确保存储在其中的数据不被他人恢复和滥用,成为了一个严峻的问题。Coolmuster iOS 数据擦除&am…

MP-SPDZ的学习与运用

目录 MP-SPDZ 的介绍主要功能典型应用场景 MP-SPDZ 的安装实验环境准备环境安装MP-SPDZ 下载和编译 MP-SPDZ 的使用测试程序第三方求和三方计算测试冒泡排序比较运算函数语法详解——Sint语法详解——Array基于AES电路实现OPRFORAM隐私集合求交实现两台虚拟机之间进行MPC简单实…

(一文读懂)大模型到底是怎么生成文字的?

前言 在人工智能的领域,大模型在去年已经成为了一个热门的话题。 各大厂商如谷歌、微软、OpenAI等,都在积极研发和应用大模型技术。 这些模型在语言理解、图像识别、推荐系统等方面都表现出了惊人的能力,甚至在某些任务上,已经…

响应式网站设计:为何成为首选及其优点

随着近 35 亿万人使用不同的设备访问互联网,响应性网站的设计变得越来越重要。大多数网站的宽度 720 到 1,000 像素间。假如网站访问者的显示器设置为 800 像素或更大且页面宽度超过 720 像素,那么必须向右滚动屏幕来显示所有的信息。目前的问题是不清楚…

Java(十)——内部类

文章目录 内部类静态内部类实例内部类匿名内部类局部内部类 内部类 Java内部类是一种特殊的类定义方式,它允许在一个类的内部定义另一个类。 内部类可以访问其所在外部类的成员变量和成员方法,这使得它非常适用于封装与外部类紧密相关的私有逻辑。 内…

深入理解API:数据的桥梁与门户

API(应用程序编程接口)在现代软件开发和数据处理中扮演着至关重要的角色。它不仅是数据交换的桥梁,更是不同系统、平台和应用程序之间的门户。深入理解API的功能、原理和应用,对于开发者、企业和数据科学家来说都是至关重要的。 A…

【python深度学习】——torch.einsum|torch.bmm

【python深度学习】——torch.einsum|torch.bmm 1. 基本用法与示例2. torch.bmm 1. 基本用法与示例 基本用法: torch.einsum(equation, *operands)equation: 一个字符串,定义了张量操作的模式。 使用逗号来分隔输入张量的索引,然后是一个箭头&#xff…

8259A芯片

目录 硬件结构 引脚图 引脚功能 内部结构 连接微处理器 芯片编程 相关硬件 工作流程 初始化命令字编程 操作命令字编程 相关硬件 工作方式 硬件结构 引脚图 多个芯片可通过接入IR7引脚实现级联。 引脚功能 INT引脚会接入CPU的INTR引脚(可屏蔽引脚) 1.处于非缓冲方式…

基于阿里云服务网格流量泳道的全链路流量管理(三):无侵入式的宽松模式泳道

作者:尹航 在前文《基于阿里云服务网格流量泳道的全链路流量管理(一):严格模式流量泳道》、《基于阿里云服务网格流量泳道的全链路流量管理(二):宽松模式流量泳道》中,我们介绍了流…

FastDFS分布式文件系统

一、概述 FastDFS是一款由国人余庆开发的轻量级开源分布式文件系统,它对文件进行管理,功能包括:文件存储、文件同步、文件访问(文件上传、文件下载)等,主要解决大容量文件存储和高并发访问问题&#xff0c…

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

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

文献解读-肿瘤测序-第五期|《局部晚期或转移性儿童及青少年分化型甲状腺癌的基因特征与临床特征及131I疗效的关系》

关键词:应用遗传流行病学;群体测序;肿瘤测序; 文献简介 标题(英文):The relationship between genetic characteristics and clinical characteristics and the efficacy of 131I therapy in c…

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

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

Doris Connector 结合 Flink CDC 实现 MySQL 分库分表

1. 概述 在实际业务系统中为了解决单表数据量大带来的各种问题,我们通常采用分库分表的方式对库表进行拆分,以达到提高系统的吞吐量。 但是这样给后面数据分析带来了麻烦,这个时候我们通常试将业务数据库的分库分表同步到数据仓库时&#x…

如何让委外加工管理更轻松?

中小制造企业,受制于场地、资金、环保、质量、交期等等因素影响,在生产制造过程中,多数会将一些生产工序或者在制品外发给其他制造工厂进行委外加工生产。随着各地监管部门对环境、能耗管控力度的加大,这种情况在机加工行业尤为突…