redo日志——log buffer与磁盘的交互详解

news2025/1/16 13:58:30

目录

一、redo日志刷盘机制(时机)

1、log buffer 空间不足时

2、事务提交

3、后台线程

4、正常关闭服务器

5、checkpoint时

二、数据目录中的redo日志文件

三、redo日志文件格式

log buffer与磁盘交互的最小单位——block

文件格式

四、Log Sequeue Number(了解)

 五、崩溃恢复

1、确定恢复的起点

2、确定恢复的重点

3、开始恢复

用什么方法恢复?

哈希表

同时跳过已经刷新到磁盘的页面


一、redo日志刷盘机制(时机)

1、log buffer 空间不足时

log buffer的大小是有限制的,默认是16MB,当log buffer的空间已经占了一半左右,就会出发吧这些日志刷新到磁盘上。

2、事务提交

为了保证事务的持久性,当事务提交之后,就会刷新log buffer 中的部分block进入磁盘。

3、后台线程

后台线程每秒都会刷新一次log buffer 中block中的redo日志到磁盘

4、正常关闭服务器

正常关闭服务器就会刷新log buffer 中的redo日志到磁盘

5、checkpoint时

checkpoint其实就是buffer pool中的脏页刷入磁盘,刷入磁盘之前一定要把对应的redo日志刷入磁盘

二、数据目录中的redo日志文件

前面的文章详细的介绍过,操作系统是用文件来管理mysql的,磁盘中的数据目录用来存储数据文件,redo日志文件就存储在数据目录的名为ib_logfile0和ib_logfile1的文件,log buffer 中的日志默认就是刷入到磁盘的这两个文件中。

注意:根据命名可以看出,这个redo文件并不只有一个,而是以组的形式存在,当0写满就写入1中,1写满就写入2,如果写到最后一个文件,就重新转到0去写,也就是把0的文件覆盖掉。这也就设计了上面的只是checkpoint,什么样的redo日志可以被覆盖。(先说结论,buffer log中的脏页产生的redo 日志,并且这个脏页已经被刷入磁盘,也就意味着此redo 日志已经没有用了,就可以被覆盖了)

三、redo日志文件格式

注意上一篇文章介绍的是redo日志的格式和log buffer的格式。现在介绍的磁盘中的redo日志文件格式。

log buffer与磁盘交互的最小单位——block

log buffer本质就是一片连续的内存空间,被划分成了若干个512字节大小的block。将log buffer 中的redo日志刷新到磁盘本质就是把block的镜像写入日志文件中。

文件格式

由两个部分组成:

~前2048个字节(前4个block)用来存储一些管理信息的。

~从第2048字节往后是用来存储log buffer中的block镜像的。

~注意:上面说过的覆盖循环就是从每个日志文件的第2048字节开始算。

四、Log Sequeue Number(了解)

简称lsn,日志序列号。为什么要介绍他呢,他又有什么作用?

首先我们要知道虽然redo日志小,但是一个语句可以产生很多mtr,而mtr会产生很多redo日志,所以redo日志的数量不断快速递增,那我们怎么确定把redo日志写在log buffer的什么位置呢,lsn被设计出来了。

lsn初始值8704(设计就是这么设计的),当log  buffer中一条日志也没写入的时候lsn的值就是8704。

lsn随着日志插入增加,lsn的增长量是的计算(需要计算block的log block headerlog block trailer):

如果某个 mtr 产⽣的⼀组 redo ⽇志占⽤的存储空间⽐较⼩,也就是待插⼊的block剩余空闲空间能容纳这个 mtr 提交的⽇志时, lsn 增⻓的量就是该 mtr ⽣成的 redo
⽇志占⽤的字节数,就像这样
我们假设上图中 mtr_1 产⽣的 redo ⽇志量为200字节,那么 lsn 就要在 8716 的基础上增加 200 ,变为 8916
如果某个 mtr 产⽣的⼀组 redo ⽇志占⽤的存储空间⽐较⼤,也就是待插⼊的block剩余空闲空间不⾜以容纳这个 mtr 提交的⽇志时, lsn 增⻓的量就是该 mtr ⽣成
redo ⽇志占⽤的字节数加上额外占⽤的 log block header log block trailer 的字节数,就像这样:

 

 五、崩溃恢复

