【MySQL高级篇笔记-MySQL事务日志(下) 】

news2024/10/7 6:45:20

此笔记为尚硅谷MySQL高级篇部分内容

目录

一、redo日志

1、为什么需要REDO日志

2、REDO日志的好处、特点

3、redo的组成

4、redo的整体流程 

5、redo log的刷盘策略

6、不同刷盘策略演示

 流程图

7、写入redo log buffer 过程

1.补充概念:Mini-Transaction

2. redo 日志写入log buffer

3.redo log block的结构图

8、redo log file 

1.相关参数设置    

2.日志文件组

3.checkpoint

9、redo log小结

二、 Undo日志

1、如何理解Undo日志

2、Undo日志的作用 

3、 undo的存储结构 

1. 回滚段与undo页

2. 回滚段与事务

3. 回滚段中的数据分类

4、undo的类型

5、undo log的生命周期

1. 简要生成过程

2. 详细生成过程

3.undo log是如何回滚的

4.undo log的删除  

6、小结


事务有4种特性:原子性、一致性、隔离性和持久性。那么事务的四种特性到底是基于什么机制实现呢?

  • 事务的隔离性由 锁机制 实现。

  • 而事务的原子性、一致性和持久性由事务的 redo 日志和undo 日志来保证。

    • REDO LOG 称为 重做日志 ,提供再写入操作,恢复提交事务修改的页操作,用来保证事务的持久性。

    • UNDO LOG 称为 回滚日志 ,回滚行记录到某个特定版本,用来保证事务的原子性、一致性。

有的DBA或许会认为 UNDO 是 REDO 的逆过程,其实不然。其实不然。REDO和UNDO都可以视为是一种恢厦操作

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

    提交,由redo log来保证事务的持久化。

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

一、redo日志


InnoDB存储引擎是以页为单位来管理存储空间的。在真正访问页面之前需要把在磁盘上的页缓存到内存中的 Buffer Pool之后才可以访问。所有的变更都必须先更新缓冲池中的数据,然后缓冲池中的脏页会以一定的频率被刷入磁盘( checkPoint机制),通过缓冲池来优化CPU和磁盘之间的鸿沟,这样就可以保证整体的性能不会下降太快。  

1、为什么需要REDO日志

2、REDO日志的好处、特点

1. 好处

  • redo日志降低了刷盘频率

  • redo日志占用的空间非常小
    存储表空间ID、页号、偏移量以及需要更新的值,所需的存储空间是很小的,刷盘快。

2. 特点

  • redo日志是顺序写入磁盘的

    在执行事务的过程中,每执行一条语句,就可能产生若干条redo日志,这些日志是按照产生的顺序写入磁盘的,也就是使用顺序Io,效率比随机Io快。

  • 事务执行过程中,redo log不断记录

    redo log跟bin log的区别,redo log是存储引擎层产生的,而bin log是数据阵层广生的。假设一个事务,对表做10万行的记录插入,在这个过程中,一直不断的往redo log顺序记录,而bin log不会记录,直到这个事务提交,才会一次写入到bin log文件中。

3、redo的组成

Redo log可以简单分为以下两个部分:

  • 重做日志的缓冲 (redo log buffer) ,保存在内存中,是易失的。

  • 重做日志文件 (redo log file) ,保存在硬盘中,是持久的。 

4、redo的整体流程 

以一个更新事务为例,redo log 流转过程,如下图所示:

第1步:先将原始数据从磁盘中读入内存中来,修改数据的内存拷贝
第2步:生成一条重做日志并写入redo log buffer,记录的是数据被修改后的值
第3步:当事务commit时,将redo log buffer中的内容刷新到 redo log file,对 redo log file采用追加写的方式
第4步:定期将内存中修改的数据刷新到磁盘中

体会:Write-Ahead Log(预先日志持久化):在持久化一个数据页之前,先将内存中相应的日志页持久化。 

5、redo log的刷盘策略

6、不同刷盘策略演示

 流程图

小结: innodb_flush_log_at_trx_commit=1

为1时,只要事务提交成功,redo log记录就一定在硬盘里,不会有任何数据丢失。

