《The Art of InnoDB》第二部分|第4章:深入结构-磁盘结构-redo log

4.3 redo log

目录

4.3 redo log

4.3.1 redo log 介绍

4.3.2 redo log 的作用

4.3.3 redo log file 结构

4.3.4 redo log 提交逻辑

4.3.5 redo log 持久化逻辑

4.3.6 redo log 检查点

4.3.7 小结

未完待续....


        上文我们学习了表空间,下面我们来介绍日志系统,InnoDB 有两块非常重要的日志,一个是undo log,另外一个是redo log,前者用来保证事务的原子性以及InnoDB的MVCC,后者用来保证事务的持久性。

        InnoDB存储引擎使用专门的日志文件来存储重做日志(Redo Log),而不是将其保存在表空间内。这些文件称作redo log files,它们是确保事务的持久性和支持数据库崩溃恢复机制的核心部分。Redo log buffer中的数据会定期刷新到这些日志文件中,从而实现数据的持久化。

        redo log文件通常有两个或更多,它们以ib_logfile0、ib_logfile1等形式存在,并可以在MySQL的数据目录中找到,该目录通常由<datadir>配置指定。这些文件的大小(innodb_log_file_size)和数量(innodb_log_files_in_group)可在MySQL的配置文件中设置。配置这些日志文件时,需要平衡事务的长短,以及崩溃恢复所需的时间。重做日志性能对InnoDB的整体性能有显著影响,主要取决于磁盘的I/O性能。置于高速磁盘如SSD上的重做日志文件可以提升数据写入速度,而足够大的重做日志缓冲区(由innodb_log_buffer_size配置)则能减少磁盘写入频率,从而优化性能。(这通常需要专业的文件存储知识)

4.3.1 redo log 介绍

        InnoDB存储引擎通过重做日志文件(通常简称为redo log)来确保事务的持久性,并支持数据库在崩溃后的恢复。纪录事务的变更,这些变更会先写入到内存的重做日志缓冲区,然后在事务提交时刷新到磁盘上的重做日志文件中。这种基于预写日志协议(Write-Ahead Logging, WAL)的过程确保了,即使数据库崩溃,事务的更改仍然安全且可以被重放以恢复数据库。

        redolog 在性能上的贡献就是将随机存储转化为顺序存储,加速数据修改提交的速度;通过定时刷盘策略,在引擎不忙的时候将redo log的数据刷回磁盘。这样的策略能够提高峰值的写入速度从而提高引擎的性能。

        redolog 在 MySQL中使用固定大小的循环结构,它仅记录那些尚未持久化到磁盘的数据更改。一旦这些更改被成功刷新(写入)到磁盘上,相关的日志信息就会被标记为可以覆盖,以便为新的数据更改腾出空间。


4.3.2 redo log 的作用

        InnoDB存储引擎采用了两层存储架构,一层是速度较慢的持久化存储设备(如磁盘),另一层是速度较快的主存储器(RAM)。为了减少对慢速持久存储的访问频率,数据页会被缓存到快速的内存中。当需要重新访问这些数据时,系统可以直接从内存中获取数据页的副本,而无需从磁盘读取,从而提高数据访问效率。

  • 换入:将未缓存的页从磁盘家在进来的过程称为换入。
  • 换出:如果可用空间不足以放下页,则某些页会被移除缓存,刷回到磁盘。如果页的内容与磁盘是同步的(已经刷写过或未改动过)并且该页未被引用,则可立即换出。如果当前页是脏页,则必须在刷写后才能换出,如果当前页正在被引用则不允许换出
  • 脏页:在缓存中的页如果被修改,但还未刷回到磁盘,就称这些页为脏页。

        所有对缓冲区的更改都保留在内存中,直到最终被写回到磁盘上,由于不允许任何其他进程修改磁盘上的这些文件,所以这个同步过程是单向的。只能是内存--》磁盘,而不能反过来进行。页缓存让数据库更好的控制内存管理和磁盘访问。

        缓存设计的另一个比较重要的问题是持久性的问题,如果数据库崩溃,则未刷写的数据都会丢失,为了确保所有更改都被持久化,redolog的检查点机制和刷脏策略会协同工作,将脏页刷新到磁盘中,而后对应的redolog记录才会被丢弃。可以看出 redolog 就专门解决崩溃后数据恢复的问题。


