Mysql的事务日志

news2024/12/23 15:08:30

Mysql的事务具有四个特性:原子性、一致性、隔离性、持久性。那么事务的四种特性分别是靠什么机制实现的呢?

  • 事务的隔离性由锁机制来保证

  • 事务的原子性、一致性、持久性则由redo log和Undo log来保证。
    - redo log是重做日志,提供再写入操作,恢复提交事务修改的页操纵,用来保证事务的持久性。
    - undo log是回滚日志,回滚记录到某个特定的版本,保证事务的原子性和一致性。

  • redo log:是存储引擎(innodb)生成的日志,记录的是物理级别上的页修改操作,比如页号XXX、偏移量yyy写入了‘zzz’数据。主要是为了保证数据的可靠性。

  • undo log:是存储引擎(innodb)生成的日志,记录的是逻辑操作日志。比如对某一行进行了insert语句操作,那么undo log就会记录与之相反的delete操作。主要用于事务的回滚(undo log记录的是每个修改操作的逆操作)和一致性非锁定读(undo log回滚记录到某个特定的版本—MVCC,多版本并发控制)。

1. redo log

InnoDB引擎是以为基本单位来管理存储空间的。在真正访问页面之前,需要把磁盘上的页读取到内存的buffer pool中之后才能访问数据。所有的更新都必须先更新buffer pool中的数据,buffer pool中被更新过的页被称之为脏页(dirty page),然后buffer pool中的脏页会以一定的频率被刷到磁盘中(check point机制),通过缓冲池(buffer pool)来优化cpu和磁盘之间的速度鸿沟,保证整体的性能不会下降太快。

1.1 为什么需要redo日志?

一方面,缓冲池可以帮助我们消除cpu和磁盘之间的鸿沟,checkpoint机制可以保证数据的最终落盘。然后由于checkpoint不是每次变更都触发的,而是由master线程隔一段时间去同步的。所以最坏的情况是,数据更新到了缓冲池,但是还未来得及刷盘到磁盘中,数据库服务器就宕机了,那么这段数据就是丢失的,无法恢复了。
另一方面,事务包含持久性的特性,就是说对于一个已经提交的事务,即使事务提交后数据库发生崩溃,这个事务对于数据所做的更改也需要保持下来。
redo log就是为了解决这种场景,具体操作就是在内存中修改数据的时候,把这些操作也用日志的形式记录下来。比如某个事物的操作是将系统表空间中第10页中偏移量为100的数据的值由2改为1,那么在修改内存记录的时候,也会在redo log中记录:将系统表空间中第10页中偏移量为100的数据的值由2改为1。
InnoDB引擎采用WAL(write-ahead logging)技术,这种技术的思想就是先写日志再写磁盘,只有日志写入成功,才算事务提交成功。当发生数据库宕机,且存在buffer pool中的某个页数据已经修改,但是未来得及刷盘时,可以通过redo log来完成数据的恢复。通过这来保证事务ACID的D(持久性),这就是redo log的作用。

1.2 redo log的好处、特点

1.好处

  • redo log降低了刷盘频率
  • redo log占用的空间非常小:存储表空间id,页号,偏移量以及需要更新的值,所需的存储空间是很小的,刷盘快。

2.特点

  • redo log是顺序写入磁盘的:在执行事务的过程中,每执行一条语句,就可能产生若干条redo log,这些redo log是按产生的顺序写入磁盘的,也就是顺序IO,速度比较快。
  • 事务执行过中,redo log不断记录:redo log和bin log的区别是,redo log是存储引擎层产生的,而bin log是数据库产生的。假设一个事物对某张表做10w行的记录插入,在这个过程中,会不断地往redo log进行顺序记录,而bin log不会记录,直到事务提交,才会一次性写入bin log文件中。

1.3 redo log的组成

redo log可以简单的划分为两部分:

  • 重做日志的缓冲(redo log buffer),保存在内存中,是易失的。在服务器启动的时候,就会向操作系统申请一大片被称为redo log buffer的连续内存空间,翻译成中文就是redo日志缓冲区。这片内存空间被划分成若干个连续的redo log block,一个redo log block占512字节大小。
    在这里插入图片描述
    redo log buffer大小默认16M。
    在这里插入图片描述
    重做日志文件(redo log file)保存在磁盘中,是持久的。

1.4 redo log的整体流程

在这里插入图片描述
1.先将要修改的数据行所在的数据页读取到内存中并修改内存中的数据页中的对应记录
2.在redo log buffer中新增对应的redo log,其中redo log记录的是对应表空间的对应页的指定偏移量的数据修改后的值
3.在事务commit的时候,将redo log buffer中新增的redo log以顺序IO的方式追加到磁盘的redo log file中
4.将buffer pool的脏页数据刷回磁盘

