暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

MySQL 数据库redo日志简介

原创 蔡璐 2024-08-26
47

1、什么是redo日志

简单来说redo日志就是Innodb存储引擎用来记录数据库数据页变化的日志文件,在崩溃恢复时用作数据恢复。

因为MySQL数据库页面访问都需要在内存中进行,对于一个已经提交的变更事务就需要将数据页持久化到磁盘中。如果直接对修改的数据页进行持久化会存在以下两个问题:

  1. 直接刷新一个完整的数据页太浪费
  2. 一个事务中修改的数据页分布是随机的,如果直接刷新数据页需要进行随机I/O的读写,对性能影响较大。

这里就会有人说数据页终究不是还是要刷新到磁盘吗? 是的,数据页最终还是会刷新到磁盘,但在保证数据持久化的前提下进行异步刷新可以充分利用资源,提高数据库的性能。

如何实现异步刷新数据页,但是也能保证数据在实例异常崩溃的情况下还能保证数据不丢失呢?

只需要记录数据页修改的内容并把所有数据页修改记录存储到一份数据页中并持久化,然后数据页通过异步刷新到磁盘;即可以保证数据页变化持久化并提高性能的同时也能充分利用磁盘资源。
这样带来以下好处:

  1. redo日志占用空间小,只需要存储表空间id、页号和偏移量等少量信息即可。
  2. redo日志顺序写入磁盘,产生的多条redo日志是按照顺序写入磁盘。

那么MySQL是如何记录数据页的变化呢?

2、redo日志格式

redo日志包含redo日志缓冲区和redo日志文件。

redo日志缓冲区和redo日志都是有若干个512大小的block组成,redo日志持久化刷新就是把缓冲区的block镜像写入redo日志文件中。

block中存储MTR,但是如果一个sql中产生的redo日志很多有可能一个MTR存储在多个block中。

每个MTR可能包含有多条redo日志。

image.png

那么说到这里MTR是个什么东西呢?

MTR是MySQL对底层页面进行一次原子访问的过程称为一个Mini-Transaction即MTR。

一个MTR可以包含一组redo日志,在MySQL进行崩溃恢复时,需要把这一组redo日志作为一个不可分割的整体来处理。

一个事务可以包含若条sql语句,每一条sql语句可能包含若干个MTR,每一个MTR又包含多条redo日志,那么他们的关系就可以由以下图例表示:

image.png

「喜欢这篇文章,您的关注和赞赏是给作者最好的鼓励」
关注作者
【版权声明】本文为墨天轮用户原创内容,转载时必须标注文章的来源(墨天轮),文章链接,文章作者等基本信息,否则作者和墨天轮有权追究责任。如果您发现墨天轮中有涉嫌抄袭或者侵权的内容,欢迎发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

评论