4.3.3 redo log file 结构

redo log file 记录的是数据记录的逻辑变化,而不是物理变化

  • 逻辑变化指的是数据记录的抽象变化,例如一条SQL语句的执行结果。例如,UPDATE table SET column='value' WHERE id=1; 这条语句的逻辑变化是“将id为1的记录的列column的值更改为'value'”。

  • 物理变化则涉及到数据存储在磁盘上的实际物理位置的变化。物理变化会涉及到具体的数据页和字节偏移等细节。

每个Log Record通常包含以下部分:

  • Log Sequence Number (LSN):一个唯一的序列号,表示日志记录在redo log文件中的位置。
  • Table ID:引起页面变更的表的标识符。
  • Page Number:变更发生在数据库哪个页上。
  • Data Before Change:变更前的数据,可以用于回滚操作。
  • Data After Change:变更后的数据,用于恢复操作。
  • Other Info:其他重要信息,如事务ID,类型(insert、update、delete)等。

上述内容是一个概念性描述,帮助读者理解redolog的结构和工作原理。实际的InnoDB重做日志格式会更加复杂和专门化,包括压缩和优化,以提高存储效率和恢复性能。重做日志文件是二进制格式,一般无法直接阅读。在实际应用中,管理员需要使用专业工具来查看或分析这些日志。


4.3.4 redo log 提交逻辑

redolog在事务操作过程中存在两种不同的状态,prepare和commit状态,也就是我们通常说的二段提交

1、事务在操作阶段:例如执行了一条sql语句后,没提交时,这条语句相应的redolog会被写入,log记录首先会存储在logbuffer中,这时对应的binlog也会被写入,稍后会进行刷盘。(这时redolog处于prepare状态)

2、事务在提交准备阶段:InnoDB会保证redolog和binlog都持久化到磁盘上,然后再进行事务提交。(通过操作系统的fsync系统调用)