1.5 redo log的刷盘策略

redo log的写入并不是直接写入到磁盘的,而是先写到内存中的redo log buffer,然后一定的频率刷到磁盘的redo log file中。这个频率就是redo log的刷盘策略。
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

1.6 写入redo log buffer的过程

补充概念:Mini-transaction,简称mtr。比如向某个索引的B+树插入一条记录的过程就是一个Mini-transaction。一个所谓的mtr可能包括一组redo log日志,在进行崩溃恢复时,一组redo log作为不可分割的一部分。
一个事物可能包含若干个SQL语句,每个SQL语句其实是由若干个mtr组成,每一个mtr又可以包含若干个redo log日志。
在这里插入图片描述

1.6.1 redo log写入log buffer

向log buffer中写入redo log是顺序的,也就是先往前面的block中写,当该block写完后,再往后面的block写,InnoDB维护了一个buf_free变量,其中记录当下应该写入redo log的位置。
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

2.Undo log

redo log是事务持久性的保证,Undo log则是事务原子性的保证。在事务中更新数据的前置操作其实是先写入对应的undo log。

2.1 如何理解undo log

事务的原子性就是一组操作要么全部成功,要么全部失败。但是事务有时候会遇到一些情况导致一组操作中部分操作成功就中断了。遇到这种情况就需要将数据恢复到修改之前的状态,这就称之为回滚。
每当我们需要对一条记录进行改动(此处的改动包括 insert/update/delete)的时候,都需要留一手,记录改动之前的状态。比如:

  • 当你插入一条记录的时候,就需要把这条记录的主键值记录下来,回滚的时候根据主键删除这条记录就行了。(每个insert在undo log会记录对应的delete)
  • 当你删除一条记录的时候,就需要把这条记录的信息完整记录下来,回滚的时候再把这条记录进行插入就行了。(每个delete在undo log会记录对应的insert)
  • 当你update一条记录的时候,也会把update之前的旧值记录下来,回滚的时候再把对应的值改为旧值就行了。(每个update会在undo log记录一个相反的update)

MySQL将这些为了回滚需要而记录的日志称之为undo log。因为select不会产生数据修改,所以select不会产生undo log。

2.2 Undo log的作用

  • 作用1:回滚数据
  • 作用2:MVCC

2.3 Undo log的存储结构

2.3.1 回滚段与undo页

InnoDB对于undo log采用回滚段的的方式进行管理,每个回滚段记录了1024个undo log segment,而在每个undo log segment中进行undo页的申请。

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

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

相关文章

docker-compose安装nacos和msql

docker-compose安装nacos和msql 前言前提已经安装docker-compose,如果没有安装,则可以查看上面系列文章中的安装教程。并且文章中使用的是mobaxterm连接虚拟机。 1、下载2、创建并运行 前言 前提已经安装docker-compose,如果没有安装&#x…

BugKu-Web-Flask_FileUpload(模板注入与文件上传)

Flask Flask是一个使用Python编写的轻量级Web应用框架。它是一个微型框架,因为它的核心非常简单,但可以通过扩展来增加其他功能。Flask的核心组件包括Werkzeug,一个WSGI工具箱,以及Jinja2,一个模板引擎。 Flask使用BSD…

Windows提权方法

简介 内网提权,本意为通过某些服务的漏洞,从而获取到该服务器的shell,进而内网渗透,最终从普通用户变成超级管理员的一个过程 以下是一些常见的内网提权原理和方法: 横向移动:攻击者通过在内网中的一台受感…

fuxploide,一款针对文件上传的Fuzz检测工具

fuxploide,一款针对文件上传的Fuzz检测工具 1.工具概述2.安装3.参数解析4.使用案例1.工具概述 Fuxploider 是一种开源渗透测试工具,可自动检测和利用文件上传表单缺陷。该工具能够检测允许上传的文件类型,并能够检测哪种技术最适合在所需的 Web 服务器上上传 Web Shell 或任…

【同步FIFO_2023.12.13】

同步fifo,写时钟和读时钟为同一个时钟,用于交互数据缓冲 fifo的深度:同一块数据内存的大小 reg [2:0] Mem [8];//宽度3,深度8典型同步fifo的三部分 fifo写控制逻辑:写地址、写有效信号,fifo写满、写错等状…

Linux中的权限问题【详解】

shell命令以及运行原理 Windows以图形化界面为主要交互方式,简单高效,易于日常使用。Linux以命令行界面为主要交互方式,操作相较windows,mac来说比较困难一些,但linux也有向着图形化界面努力的桌面系统,例…

遥感深度学习:如何读取TIFF文件和切片成256*256?