讲了这么多不知道大家发现没有,redo在服务器没有挂的时候完全就是累赘,浪费了很多时间和少量的空间。但是万一数据库挂了,那redo日志就是很厉害了,重启之后就可以根据redo日志将页面恢复到崩溃前的状态。那恢复的过程都发生了什么呢?

1、确定恢复的起点

上面没有介绍怎么确定哪些redo日志可以被覆盖,log buffer刷盘机制有一个就是脏页刷入之前,先将redo日志刷入磁盘,这些就没有必要刷入了,但是伴随着别的机制所以磁盘中可能存在脏页还没有刷入的redo日志,这些是有用的,不能被覆盖,而恢复就是从这个点之后进行顺序恢复,注意这个点之后的redo日志对应的脏页可能被刷入磁盘了,这点我们不能确定,不确定就全刷,mysql也有机制判断是否被刷入。

2、确定恢复的重点

终点我们想当然的觉得终点很容易确定,就是最后的block,但是计算机怎么确定是最后的block呢?

普通block的 log block header 部分有⼀个称之为 LOG_BLOCK_HDR_DATA_LEN 的属性
对于被填满的block这个属性都是512,不是512那就是扫描到最后的一个block。

3、开始恢复

checkpoint_lsn就是上面说的那个点,这之前的脏页都被刷入到磁盘了,索引恢复后面的redo日志,这些日志放在block中。

顺序写入的,也要顺序恢复。

用什么方法恢复?

如果按照顺序依次恢复页没问题,但是mysql还是使用方法加快恢复:

哈希表

之后就可以遍历哈希表,因为对同⼀个⻚⾯进⾏修改的 redo ⽇志都放在了⼀个槽⾥,所以可以⼀次性将⼀个⻚⾯修复好(避免了很多读取⻚⾯的随机IO), 这样可以加快恢复速度。另外需要注意⼀点的是,同⼀个⻚⾯的 redo ⽇志是按照⽣成时间顺序进⾏排序的,所以恢复的时候也是按照这个顺序进⾏恢复,如果不按照⽣成时间顺序进⾏排序的话,那么可能出现错误。⽐如原先的修改操作是先插⼊⼀条记录,再删除该条记录,如果恢复时不按照这个顺序来,就可能变成先删除⼀条记录,再插⼊⼀条记录,这显然是错误的。

同时跳过已经刷新到磁盘的页面

我们前边说过, checkpoint_lsn 之前的 redo ⽇志对应的脏⻚确定都已经刷到磁盘了,但是 checkpoint_lsn 之后的 redo ⽇志我们不能确定是否已经刷到磁盘, 主要是因为在最近做的⼀次 checkpoint 后,可能后台线程⼜不断的从 LRU 链表 flush 链表 中将⼀些脏⻚刷出 Buffer Pool 。这些在 checkpoint_lsn 之后的 redo ⽇志,如果它们对应的脏⻚在奔溃发⽣时已经刷新到磁盘,那在恢复时也就没有必要根据 redo ⽇志的内容修改该⻚⾯了。
那在恢复时怎么知道某个 redo ⽇志对应的脏⻚是否在奔溃发⽣时已经刷新到磁盘了呢?这还得从⻚⾯的结构说起,我们前边说过每个⻚⾯都有⼀个称之为 File Header 的部分,在 File Header ⾥有⼀个称之为 FIL_PAGE_LSN 的属性,该属性记载了最近⼀次修改⻚⾯时对应的 lsn 值(其实就是⻚⾯控制块中的 newest_modification 值)。如果在做了某次 checkpoint 之后有脏⻚被刷新到磁盘中,那么该⻚对应的 FIL_PAGE_LSN 代表的 lsn 值肯定⼤于 checkpoint_lsn 的值,凡是符合这种情况的⻚⾯就不需要重复执⾏lsn值⼩于 FIL_PAGE_LSN 的redo⽇志了,所以更进⼀步提升了奔溃恢复的速度。这就是上面说的mysql判断脏页刷入磁盘的机制。

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

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