如果事务执行期间MySQL挂了或宕机,这部分日志丢了,但是事务并没有提交,所以日志丢了也不会有损失。可以保证ACID的D,数据绝对不会丢失,但是效率最差的。

建议使用默认值,虽然操作系统宕机的概率理论小于数据库宕机的概率,但是一般既然使用了事务,那么数据的安全相对来说更重要些。

小结: innodb_flush_log_at_trx_commit=2

为2时,只要事务提交成功,redo log buffer中的内容只写入文件系统缓存( page cache ) 。

如果仅仅只是MySQL挂了不会有任何数据丢失,但是操作系统宕机可能会有1秒数据的丢失,这种情况下无法满足ACID中的D。但是数值2肯定是效率最高的。

 

7、写入redo log buffer 过程

1.补充概念:Mini-Transaction

2. redo 日志写入log buffer

 

3.redo log block的结构图

8、redo log file 

1.相关参数设置    

2.日志文件组

3.checkpoint

9、redo log小结

相信大家都知道redo log的作用和它的刷盘时机、存储形式:

InnoDB的更新操作采用的是Write Ahead Log(预先日志持久化)策略,即先写日志,再写入磁盘

二、 Undo日志


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

1、如何理解Undo日志

事务需要保证 原子性 ,也就是事务中的操作要么全部完成,要么什么也不做。但有时候事务执行到一半
会出现一些情况,比如:

  • 情况一:事务执行过程中可能遇到各种错误,比如 服务器本身的错误 操作系统错误 ,甚至是突然 断电 导致的错误。
  • 情况二:程序员可以在事务执行过程中手动输入 ROLLBACK 语句结束当前事务的执行。

以上情况出现,我们需要把数据改回原先的样子,这个过程称之为 回滚 ,这样就可以造成一个假象:这个事务看起来什么都没做,所以符合 原子性 要求。

2、Undo日志的作用 

  • 作用1:回滚数据

    用户对undo日志可能有误解: undo用于将数据库物理地恢复到执行语句或事务之前的样子。但事实并非如此。undo是逻辑日志,因此只是将数据库逻辑地恢复到原来的样子。所有修改都被逻辑地取消了,但是数据结构和页本身在回滚之后可能大不相同。

    这是因为在多用户并发系统中,可能会有数十、数百甚至数千个并发事务。数据库的主要任务就是协调对数据记录的并发访问。比如,一个事务在修改当前一个页中某几条记录,同时还有别的事务在对同一个页中另几条记录进行修改。因此,不能将一个页回滚到事务开始的样子,因为这样会影响其他事务正在进行的工作。

  • 作用2:MVCC

    undo的另一个作用是MVCC,即在InnoDB存储引擎中MVCC的实现是通过undo来完成。当用户读取一行记录时,若该记录已经被其他事务占用,当前事务可以通过undo读取之前的行版本信息,以此实现非锁定读取。

3、 undo的存储结构 

1. 回滚段与undo页

2. 回滚段与事务

3. 回滚段中的数据分类

4、undo的类型

在InnoDB存储引擎中,undo log分为:

  • insert undo log

    insert undo log是指在insert操作中产生的undo log。因为insert操作的记录,只对事务本身可见,对其他事务不可见(这是事务隔离性的要求),故该undo log可以在事务提交后直接删除。不需要进行purge操作。

  • update undo log

    update undo log记录的是对delete和update操作产生的undo log。该undo log可能需要提供MVCC机制,因此不能在事务提交时就进行删除。提交时放入undo log链表,等待purge线程进行最后的删除。

5、undo log的生命周期

1. 简要生成过程

只有Buffer Pool的流程:

有了Redo Log和Undo Log之后:

2. 详细生成过程

3.undo log是如何回滚的

以上面的例子来说,假设执行rollback,那么对应的流程应该是这样:
1. 通过undo no=3的日志把id=2的数据删除
2. 通过undo no=2的日志把id=1的数据的deletemark还原成0
3. 通过undo no=1的日志把id=1的数据的name还原成Tom
4. 通过undo no=0的日志把id=1的数据删除