博客已同步微信公众号:GIS不要炒茄子 01 前言 最近打算认真从头开始学习深度学习和遥感结合的相关内容,主要通过Python进行处理。此前用深度学习进行遥感相关的学习一直都是用 tensorflow3.0 框架,但是考虑很多因素我后面打算换用 Pytorch…

JetBrains2023年度报告,编程领域的风向标

前言 JetBrains是一家位于捷克的软件开发公司,有很多知名的开发IDE都是他们家的,比如IntelliJ IDEA、CLion、PyCharm、WebStorm等等,还有Kotlin编程语言也是JetBrains开发的,后来成为Android官方开发语言。 自2017年JetBrains发…

HNU-算法设计与分析-讨论课2

第二次小班讨论 (以组为单位,每组一题,每组人人参与、合理分工,ppt中标记分工,尽量都有代码演示) 算法分析题 3-4、4-1(要求:有 ppt和代码演示讲解 算法实现题 3-23、4-1(要求:有ppt 和代码演示讲解 数学之…

使用HTTP协议在Linux上进行API调用

在Linux系统上使用HTTP协议进行API调用是一种常见的操作,有时候我们需要调用一些外部API来获取数据或者进行自动化操作。下面是一个使用HTTP协议在Linux上进行API调用的代码示例,希望能够帮助你更好地理解这个过程。 首先,我们需要使用curl命…

【Docker】swarm stack部署多service应用

前面我们已经学习过了Docker Compose,它可以用来进行一个完整的应用程序相互依赖的多个容器的编排的,但是缺点是只能在单机模式使用,不能在分布式多机器上使用;前面我们也学习了Docker swarm,它可以将单个服务部署为多…

SOLIDWORKS CSWE认证考试报名

​ SOLIDWORKS CSWE是高级别的SOLIDWORKS认证,是一项充满挑战性的艰巨任务。CSWE测试不是简单注册就可以的,是要有一定资格才能参加考试,您首先需要获得CSWP证书,然后还得通过5个CSWPA系列主题考试中的至少4个主题(钣金…

基于UDP的套接字通信

基于UDP的套接字通信 1、通信流程1.1 服务端1.2 客户端 2、通信函数3、通信代码3.1 服务端代码3.2 客户端代码 原文链接 udp是一个面向无连接的,不安全的,报式传输层协议,udp的通信过程默认也是阻塞的。 UDP通信不需要建立连接 ,…

【ZYNQ】AXI4总线接口协议学习

建议翻看着底部的参考文档资料和本文一起辅助阅读 本文带你详细的了解AXI总线协议,并且基于官方手册,能够提高你的手册阅读能力。 什么是AXI AXI 的英文全称是 Advanced eXtensible Interface,即高级可扩展接口,它是 ARM 公司所提…

数据探索和模型建构

数据探索:观察数据之间的关系 分别判断 性别(sex)、船舱等级(Pclass)、年龄(Age)、有无父母子女(Parch)、有无兄弟姐妹(SibSp)、票价(Fare) 和 港口(Embarked)等因素和 存活(Survived)之间的关系 In [27]: sex_survived_cor train_data[[Sex,Survived]] sex_sur…

安科瑞出席宁波市建筑电气2023年年会-安科瑞 蒋静

12月1日,宁波市建筑电气2023年年会在宁波市海曙天港禧悦酒店成功举办。作为推动宁波市建筑电气行业技术发展的专业交流会,吸引了建筑电气行业领导、专家、设计师、厂家等300多名代表参会。期间,安科瑞电气股份有限公司携智能楼宇、智慧校园、…

HTML中表格的语法及使用(详解)

Hi i,m JinXiang ⭐ 前言 ⭐ 本篇文章主要介绍HTML中表格的语法及详细使用以及部分理论知识 🍉欢迎点赞 👍 收藏 ⭐留言评论 📝私信必回哟😁 🍉博主收将持续更新学习记录获,友友们有任何问题可以在评论区留…

骨传导耳机十大品牌排行榜,骨传导耳机品牌排名哪个好

骨传导蓝牙耳机的使用越来越广泛,无论是在户外运动还是在办公室工作,它都能为你带来自由的音乐体验。在本文中,我们将为你介绍十款TOP级骨传导蓝牙耳机,这些品牌在市场上拥有良好的口碑和广泛的使用者。通过本下面的选购指南&…

Buck电路 (PWM实现与闭环反馈) 电力系统仿真

Buck电路 (PWM实现与闭环反馈) Buck电路是降压型的DC-DC变换器。 三角波: 闭环控制怎么实现呢? 比例积分微分控制(proportional-integral-derivative control),简称PID控制,是最早…