当前位置: 首页 > news >正文

Mysql DBA学习笔记(Redo Log/Undo Log)

一、事务定义

事务:一组操作的集合,不可分割,这些操作要么全部成功执行,要么全部失败回滚。

事务的特性

  • 原子性(Atomicity):事务时不可分割的最小操作单元。
  • 一致性(Consistency):事务执行前后,数据库从一个一致状态转换到另一个一致状态。
  • 隔离性(Isolation):4种隔离级别(Read Uncommitted,Read Committed,Repeatable Read,Serializable)。
  • 持久性(Durability):事务一旦提交/回滚,它对数据库中的数据改变是永久的。

二、Redo Log / Undo Log 引入

Redo Log保障事务的持久性
Undo Log保障事务的原子性
它们的作用是:确保数据库在出现崩溃、断电、宕机等故障时,能够进行恢复操作,从而保障数据一致性和完整性。

三、Redo Log(重做日志)

Redo Log 用于恢复已经提交的事务,确保事务的持久性
当数据库发生崩溃时,Redo Log 可以帮助恢复已经提交尚未写入磁盘的数据。

Redo Log 记录事务提交时数据页的物理修改。

由两部分组成:

1、Redo Log Buffer(重做日志缓冲)- 内存中

2、Redo Log File(重做日志文件)- 磁盘中

操作流程:多行update和delete语句先修改buffer pool中的数据(不改磁盘中数据),如果buffer pool中没有需要操作的基础数据,会从磁盘中先把数据缓存到buffer pool中,接着还是执行buffer pool中的数据,buffer pool中进行修改过的数据被称作脏页,后续一定时间后通过后台进程将脏页刷新到磁盘中,从而维护事务的一致性。

脏页在刷新到磁盘的过程中失败了,磁盘中没有更新数据但此时事务已经提交,就需要redo log来帮忙。

Redo Log在我们对buffer pool中数据进行修改后,会先将修改后的数据记录在redo log buffer中(记录数据页的变化)。
当事务提交时,redo log会把在redo log buffer中的数据直接刷新到磁盘中,从而预防脏页刷新失败。

这种机制称为:WAL(Write-Ahead Logging)
先写日志,再写磁盘
。每次事务提交时,InnoDB 会将 Redo Log 先写入磁盘,而后再慢慢将实际修改的数据写入磁盘。

同时redo log写入磁盘中时采用循环写机制:当日志写满时,会从头开始重新写。即图中ib_logfile0/1相互循环写。

四、Undo Log(回滚日志)

Undo Log 记录数据被修改前的信息,保证事务的原子性

Redo Log 记录物理日志,Undo Log 记录逻辑日志(即执行了什么操作,而非数据内容本身)。

当进行rollback(回滚)操作时,就可以从Undo Log中调取相应记录进行回滚。

Undo Log 包含以下信息:

  • 事务ID(trx ID):标识修改该行的事务
  • 行的旧版本数据:在修改前的行数据

Undo Log 的版本链:
链头为最新记录,链尾为最早记录。如果事务需要回滚,MySQL 会沿着 Undo Log 链表进行逐条回滚,直到恢复到事务开始时的状态。

作用:1)事务的回滚操作  2)MVCC(多版本并发控制)

五、Undo Log 和 Redo Log的区别

六、参考文章/作者

黑马程序员 Mysql数据库从入门到精通

博客园 https://www.cnblogs.com/lgx211/p/18472544

http://www.dtcms.com/a/394751.html

相关文章:

  • 买卖T平台如何以分红+排队免单重构零售生态?
  • 2025 年前端工具全景解析:从框架到 AI,重构开发效率的 N 种可能
  • 重构ruoyi前后端分离版
  • AI + 制造:AI 如何重构制造业的质检与排产流程
  • 卡尔曼滤波
  • Django安全完全指南:构建坚不可摧的Web应用
  • Mysql DBA学习笔记(MVCC)
  • 【论文阅读】GR-1:释放大规模视频生成式预训练用于视觉机器人操控
  • 分布式光伏阴影轨迹模拟
  • 【Java.数据结构】初识集合框架
  • 人工智能的推理方法实验-用归结原理解决机器人搬盒子问题
  • Flink中 Window解析
  • 医疗数据互操作性与联邦学习的python编程方向研究(下)
  • 摄像头视频云存储与回放系统架构
  • C# 压缩解压文件的常用方法
  • .NET驾驭Word之力:打造专业文档 - 页面设置与打印控制完全指南
  • 为什么要创建音频地图?——探索Highcharts可视化的声音创新
  • Sass开发【四】
  • 从图片到实时摄像头:OpenCV EigenFace 人脸识别实战教程
  • kotlin 为什么要有协程作用域
  • MySQL二进制安装
  • 基于Java(SSH)+ Oracle 实现的(Web)视频教学平台
  • 西门子 S7-200 SMART PLC 结构化编程核心:子程序、中断程序与库概念详解
  • 树上LCA和树链剖分(未完待续)
  • 开发避坑指南(54):Mybatis plus查询指定的列
  • SQL注入可能用到的语句
  • 【论文阅读】GR00T N1:面向通用人形机器人的开放基础模型
  • 关于debian老系统安装软件失败的问题
  • ahooks:一套高质量、可靠的 React Hooks 库
  • 【一天一个Web3概念】Uniswap:去中心化金融(DeFi)的自动做市商革命