MySQL Redo与Undo日志详细解析
作者:树獭叔叔??????? 发布时间:2024-01-26 04:40:09
1. Redo日志的介绍
Redo日志是物理日志,记录的是页面的变化。
1.1 Redo日志的作用
提升数据库写入效率
保证数据库不丢数据,进行数据恢复
1.2 Redo日志的格式与类型
所谓REDO的组织方式,就是如何把需要的REDO内容记录到磁盘文件中,以方便高效的REDO写入,读取,恢复以及清理。我们这里把REDO从上到下分为三层:逻辑REDO层、物理REDO层和文件层。
逻辑REDO层
这一层是真正的REDO内容,顺序的数据流,REDO由多个不同Type的多个REDO记录收尾相连组成,有全局唯一的递增的偏移sn,InnoDB会在全局log_sys中维护当前sn的最大值,并在每次写入数据时将sn增加REDO内容长度。
物理REDO层
磁盘是块设备,InnoDB中也用Block的概念来读写数据,一个Block的长度OS_FILE_LOG_BLOCK_SIZE等于磁盘扇区的大小512B,每次IO读写的最小单位都是一个Block。
文件层
最终REDO会被写入到REDO日志文件中,并且日志文件是循环写入的
2. 写入Redo日志的流程(MTR)
用户线程的操作会首先写进
log buffer
中log buffer
中的日志会顺序写入Redo逻辑日志中之后会落盘持久化存储到磁盘上
之后通知用户已经存储完成了
3. Checkpoint机制
Checkpoint是Redo日志中脏页的标记位,有以下两个作用:
维护Redo日志,方便清理
减小重启的工作量
数据库恢复流程:
读取 checkpoint 信息•从 checkpoint 位置开始读取剩余日志
解析日志并按 space_no 与 page_id 构建 hash 表
应用 Redo 日志,Redo日志回放保证幂等性
解析 binlog 构建 xid 列表
扫描回滚段构建待提交事务列表
回滚掉未在 xid 列表中的事务
4. Undo日志介绍
Undo log是逻辑日志,记录的是数据的增量变化,它的作用是保证事务的原子性和事务并发控制。可以用于事务回滚,以及提供多版本机制(MVCC),解决读写冲突和一致性读的问题。
5. MVCC
MVCC的意义:
读写互不阻塞;
降低死锁概率;
实现一致性读。
UndoLog在MVCC的作用:
每个事务有一个单增的事务ID;
数据页的行记录中包含了DB_ROW_ID,DB_TRX_ID,DB_ROLL_PTR;
DB_ROLL_PTR将数据行的所有快照记录都通过链表的结构串联了起来。
来源:https://juejin.cn/post/7108384536429330468


猜你喜欢
- 一 在写之前 最好指定python的路径:#!/usr/bin/pythonpython 在linux中需要添加编码方式:以免出现中文乱码#
- 1. fixture的作用域1.1 scope通过前面文章的介绍,我们知道@pytest.fixture()有一个scope参数,并且有五个
- 背景我们经常调侃程序员每天都在写bug,这确实是事实,没有测出bug不代表程序就真的不存在问题。传统的代码review、静态分析、人工测试和
- 视图:mysql中的视图,视图与表有很多相似的地方,视图也是由若干个字段以及若干条记录构成,视图也可以作为select语句的数据源。视图中保
- 为了实现挖掘,我们需要开发一个挖掘功能.挖掘功能需要在给定的消息字符串上生成摘要并提供工作证明.让我们在本章讨论这个.消息摘要函数我们将编写
- 本文实例讲述了Python实现的knn算法。分享给大家供大家参考,具体如下:代码参考机器学习实战那本书:机器学习实战 (Peter Harr
- 本文实例讲述了PHP开发之归档格式phar文件概念与用法。分享给大家供大家参考,具体如下:一个php应用程序往往是由多个文件构成的,如果能把
- 在对excel的操作中,调整列的顺序以及添加一些列也是经常用到的,下面我们用pandas实现这一功能。1、调整列的顺序>>>
- 由于图片水印的种类有很多,今天我们先讲最简单的一种。即上图中的①类水印,这种水印存在白色背景上的文档里,水印是灰色,需要保留的文字是黑色。这
- python的列表list可以用for循环进行遍历,实际开发中发现一个问题,就是遍历的时候删除会出错,例如l = [1,2,3,4]for
- 本文实例为大家分享了PyQt5实现简单计算器的具体代码,供大家参考,具体内容如下下面我们将介绍使用python的PyQt5图形界面来编写一个
- 最近在使用tensorflow进行网络训练的时候,需要提取出别人训练好的卷积核的部分层的数据。由于tensorflow中的tensor和py
- 背景 在平常的开发中,经常碰到这种更新数据的场景:先判断某一数据在库表中是否存在,存在则update,不存在则insert。 如果使用Hi
- 问题描述:某天使用idea,突然发现git提交记录没法查看具体提交的文件了。只能看到提交记录,如下图:分析可能是修改了控件设置的原因,于是尝
- 变量类型ECMAScript变量可能包含两种不同类型的数据值:基本类型和引用类型。基本类型基本类型指的是简单的数据段,5种基本数据类型:un
- PHP mysqli_select_db() 函数更改连接的默认数据库:删除数据库<?php // 假定数据库用户名:root,密码:
- 我们经常会遇这样一个需求:判断字符串中是否包含某个关键词,也就是特定的子字符串。比如从一堆书籍名称中找出含有“pytho
- Asyncio 任务可以通过调用它们的 cancel() 方法来取消。我们可以通过将任务包装在对 asyncio.shield() 的调用中
- 本文实例讲述了python通过pil模块将raw图片转换成png图片的方法。分享给大家供大家参考。具体分析如下:python通过pil模块将
- 我们通常用golang来构建高并发场景下的应用,但是由于golang内建的GC机制会影响应用的性能,为了减少GC,golang提供了对象重用