4.undo log的删除  

  • 针对于insert undo log

    因为insert操作的记录,只对事务本身可见,对其他事务不可见。故该undo log可以在事务提交后直接删除,不需要进行purge操作。

  • 针对于update undo log

    该undo log可能需要提供MVCC机制,因此不能在事务提交时就进行删除。提交时放入undo log链表,等待purge线程进行最后的删除。

补充:

purge线程两个主要作用是:清理undo页清除page里面带有Delete_Bit标识的数据行。是InnoDB中,事分中的Delete操作实际上并不是真正的删除掉数据行,而是一种Delete Mark操作,在记录上标识Delete_Bit,而 不删除记录。是一种"假删除"只是做了个标记,真正的删除工作需要后台purge线程去完成。  

6、小结

undo log是逻辑日志,对事务回滚时,只是将数据库逻辑地恢复到原来的样子。

redo log是物理日志,记录的是数据页的物理变化,undo log不是redo log的逆过程。

 

高级篇笔记PDF自取

链接:https://pan.baidu.com/s/1pVqrTwIZFoED77i-EFmw6g?pwd=3333 
提取码:3333

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

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

相关文章

Linux防火墙学习笔记10

iptables的拓展匹配: icmp模块的使用方法: iptables -t filter -I INPUT -p icmp -m icmp --icmp-type echo-reply -j ACCEPT 说明:回应 我能ping通别人,别人ping不通我。 iprange模块的作用: iptables -t filter…

常见网络协议汇总

常见的网络协议有:TCP/IP协议、UDP协议、HTTP协议、FTP协议等,本文就详细的介绍一下常见的网络协议,通过这些具体的协议更深刻的认识整体网络的传输流程及相关网络原理,感兴趣的可以了解一下。 前言 本篇博客将对基于 计算机网络五层模型 中…

bff服务编排

这里写自定义目录标题 欢迎使用Markdown编辑器新的改变功能快捷键合理的创建标题,有助于目录的生成如何改变文本的样式插入链接与图片如何插入一段漂亮的代码片生成一个适合你的列表创建一个表格设定内容居中、居左、居右SmartyPants 创建一个自定义列表如何创建一个…

工具应用问题处理

目录 eclipseIdea eclipse 更改eclipse字体: window - Preferences - General --> Appearance --> Colors and Fonts - Java–>Java Editors Text Font(set to default:Text Font) 在弹出的窗口选择要更改的字体样式 点击确定,最后apply即可 …

Java企业级信息系统开发学习笔记(4.3) Spring Boot两种全局配置和两种注解

该文章主要为完成实训任务,详细实现过程及结果见【http://t.csdn.cn/Z2viP】 文章目录 一、Application.properites配置文件1.1 创建Spring Boot的Web项目ProperitesDemo1.2 在应用属性文件里添加相关配置1. 配置服务器端口号和web虚拟路径2. 对象类型的配置与使用&…

seata启动报错

目录 一、说是druid连接失败的问题 二、有可能也是因为内存不足, 我遇到的问题如下: INFO --- [ctionPool-Create-18213909] com.alibaba.druid.pool.DruidDataSource : put physical connection to pool failed. 一、说是druid连接失败的问题 厚礼…

做项目的时候大量需求测不过来怎么破?

互联网测试少,测试研发比大概在1:5,再加上产品再使足了劲上需求,导致了测试需求量大,测试准备时间短,从而降低了上线质量。那么如何解决呢?测试是质量负责人,要对平台质量负责,于是就…

Cesium 实战 - 气泡框跟随飞行

Cesium 实战 - 气泡框跟随飞行 Cesium 气泡框跟随气泡框在线示例 气泡框在地图中非常常用,尤其是二维地图中;而在三维地图中经常会用广告牌、标牌等作为气泡框使用。 广告牌(billboard)虽然方便,但是不支持富文本&…

Mysql数据库基础和增删改查操作(每一次「欢喜」都值得纪念)

