Mysql的事务日志
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页的申请。
相关文章:

Mysql的事务日志
Mysql的事务具有四个特性:原子性、一致性、隔离性、持久性。那么事务的四种特性分别是靠什么机制实现的呢? 事务的隔离性由锁机制来保证 事务的原子性、一致性、持久性则由redo log和Undo log来保证。 - redo log是重做日志,提供再写入操作&…...

三、Shell 环境
一、Linux 系统分类 在 Linux 中,常见的 Shell 有以下几种: Bourne Shell(sh):最早的 Shell,由 Stephen Bourne 开发。它是大多数其他 Shell 的基础。Bourne Again Shell(bash)&am…...

2023年第三届产业数字化【金铲奖】重磅来袭!
做具备产业数字化价值的企业、案例标杆、资本机构的见证者、发现者、陪伴者。 出品|产业家 一年一度的金铲奖来了! 在过去的一年时间里,我们清晰地看到,产业数字化的潮水更加汹涌澎湃且势不可挡,越来越多的企业开始寻求数字化…...

node.js安装和配置
软件介绍 Node.js是一个免费的、开源的、跨平台的JavaScript运行时环境,允许开发人员在浏览器之外编写命令行工具和服务器端脚本。 Node.js是一个基于Chrome JavaScript运行时建立的一个平台。 Node.js是一个事件驱动I/O服务端JavaScript环境,基于Googl…...
【周报2023.12.09】
周报2023.12.09 本周开展工作下周工作计划 本周开展工作 本周开展的工作的话一共是一下几点: 这三点的话是紧密相连的 逻辑这边需要考虑的东西很多 点击生成照片,然后获取生成照片的状态点击生成照片,然后获取生成照片的时间,并…...

基于ssm大学生创新创业平台项目管理子系统设计与实现论文
摘 要 互联网发展至今,无论是其理论还是技术都已经成熟,而且它广泛参与在社会中的方方面面。它让信息都可以通过网络传播,搭配信息管理工具可以很好地为人们提供服务。针对大学生创新创业项目信息管理混乱,出错率高,信…...

JS基础之原型原型链
JS基础之原型&原型链 原型&原型链构造函数创建对象prototypeprotoconstructor实例与原型原型的原型原型链其他constructorproto继承 原型&原型链 构造函数创建对象 我们先使用构造函数创建一个对象: function Person(){ } var person new Person();…...
【力扣100】54.螺旋矩阵
添加链接描述 class Solution:def spiralOrder(self, matrix: List[List[int]]) -> List[int]:if not matrix or not matrix[0]:return list()rows, columns len(matrix), len(matrix[0])order list()left, right, top, bottom 0, columns - 1, 0, rows - 1while left &…...
UI 优先的统一身份认证系统 Casdoor
Casdoor 是一个基于 OAuth 2.0 / OIDC 的 UI 优先集中认证 / 单点登录 (SSO) 平台,简单点说,就是 Casdoor 可以帮你解决 用户管理 的难题,你无需开发用户登录注册等与用户鉴权相关的一系列功能,只需几个步骤,简单配置&…...

Realme X7 Pro Root 刷机教程
Realme X7 Pro 刷机教程 Just For Fun,最近倒腾了下Realme X7 Pro 刷root。此博客为个人记录刷机过程,如有机友跟随本教程操作,请谨慎操作!!! 以下教程真针对Realme X7 Pro,其他版本方法未知&…...

postgresql自带指令命令系列三
目录 简介 bin目录 28.pg_verifybackup 29.pg_waldump 30.postgres 31.postmaster -> postgres 32.psql 33.reindexdb 34.vacuumdb 35.vacuumlo 总结: 简介 在安装postgresql数据库的时候会需要设置一个关于postgresql数据库的PATH变量 export PATH/…...

Java_mybatis-结果集映射-ResultTypeResultMap
Mybatis返回值接收 可以使用两种方式进行参数的接收 resultTyperesultMap 这两种分别都是需要在Mapper.xml文件中去设置的 当结果是一个简单的对象或者list或者map,对象中没有嵌套对象,或者集合时,就可以直接使用resultType 反之如果需要…...
【Java】MySQL存储 MD5 值应该用 VARCHAR 还是CHAR?
CHAR 非常适合存储 MD5 值。因为MD5 值是一个定长的值,对于固定长度的非常短的列,CHAR比VARCHAR的效率更高。 CHAR和VARCHAR的区别: 1)存储长度不同,CHAR 的长度是固定的,VARCHAR 的长度是可变的 假设,当我们定义 CHA…...
pytorch中五种常用随机矩阵构造方法:rand、randn、randn_like、randint、randperm
1 torch.rand:构造均匀分布张量 torch.rand是用于生成均匀随机分布张量的函数,从区间[0,1)的均匀分布中随机抽取一个随机数生成一个张量,其调用方法如下所示: torch.rand(sizes, outNone) ➡️ Tensor 参数: sizes&…...
2023第二届全国大学生数据分析大赛A完整原创论文(含摘要+问题分析+模型建立与求解+python代码)
大家好,从昨天肝到现在,终于完成了2023第二届全国大学生数据分析大赛A题某电商平台用户行为分析与挖掘的完整论文啦。 给大家看一下目录吧: 目录 摘 要: 10 一、问题重述 12 二.问题分析 13 2.1问题一 13 2.2问…...
Qt 面试指南
一、c基础知识 1、进程和线程的同步方式 进程:1)管道,是内核里的一串缓存 2)消息队列 3)共享内存 4)信号量机制 5)信号 6)socket 线程:1)等待通知机制 2&…...