3、事务在最终提交阶段:InnoDB会将事务标记为已完成,并在redolog中写入提交commit标记,这时redolog 中 commit不一定立即刷回到磁盘,这取决于innodb_flush_log_at_trx_commit的配置(下文会讲)。(这时redolog处于commit状态

4、事务在回滚阶段:事务回滚,redolog不会发生变化,有读者可能会提出疑问,如果不变化崩溃恢复的时候不就数据不一致了吗,其实在binlog中,每个事务结束时都会有一个特殊的事件(event)来表示事务的结束。这通常是一个XID event(用于提交事务)或者 ROLLBACK event(用于回滚事务)。如果事务成功提交,会在binlog中记录一个XID event,表示这个事务已经成功完成并需要被复制和应用到从库(slave)上。如果事务回滚,则会在binlog中记录一个ROLLBACK event,表示这个事务被回滚,从库在重放日志时也应该回滚这个事务。所以即使redolog不进行修改,数据也能保证一致性。


4.3.5 redo log 持久化逻辑

redo log存在如下三种存储状态

这三种状态分别是:

1、存在 redo log buffer 中,物理上是在 MySQL 进程内存中,就是图中的蓝部分;

2、写到磁盘 (write),但是没有持久化(fsync),物理上是在文件系统的 page cache 里面,也就是图中的绿色部分;

3、持久化到磁盘,对应的是 hard disk,也就是图中的紫色部分。日志写到 redo log buffer 是很快的,wirte 到 page cache 也差不多,但是持久化到磁盘的速度就慢多了。

通过上图我们知道了,为了性能,事务执行完成时 redo log数据有可能还在log buffer中或者pageCache中,那么什么时候,这些日志数据会确定被刷回磁盘呢?以下列出了一些Redolog持久化的时机

事务提交时:innodb_flush_log_at_trx_commit = 1时,当一个事务被提交,其对应的所有修改必须被写入redo log,以确保即使数据库发生崩溃,也能够通过重做日志来恢复这些修改。这是遵循ACID原则中的持久性(Durability)。

InnoDB存储引擎通过innodb_flush_log_at_trx_commit参数控制redo log的刷新策略,该参数有三个设置选项:

  • 当设置为0时,事务在提交时不会立即将redo log写入磁盘,而是保留在redo log buffer中。这些日志由后台进程每秒刷新到磁盘一次。这意味着在数据库实例崩溃的情况下,最多可能会丢失最后一秒内的事务数据。
  • 当设置为1时,事务提交会伴随每次redo log的同步持久化到磁盘操作。具体来说,每个事务提交都会执行一个fsync操作。这是最为保守的设置,即便发生系统宕机,已提交的事务也不会丢失。
  • 当设置为2时,事务提交只会将redo log写入系统的page cache,并不保证立即写入磁盘。这种配置下,事务提交时仅涉及write操作,因此在数据库实例崩溃时不会丢失事务,但如果发生系统宕机,仍有可能导致已提交事务的丢失。

通常,redo log的持久化程度越高,对性能的影响也越大。在标准操作中,推荐将innodb_flush_log_at_trx_commit的值设置为1,以确保数据的完整性和安全性。然而,在面临系统高负载的高峰时段,可以临时将其调整为2以提高性能,尽管这样做会稍微增加数据丢失的风险。

InnoDB允许多个事务并发地将日志复制到log buffer。因此,当单个事务提交并触发redo log写入文件时,可能会隐式地同时将其他事务的redo log也写入,这就实现了所谓的“组提交”(group commit)机制,它可以优化日志写入操作,提高整体吞吐量。

除了事务提交还有如下几个情况会导致redo log记录被刷到磁盘上

  • 定期刷新:在事务运行过程中,数据库会定期将缓存中的redo log写入到磁盘上的redo log文件中。这是由InnoDB存储引擎的内部刷新机制决定的,通常是为了释放redo log buffer中的空间,或由于其他触发了刷新的操作,如长时间运行的事务。
  • 缓冲池不足时:如果InnoDB的redo log buffer(内存中的缓冲区)接近满载,那么系统会自动将缓冲区的内容刷新到磁盘上,即使事务尚未提交。
  • 检查点发生时:InnoDB通过创建检查点(checkpoint)来减少崩溃恢复时间,这涉及将当前记载在redo log中的所有数据修改同步到磁盘上的数据文件。此时,redo log同时也会被写入磁盘。

        Redo log的写入策略旨在平衡性能与数据持久性。频繁的写入可以降低数据丢失的风险,但可能会对性能产生负面影响,特别是当磁盘I/O成为瓶颈时。相反,较少的写入可以提高性能,但在发生崩溃的时候可能导致更多的数据丢失。数据库管理员经常需要根据具体的应用场景和性能要求来调整redo log的配置和写入策略。


4.3.6 redo log 检查点

        之前我们提到过数据库崩溃时,则未刷写的数据都会丢失,而redolog检查点机制和刷脏策略会协同工作,将脏页刷新到磁盘中。检查点(Checkpoint)是Redo Log系统中的一个关键概念,用于优化日志处理并减少系统崩溃恢复的时间。redologfile是一个可以被复用的文件环。

而设置检查点的主要目的是:

  • 限制Redo Log的大小:由于Redo Log通常是固定的大小,并采用循环利用的方式,检查点帮助确定哪些Redo Log记录不再需要(因为相关的脏页已经被持久化到磁盘上),从而可以被重用。
  • 减少崩溃恢复时间:在发生崩溃时,恢复过程只需要从最近的检查点开始应用Redo Log记录,而不是从头开始。这样可以显著减少恢复所需的时间。

        InnoDB维护了检查点的位置,该位置是Redo Log中的一个标记点,表示到此为止的所有数据页的修改都已被写入到了磁盘上。这意味着,Redo Log中位于检查点之前的部分可以被标记为不再需要,并且在Redo Log空间满时可以被覆盖。

检查点的变化通常是自动发生的,并且是由InnoDB存储引擎根据多种因素来决定:

  • 当缓冲池中脏页的数量达到一定阈值时。
  • 在特定的时间间隔内(比如每秒钟或者每分钟)。
  • 当Redo Log的空间使用接近其配置的限制时。

检查点操作的主要过程通常包括以下步骤:

  1. 选择检查点位置:InnoDB选择一个Redo Log序列号(LSN),确保此位置之前的所有事务都已被写入磁盘。
  2. 刷新脏页:InnoDB将所有LSN小于或等于检查点LSN的缓冲池中的脏页刷新到磁盘。
  3. 记录检查点:检查点信息(包括LSN)被写入到一个特定的系统表空间文件中,以便在数据库启动时进行参考。

        通过这种方式,检查点机制帮助InnoDB存储引擎平衡了性能和数据完整性的要求,确保事务的ACID属性,同时提高了系统的整体效率。


4.3.7 小结

        本文主要描述了InnoDB存储引擎中重做日志(redo log)的功能、结构和作用。redo log如何用于确保事务的持久性,并在数据库崩溃后提供恢复能力。它还详细介绍了redo log文件的存储位置、配置方法以及如何通过预写式日志协议(WAL)记录事务变更。此外,内容还涉及了redo log的二阶段提交过程、持久化策略、文件结构和检查点(checkpoint)机制。

Redo Log Files 存储

        重做日志在表空间外单独存储,位于称为redo log files的专用文件中。这些文件,通常命名为ib_logfile0、ib_logfile1等,位于MySQL的数据目录<datadir>下。Redo log files的尺寸(由innodb_log_file_size参数控制)和文件数量(由innodb_log_files_in_group参数控制)可以配置,以确保处理效率与恢复速度的平衡。

Redo Log 的职责

        Redo log利用预写式日志协议(WAL)记录事务更改,首先将这些更改写入内存中的redo log buffer,然后在适当的时机刷新到磁盘上。这个机制不仅保证了事务的持久性,还将I/O操作由随机写变为顺序写,提高了数据提交的速度。适当配置redo log对于提升InnoDB的性能至关重要。

持久化策略

        在事务的操作过程中,redo log遵循二阶段提交协议,即prepare和commit阶段。innodb_flush_log_at_trx_commit参数定义了何时将redo log buffer中的数据持久化到磁盘,这直接关系到系统在崩溃时能够恢复多少数据。

Redo Log文件的结构

        Redo log文件包含一系列格式化的日志记录,每个记录包含LSN、表ID、页码以及事务变更前后的数据等信息。由于redo log的二进制格式,通常需要专业工具来进行阅读和分析。

检查点机制

        检查点是InnoDB日志系统中的一个高效机制,用于标记在某一点所有修改都已写入磁盘。它限制了redo log的空间需求,并在系统崩溃时缩短了数据恢复时间。通过自动设置检查点,InnoDB有效地平衡了性能和数据完整性的需求。

未完待续....

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

vue从flask获取数据并显示

记录一个前后端分离遇到的问题&#xff0c;即vue前端从flask后端获取数据。具体描述如下&#xff1a;flask只负责连接数据库并获取数据库的数据&#xff0c;并返回给前端vue&#xff1b;vue则需要获取后端返回的数据并显示。 方法如下&#xff0c;分别用一个vue组件和一个flas…

torch.nn.embedding的介绍和用法

nn.Embedding 是 PyTorch 中的一个神经网络层&#xff0c;它主要用于将离散的、高维的数据&#xff08;如词索引&#xff09;转换为连续的、低维的空间中的稠密向量表示。在自然语言处理&#xff08;NLP&#xff09;中&#xff0c;这个层通常用于实现词嵌入&#xff08;Word Em…

ES6内置对象 - Map

Map&#xff08;Map对象保存键值对&#xff0c;键值均不限制类型&#xff09; 特点&#xff1a; 有序&#xff08;Set集合是无序的&#xff09;&#xff1b;键值对&#xff08;键可以是任意类型&#xff09;&#xff1b;键名不能重复&#xff08;如果重复&#xff0c;则覆盖&…

自考《计算机网络原理》考前冲刺

常考选择填空 1、计算机网络的定义&#xff1a;计算机网络是互连的、自治的计算机的集合。 2、协议的定义&#xff1a;协议是网络通信实体之间在数据交换过程中需要遵循的规则或约定 3、协议的3个要素 (1) 语法&#xff1a;定义实体之间交换信息的格式与结构&#xff0c;或…

经典Go知识点总结

开篇推荐 来来来,老铁们,男人女人都需要的技术活 拿去不谢:远程调试,发布网站到公网演示,远程访问内网服务,游戏联机 推荐链接 1.无论sync.Mutex还是其衍生品都会提示不能复制,但是能够编译运行 加锁后复制变量&#xff0c;会将锁的状态也复制&#xff0c;所以 mu1 其实是已…

Docker Container(容器)

"在哪里走散&#xff0c;你都会找到我~" Docker 容器 什么是容器&#xff1f; 通俗来讲&#xff0c;容器是镜像运行的实体。我们对于镜像的认知是&#xff0c;“存储在磁盘上的只读文件”。当我们启动一个容器的本质&#xff0c;就是启动一个进程&#xff0c;即容器…

c语言字符函数和字符串函数

目录 1. 字符分类函数2. 字符转换函数3. strlen的使用和模拟实现4. strcpy的使用和模拟实现5. strcat的使用和模拟实现6. strcmp的使用和模拟实现7. strncpy函数的使用8. strncat函数的使用9. strncmp函数的使用10. strstr的使用和模拟实现11. strtok函数的使用12. strerror函数…

【kubernetes】二进制部署k8s集群之master节点和etcd数据库集群(上)

目录 前言&#xff1a;关于整个k8s集群的主机规划以及本文部署架构 步骤一&#xff1a;完成操作系统初始化配置 步骤二&#xff1a;完成etcd集群部署 关于etcd集群 ①准备签发证书环境 ②先完成单独一个节点的部署 ③通过部署好的etcd01节点 完成另外两个节点的部署 拓展…

大数据之Flink优化

文章目录 导言&#xff1a;Flink调优概览第1章 资源配置调优1.1 内存设置1.1.1 TaskManager 内存模型1.1.2 生产资源配置示例 1.2 合理利用 cpu 资源1.2.1 使用 DefaultResourceCalculator 策略1.2.2 使用 DominantResourceCalculator 策略1.2.3 使用DominantResourceCalculato…

《隐私计算简易速速上手小册》第8章:隐私计算对机器学习和 AI 的影响(2024 最新版)

文章目录 8.1 机器学习中的隐私问题8.1.1 基础知识8.1.2 主要案例:使用差分隐私的机器学习8.1.3 拓展案例 1:基于隐私的数据聚合8.1.4 拓展案例 2:保护隐私的推荐系统8.2 使用隐私计算加强 AI 安全8.2.1 基础知识8.2.2 主要案例:使用同态加密的数据分析8.2.3 拓展案例 1:安…

什么是调制比

一般情况下&#xff0c;调制波和载波的最大幅值是不一样的。 正弦波的最大幅值低于三角波的最大幅值。 这样做的目的就是产生最大占空比&#xff08;2000W逆变器中最大占空比是80%&#xff09; 调制波就是正弦波的最大幅值比三角载波的最大幅值 问题1 为什么调制波要小于1&…

pdffactory pro 8中文破解版

详细介绍 PdfFactory&#xff0c;PDF文档虚拟打印机&#xff0c;无须Acrobat即可创建Adobe PDF文件&#xff0c;创建PDF文件的方法比其他方法更方便和高效。支持将多个文档整合到一个PDF文件、增加字体和便签、PDF加密、去水印、压缩优化。 FinePrint&#xff0c;Windows虚拟…

SpringBoot 3 新特性

目录 1. GraalVM2. 支持虚拟线程3. HTTP Interface 1. GraalVM 使用GraalVM将SpringBoot应用程序编译成本地可执行的镜像文件&#xff0c;可以显著提升启动速度、峰值性能以及减少内存应用。传统的应用都是编译成字节码&#xff0c;然后通过JVM解释并最终编译成机器码来运行&a…

2.23作业

1.自己实现单向循环链表的功能 //loop_list.c#include"loop_list.h" //创建单向循环链表 loop_p create_head() {loop_p H(loop_p)malloc(sizeof(loop_list));if(HNULL){printf("空间申请失败\n");return NULL;}H->len0;H->nextH;return H; }//创建…

【前端素材】推荐优质后台管理系统Follow平台模板(附源码)

一、需求分析 当我们从多个层次来详细分析后台管理系统时&#xff0c;可以将其功能和定义进一步细分&#xff0c;以便更好地理解其在不同方面的作用和实际运作。 1. 结构层次 在结构层次上&#xff0c;后台管理系统可以分为以下几个部分&#xff1a; a. 核心功能模块&#…

计算机组成原理

为什么你需要学习计算机组成原理&#xff1f; 计算机底层知识的“第一课” 其实在看完各个大学的计算机课程设计之后。&#xff0c;你会发现&#xff0c;它们都有差不多十来门核心课程。其中&#xff0c;“计算机组成原理”是入门和底层层面的第一课。 虽然计算机系的学生毕业后…

基于自然语言的跨模态行人重识别技术研究

基于自然语言的跨模态行人重识别技术研究万方数据知识服务平台 第二章 跨模态行人重识别理论基础 2.1 文本-图像检索技术 基于文本信息的跨模态行人重识别本质是基于文本-图像两个模态的行人重识别&#xff0c; 由于跨的两个模态分别是文本和图像&#xff0c; 所以其解决思路…

WordPress前端如何使用跟后台一样的Dashicons图标字体?

很多站长都喜欢在站点菜单或其他地方添加一些图标字体&#xff0c;常用的就是添加Font Awesome 图标和阿里巴巴矢量库图标iconfont。其实我们使用的 WordPress 本身就有一套管理员使用的官方图标字体 Dashicons&#xff0c;登录我们站点后台就能看到这些图标字体。那么有没有可…

Linux项目部署

目录 一.安装JDK二.安装Tomcat三.安装MySQL四.部署项目 一.安装JDK 上传jdk安装包 jdk-8u151-linux-x64.tar.gz 进入opt目录&#xff0c;将安装包拖进去 2. 解压安装包 [rootlocalhost opt]# cd /usr/local/ [rootlocalhost local]# mkdir java 再次进入到opt目录解压 [root…

Android14之input高级调试技巧(一百八十八)

简介&#xff1a; CSDN博客专家&#xff0c;专注Android/Linux系统&#xff0c;分享多mic语音方案、音视频、编解码等技术&#xff0c;与大家一起成长&#xff01; 优质专栏&#xff1a;Audio工程师进阶系列【原创干货持续更新中……】&#x1f680; 优质专栏&#xff1a;多媒…