文章目录 一、数据库基本概念数据表数据库数据库管理系统(DBMS)数据库系统 二、数据库类型和常用数据库1.关系型数据库2.非关系型数据库 三、数据库的数据类型四、SQL语句1.简介2.分类 五、SQL语句的使用1.数据库操作(1)创建数据库 2.数据库表操作&#…

【笔试强训选择题】Day24.习题(错题)解析

作者简介:大家好,我是未央; 博客首页:未央.303 系列专栏:笔试强训选择题 每日一句:人的一生,可以有所作为的时机只有一次,那就是现在!!! 文章目录…

窥探系列之数字证书

资料 华为数字证书解读 彻底搞懂HTTPS的加密原理 解读 使用过程 首先,证书持有者拥有一对公私钥;CA机构验证证书申请人身份后,使用CA机构私钥(属于根证书,一般浏览器保有CA的根证书公钥)对申请人的基本信息及公钥进…

如何管理与改进低质供应商?帮助供应商提升自身质量能力?

管理和改进低质量的供应商可能是一项具有挑战性的任务,但与他们合作以提高他们的能力是可能的。可以采取一些步骤来管理和帮助提高供应商的质量: 确定根本原因:了解供应商产品或服务质量低下的原因。对他们的流程、资源和能力进行全面评估&am…

测试不到3年,来面试开口要25K,面完连10K都不想给

前言 我的好朋友兼大学同学老左家庭经济情况不错,毕业之后没两年自己存了点钱加上家里的支持,自己在杭州开了一家网络公司。由于公司不是很大所以公司大部分的测试人员都是自己面试的,近期公司发展的不错,打算扩招也面试了不少人…

聊一聊近期测试行情以及个人的感受

众所周知,去年年底的裁员潮再加上今年的疫情影响,失业、找工作成为了蛮多人的当务之急。最近一些招聘网站也出现被刷爆的情况,其中顺利找到工作的并不多,说明行情很冷,但是总有许多人顺利跳槽。 其实对于大牛来说&…

【深度学习】日常笔记4

softmax(o)给出的分布⽅差,并与softmax交叉熵损失l(y, yˆ)的⼆阶导数匹配。 Softmax函数可以将一组任意实数值转换为一个概率分布,它的输出值是各个类别的概率估计。如果我们用softmax函数得到的概率分布与真实分布非常相似,那么交叉熵损失…

Vue 项目使用 ECharts 使用路由或者点击浏览器前进/后退切换页面回来图表不显示

问题描述 问题1: 解决方案对应方案1 在 Vue 项目中使用 ECharts 时,一开始图表能渲染出来,当切换到其他页面再回来的时候,图表就不显示了 问题2: 解决方案对应方案2 Echarts 图表在子组件中,父组件通过传递…

【正点原子STM32连载】 第三十一章 内部温度传感器实验摘自【正点原子】STM32F103 战舰开发指南V1.2

1)实验平台:正点原子stm32f103战舰开发板V4 2)平台购买地址:https://detail.tmall.com/item.htm?id609294757420 3)全套实验源码手册视频下载地址: http://www.openedv.com/thread-340252-1-1.html 第三十…

【多线程进阶】JUC下的常用类

🎉🎉🎉点进来你就是我的人了博主主页:🙈🙈🙈戳一戳,欢迎大佬指点! 欢迎志同道合的朋友一起加油喔🤺🤺🤺 目录 ReentrantLock Semaphore(信号量) 计数器——…

阿里发布Java岗春招面试总结(复盘版)GitHub一经上传火爆全网!

Java面试都只是背答案吗? Java 八股文面试当然要背,不背就通过不了面试。 因为经济环境的问题,互联网行业竞争越来越严峻,面试也是越来越难。需要我们掌握的技术也是越来越多、要求是越来越高。作为一个资深的互联网码农,今天给…

公司招人面了一个00后测试,可以说是内卷届的天花板.....

公司前段缺人,也面了不少测试,结果竟然没有一个合适的。一开始瞄准的就是中级的水准,也没指望来大牛,提供的薪资也不低,面试的人很多,但平均水平很让人失望。令我印象最深的是一个00后测试员,他…