相关文章

Generator生成器函数

<script>//三个ajax异步的请求要保证执行的顺序//1. 传统的callback触发回调地狱 痛苦 处理异步任务按照顺序 异步-->同步化执行 代码的可读性更好//2. promise then then语义化明显//3.Generator生成函数//4.async await //ajax函数 xhr//XHR代表 "XMLHttp…

STM32 系统滴答时钟启动过程 SysTick_Config

STM32 系统滴答时钟启动过程 SysTick_Config 1. 系统滴答时钟1.1 简介1.2 配置1.3 启动和更新 1. 系统滴答时钟 1.1 简介 SysTick&#xff1a;系统滴答时钟&#xff0c;属于Cortex-M4内核中的一个外设&#xff0c;24bit向下递减计数。 Systick定时器常用来做延时&#xff0c;…

Jenkins配置node节点

1、添加节点 2、配置node主机的java环境 注意&#xff0c;jdk的位置和版本要和master保持一致 sudo apt-get update sudo apt-get install openjdk-8-jre vim /etc/enviroment写入&#xff1a;export JAVA_HOME/usr/lib/jvm/openjdk-8-jre 按wq!退出 再输入&#xff1a;s…

onlyoffice jsApi调用 进阶二次开发 连接器开发 api操作office文档 demo可直接运行测试

office这个体系分为四个大教程 1、【document server文档服务器基础搭建】 2、【连接器(connector)或者jsApi调用操作office】-进阶 3、【document builder文档构造器使用】-进阶 4、【Conversion API(文档转化服务)】-进阶 如果需要连接器&#xff0c;可以查看&#xff1a…

动态gif怎么在线生成?一招快速搞定gif动画

在我们生活沟通中都会运用到各种生动有趣gif动图。很多时候我们在使用gif动图的时候都需要从网上下载找起来很麻烦。那么&#xff0c;自己怎么制作gif动态图片呢&#xff1f;很简单&#xff0c;使用Gif制作&#xff08;https://www.gif.cn/&#xff09;工具&#xff0c;不需要下…

前端|Day3:CSS基础(黑马笔记)

Day3:CSS基础 目录 Day3:CSS基础一、CSS初体验二、CSS引入方式三、选择器1.标签选择器2.类选择器3.id选择器4.通配符选择器 四、盒子尺寸和背景色五、文字控制属性1.字体大小2.字体样式&#xff08;是否倾斜&#xff09;3.行高单行文字垂直居中 4.字体族5.font复合属性6.文本缩…

XGB-7: 特征交互约束

决策树是发现自变量&#xff08;特征&#xff09;之间交互关系的强大工具。在遍历路径中一起出现的变量是相互交互的&#xff0c;因为子节点的条件取决于父节点的条件。例如&#xff0c;在下图中&#xff0c;红色突出显示的路径包含三个变量&#xff1a; x 1 x_1 x1​、 x 7 x_…

facebook群控如何做?静态住宅ip代理在多账号运营重的作用

在进行Facebook群控时&#xff0c;ip地址的管理是非常重要的&#xff0c;因为Facebook通常会检测ip地址的使用情况&#xff0c;如果发现有异常的使用行为&#xff0c;比如从同一个ip地址频繁进行登录、发布内容或者在短时间内进行大量的活动等等&#xff0c;就会视为垃圾邮件或…

探究二维码技术:连接现实与数字世界的桥梁

title: 探究二维码技术&#xff1a;连接现实与数字世界的桥梁 date: 2024/2/19 13:15:36 updated: 2024/2/19 13:15:36 tags: 二维码技术数据编码纠错算法图像处理商业应用安全验证实时交互 引言&#xff1a; 二维码已经成为现代社会中广泛应用的一种技术工具。它不仅在商业领…

C#,二进制数的按位交换(Bits swap)的算法与源代码