开利网络的数字化技术加持下,加快扶贫和乡村振兴的效果和进程!
今日,来自山区省份的从事公益、区域民族文化传播、帮扶贫困地区脱贫、农业兴村贵州项目组一行来开利进行数字化脱贫、帮助乡村振兴解决方案探讨交流,交流中,开利网络总结出历经多年实践验证且行之有效的数字化经营、数字化建设经验得到与会成…...

PR剪辑视频做自媒体添加字幕快速方式(简单好用的pr视频字幕模板)
如何选择合适的字幕添加进短视频呢?首先要先确定增加的视频风格,简约、商务、科技感、炫酷;再确定用途,注释、标记、语音翻译、引用、介绍;最后在相应的模板中挑选几个尝试,悬着一个最切合主题的使用&#…...

金融行业文件摆渡,如何兼顾安全和效率?
金融行业是数据密集型产业,每时每刻都会产生海量的数据,业务开展时,数据在金融机构内部和内外部快速流转,进入生产的各个环节。 为了保障基础的数据安全和网络安全,金融机构采用网络隔离的方式来隔绝外部网络的有害攻击…...

[足式机器人]Part2 Dr. CAN学习笔记-自动控制原理Ch1-1开环系统与闭环系统Open/Closed Loop System
本文仅供学习使用 本文参考: B站:DR_CAN Dr. CAN学习笔记-自动控制原理Ch1-1开环系统与闭环系统Open/Closed Loop System EG1: 烧水与控温水壶EG2: 蓄水与最终水位闭环控制系统 EG1: 烧水与控温水壶 EG2: 蓄水与最终水位 h ˙ q i n A − g h A R \dot{…...
变量 varablie 声明- Rust 变量 let mut 声明与 C/C++ 变量声明对比分析
一、变量声明设计:let 与 mut 的哲学解析 Rust 采用 let 声明变量并通过 mut 显式标记可变性,这种设计体现了语言的核心哲学。以下是深度解析: 1.1 设计理念剖析 安全优先原则:默认不可变强制开发者明确声明意图 let x 5; …...

【力扣数据库知识手册笔记】索引
索引 索引的优缺点 优点1. 通过创建唯一性索引,可以保证数据库表中每一行数据的唯一性。2. 可以加快数据的检索速度(创建索引的主要原因)。3. 可以加速表和表之间的连接,实现数据的参考完整性。4. 可以在查询过程中,…...

剑指offer20_链表中环的入口节点
链表中环的入口节点 给定一个链表,若其中包含环,则输出环的入口节点。 若其中不包含环,则输出null。 数据范围 节点 val 值取值范围 [ 1 , 1000 ] [1,1000] [1,1000]。 节点 val 值各不相同。 链表长度 [ 0 , 500 ] [0,500] [0,500]。 …...
Robots.txt 文件
什么是robots.txt? robots.txt 是一个位于网站根目录下的文本文件(如:https://example.com/robots.txt),它用于指导网络爬虫(如搜索引擎的蜘蛛程序)如何抓取该网站的内容。这个文件遵循 Robots…...

Spring Cloud Gateway 中自定义验证码接口返回 404 的排查与解决
Spring Cloud Gateway 中自定义验证码接口返回 404 的排查与解决 问题背景 在一个基于 Spring Cloud Gateway WebFlux 构建的微服务项目中,新增了一个本地验证码接口 /code,使用函数式路由(RouterFunction)和 Hutool 的 Circle…...

NXP S32K146 T-Box 携手 SD NAND(贴片式TF卡):驱动汽车智能革新的黄金组合
在汽车智能化的汹涌浪潮中,车辆不再仅仅是传统的交通工具,而是逐步演变为高度智能的移动终端。这一转变的核心支撑,来自于车内关键技术的深度融合与协同创新。车载远程信息处理盒(T-Box)方案:NXP S32K146 与…...

R语言速释制剂QBD解决方案之三
本文是《Quality by Design for ANDAs: An Example for Immediate-Release Dosage Forms》第一个处方的R语言解决方案。 第一个处方研究评估原料药粒径分布、MCC/Lactose比例、崩解剂用量对制剂CQAs的影响。 第二处方研究用于理解颗粒外加硬脂酸镁和滑石粉对片剂质量和可生产…...

论文阅读:LLM4Drive: A Survey of Large Language Models for Autonomous Driving
地址:LLM4Drive: A Survey of Large Language Models for Autonomous Driving 摘要翻译 自动驾驶技术作为推动交通和城市出行变革的催化剂,正从基于规则的系统向数据驱动策略转变。传统的模块化系统受限于级联模块间的累积误差和缺乏灵活性的预设规则。…...
Python 训练营打卡 Day 47
注意力热力图可视化 在day 46代码的基础上,对比不同卷积层热力图可视化的结果 import torch import torch.nn as nn import torch.optim as optim from torchvision import datasets, transforms from torch.utils.data import DataLoader import matplotlib.pypl…...
在RK3588上搭建ROS1环境:创建节点与数据可视化实战指南
在RK3588上搭建ROS1环境:创建节点与数据可视化实战指南 背景介绍完整操作步骤1. 创建Docker容器环境2. 验证GUI显示功能3. 安装ROS Noetic4. 配置环境变量5. 创建ROS节点(小球运动模拟)6. 配置RVIZ默认视图7. 创建启动脚本8. 运行可视化系统效果展示与交互技术解析ROS节点通…...