数字在指定位置指定位数的交换是常见算法。 1 源程序 using System; using System.Text; using System.Collections; using System.Collections.Generic; namespace Legalsoft.Truffer.Algorithm { public static partial class Algorithm_Gallery { /// <…

Java——Stream流的学习

在开发过程中&#xff0c;经常或忽略流的使用&#xff0c;导致用的不熟练&#xff0c;于是抽时间系统的学习下stream的使用&#xff0c;找了哔哩哔哩的教程跟着看看练练。 准备工作 创建Book、Aurhor实体类&#xff0c;初始化数据 public static List<Author> getAuth…

图形渲染基础学习

原文链接&#xff1a;游戏开发入门&#xff08;三&#xff09;图形渲染_如果一个面只有三个像素进行渲染可以理解为是定点渲染吗?-CSDN博客 游戏开发入门&#xff08;三&#xff09;图形渲染笔记&#xff1a; 渲染一般分为离线渲染与实时渲染&#xff0c;游戏中我们用的都是…

浙大恩特客户资源管理系统 FollowAction SQL注入漏洞复现

0x01 产品简介 浙大恩特客户资源管理系统是一款针对企业客户资源管理的软件产品。该系统旨在帮助企业高效地管理和利用客户资源,提升销售和市场营销的效果。 0x02 漏洞概述 浙大恩特客户资源管理系统 FollowAction 接口处存在SQL注入漏洞,未经身份认证的攻击者可以利用该漏…

补-代码随想录第23天|● 669. 修剪二叉搜索树 ● 108.将有序数组转换为二叉搜索树 ● 538.把二叉搜索树转换为累加树

二叉树最后一天 ● 669. 修剪二叉搜索树思路一&#xff1a;递归递归三部曲代码&#xff1a; 思路二&#xff1a;迭代代码&#xff1a; ● 108.将有序数组转换为二叉搜索树思路&#xff1a;递归代码;[左闭右闭] ● 538.把二叉搜索树转换为累加树思路&#xff1a;递归 代码&#…

onlyoffice基础环境搭建+部署+demo可直接运行 最简单的入门

office这个体系分为四个大教程 1、【document server文档服务器基础搭建】 2、【连接器(connector)或者jsApi调用操作office】-进阶 3、【document builder文档构造器使用】-进阶 4、【Conversion API(文档转化服务)】-进阶 如果需要连接器&#xff0c;可以查看&#xff1a;onl…

【SpringBoot3】Spring Security 常用注解

注&#xff1a;本文基于Spring Boot 3.2.1 以及 Spring Security 6.2.1 Spring Security 6 的常用注解包括以下几种&#xff0c;通过这些注解可以更加方便的控制资源权限。 Secured &#xff1a;方法执行前检查&#xff0c;直接判断有没有对应的角色PreAuthorize&#xff1a;方…

Jmeter实现阶梯式线程增加的压测

安装相应jmeter 插件 1&#xff1a;安装jmeter 管理插件&#xff1a; 下载地址&#xff1a;https://jmeter-plugins.org/install/Install/&#xff0c;将下载下来的jar包放到jmeter文件夹下的lib/ext路径下&#xff0c;然后重启jmeter。 2&#xff1a;接着打开 选项-Plugins Ma…

【FastAPI】P3 请求与响应

目录 请求路径参数查询参数 响应JSON 响应文本响应返回 Pydantic 模型 在网络通讯中&#xff0c;请求&#xff08;Request&#xff09; 与 响应&#xff08;Response&#xff09; 扮演着至关重要的角色&#xff0c;它们构成了客户端与服务器间互动的根本理念。 请求&#xff0…

PMP考完之后考什么,NPDP值得考吗?

PMP考完之后可以考虑考一个NPDP证书&#xff0c;从事新产品开发相关工作的学习下NPDP是很有必要的~参与新产品开发相关的中高层管理人员&#xff0c;产品团队成员等非常适合学习NPDP。 一、什么是NPDP&#xff1f; NPDP 是产品经理国际资格认证&#xff0c;美国产品开发与管理…

【MySQL初阶】索引

1. 索引基本概念 1.1 索引介绍 索引(index)&#xff1a;是一种特殊的文件&#xff0c;包含着对数据表里所有记录的引用指针。可以对表中的一列或者多列创建索引&#xff0c;并指定索引的类型&#xff0c;各类索引有各自的数据结构实现。&#xff08;具体细节在MySQL进阶章节详…