0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
会员中心
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

MySQL中的redo log是什么

数据分析与开发 来源:程序猿阿星 作者:程序猿阿星 2021-09-14 09:40 次阅读

前言

说到MySQL,有两块日志一定绕不开,一个是InnoDB存储引擎的redo log(重做日志),另一个是MySQL Servce层的 binlog(归档日志)。

只要是数据更新操作,就一定会涉及它们,今天就来聊聊redo log(重做日志)。

redo log

redo log(重做日志)是InnoDB存储引擎独有的,它让MySQL拥有了崩溃恢复能力。

比如MySQL实例挂了或宕机了,重启时,InnoDB存储引擎会使用redo log恢复数据,保证数据的持久性与完整性。

上一篇中阿星讲过,MySQL中数据是以页为单位,你查询一条记录,会从硬盘把一页的数据加载出来,加载出来的数据叫数据页,会放入到Buffer Pool中。

后续的查询都是先从Buffer Pool中找,没有命中再去硬盘加载,减少硬盘IO开销,提升性能。

更新表数据的时候,也是如此,发现Buffer Pool里存在要更新的数据,就直接在Buffer Pool里更新。

然后会把“在某个数据页上做了什么修改”记录到重做日志缓存(redo log buffer)里,接着刷盘到redo log文件里。

理想情况,事务一提交就会进行刷盘操作,但实际上,刷盘的时机是根据策略来进行的。

小贴士:每条redo记录由“表空间号+数据页号+偏移量+修改数据长度+具体修改的数据”组成

刷盘时机

InnoDB存储引擎为redo log的刷盘策略提供了innodb_flush_log_at_trx_commit参数,它支持三种策略

设置为0的时候,表示每次事务提交时不进行刷盘操作

设置为1的时候,表示每次事务提交时都将进行刷盘操作(默认值)

设置为2的时候,表示每次事务提交时都只把redo log buffer内容写入page cache

另外InnoDB存储引擎有一个后台线程,每隔1秒,就会把redo log buffer中的内容写到文件系统缓存(page cache),然后调用fsync刷盘。

也就是说,一个没有提交事务的redo log记录,也可能会刷盘。

为什么呢?

因为在事务执行过程redo log记录是会写入redo log buffer中,这些redo log记录会被后台线程刷盘。

除了后台线程每秒1次的轮询操作,还有一种情况,当redo log buffer占用的空间即将达到innodb_log_buffer_size一半的时候,后台线程会主动刷盘。

下面是不同刷盘策略的流程图

innodb_flush_log_at_trx_commit=0

为0时,如果MySQL挂了或宕机可能会有1秒数据的丢失。

innodb_flush_log_at_trx_commit=1

为1时, 只要事务提交成功,redo log记录就一定在硬盘里,不会有任何数据丢失。

如果事务执行期间MySQL挂了或宕机,这部分日志丢了,但是事务并没有提交,所以日志丢了也不会有损失。

innodb_flush_log_at_trx_commit=2

为2时, 只要事务提交成功,redo log buffer中的内容只写入文件系统缓存(page cache)。

如果仅仅只是MySQL挂了不会有任何数据丢失,但是宕机可能会有1秒数据的丢失。

日志文件组

硬盘上存储的redo log日志文件不只一个,而是以一个日志文件组的形式出现的,每个的redo日志文件大小都是一样的。

比如可以配置为一组4个文件,每个文件的大小是1GB,整个redo log日志文件组可以记录4G的内容。

它采用的是环形数组形式,从头开始写,写到末尾又回到头循环写,如下图所示。

在个日志文件组中还有两个重要的属性,分别是write pos、checkpoint

write pos是当前记录的位置,一边写一边后移

checkpoint是当前要擦除的位置,也是往后推移

每次刷盘redo log记录到日志文件组中,write pos位置就会后移更新。

每次MySQL加载日志文件组恢复数据时,会清空加载过的redo log记录,并把checkpoint后移更新。

write pos和checkpoint之间的还空着的部分可以用来写入新的redo log记录。

如果write pos追上checkpoint,表示日志文件组满了,这时候不能再写入新的redo log记录,MySQL得停下来,清空一些记录,把checkpoint推进一下。

本文到此就结束了,下篇会聊聊binlog(归档日志)。

小结

相信大家都知道redo log的作用和它的刷盘时机、存储形式。

现在我们来思考一问题,只要每次把修改后的数据页直接刷盘不就好了,还有redo log什么事。

它们不都是刷盘么?差别在哪里?

1 Byte = 8bit

1 KB = 1024 Byte

1 MB = 1024 KB

1 GB = 1024 MB

1 TB = 1024 GB

实际上,数据页大小是16KB,刷盘比较耗时,可能就修改了数据页里的几Byte数据,有必要把完整的数据页刷盘吗?

而且数据页刷盘是随机写,因为一个数据页对应的位置可能在硬盘文件的随机位置,所以性能是很差。

如果是写redo log,一行记录可能就占几十Byte,只包含表空间号、数据页号、磁盘文件偏移量、更新值,再加上是顺序写,所以刷盘速度很快。

所以用redo log形式记录修改内容,性能会远远超过刷数据页的方式,这也让数据库的并发能力更强。

其实内存的数据页在一定时机也会刷盘,我们把这称为页合并,讲Buffer Pool的时候会对这块细说

责任编辑:haq

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • 数据
    +关注

    关注

    8

    文章

    6786

    浏览量

    88705
  • 存储
    +关注

    关注

    13

    文章

    4202

    浏览量

    85533
  • MySQL
    +关注

    关注

    1

    文章

    795

    浏览量

    26379

原文标题:聊聊 redo log 是什么?

文章出处:【微信号:DBDevs,微信公众号:数据分析与开发】欢迎添加关注!文章转载请注明出处。

收藏 人收藏

    评论

    相关推荐

    MySQL知识点汇总

    大家好,这部分被称为DQL部分,是每个学习MySQL必须要学会的部分,下面就让我来介绍MySQL的其他部分。
    的头像 发表于 08-05 15:27 344次阅读
    <b class='flag-5'>MySQL</b>知识点汇总

    MySQL的整体逻辑架构

    支持多种存储引擎是众所周知的MySQL特性,也是MySQL架构的关键优势之一。如果能够理解MySQL Server与存储引擎之间是怎样通过API交互的,将大大有利于理解MySQL的核心
    的头像 发表于 04-30 11:14 401次阅读
    <b class='flag-5'>MySQL</b>的整体逻辑架构

    labview 创建mysql 表时 设置时间 怎么在mysql是格式是date 而不是datetime?

    选择 时间日期 但是在mysql是date而不是datetime类型 ,除了sql语句创建表 ,怎么能实现创建表数据为datetime类型
    发表于 02-04 09:46

    mysql密码忘了怎么重置

    2. 打开MySQL的配置文件my.cnf或my.ini。在Windows上,该文件通常位于MySQL的安装目录下的bin文件夹;而在Linux上,该文件通常位
    的头像 发表于 12-27 16:51 5769次阅读

    瑞萨RZ/G2L核心板Linux Log目录文件详解

    为了排除系统问题,监控系统健康状况以及了解系统与应用程序的交互方式,我们需要了解各log文件的作用,以G2Lyocto文件系统为例,在系统/var/log/目录下会存放记录系统各个
    的头像 发表于 12-11 17:34 420次阅读
    瑞萨RZ/G2L核心板Linux <b class='flag-5'>Log</b>目录文件详解

    mysql配置失败怎么办

    MySQL是一款广泛使用的关系型数据库管理系统,但在配置过程可能会出现各种问题,导致配置失败。本文将详细介绍MySQL配置失败的常见原因和对应的解决方案,以帮助读者快速排查和解决问题。 一、检查
    的头像 发表于 12-06 11:03 3228次阅读

    php的mysql无法启动

    MySQL是一种常用的关系型数据库管理系统,而PHP是一种广泛应用于服务器端的脚本语言。在使用PHP开发网站或应用时,经常会碰到MySQL无法启动的问题。本文将详细介绍解决MySQL无法启动的方法
    的头像 发表于 12-04 15:59 1314次阅读

    mysqldecimal的用法

    MySQL的DECIMAL是用于存储精确数值的数据类型。DECIMAL可以存储固定精度和小数位数的值。在MySQL,DECIMAL数据类型有两个参数:精度和小数位数。精度指的是数字
    的头像 发表于 11-30 10:45 986次阅读

    mysql和sql server区别

    MySQL和SQL Server是两种常见的关系型数据库管理系统(RDBMS),用于存储和管理数据库。虽然它们都支持SQL语言,但在其他方面存在一些显著的区别。以下是MySQL和SQL Server
    的头像 发表于 11-21 11:07 1434次阅读

    MySQL忘记root密码解决方案

    MySQL 是一个流行的开源关系型数据库管理系统,被广泛应用于 web 应用程序和服务器环境MySQL的root用户是具有最高权限和特权的用户,可以操作所有数据库和表。如果忘记了root用户
    的头像 发表于 11-21 11:04 594次阅读

    MySQL导出的步骤

    MySQL是一种常用的关系型数据库管理系统,用于存储和管理大量的结构化数据。在实际应用,我们经常需要将MySQL数据库的数据导出到其他地方,如备份数据、数据迁移、数据分析等。下面是
    的头像 发表于 11-21 10:58 725次阅读

    MySQL增删改查的例子

    MySQL是一种常用的关系型数据库管理系统,它具有强大的数据处理和数据存储能力。在MySQL,我们可以使用各种命令来进行数据的增加、删除、修改和查询操作。下面将详细介绍MySQL
    的头像 发表于 11-16 15:39 693次阅读

    mysql主从复制的原理

    其重放在自己的数据库。 binlog(Binary Log): 是MySQL中用于记录主数据库上的所有数据变更的二进制文件。
    的头像 发表于 11-16 14:18 447次阅读

    mysql如何实现主从复制的具体流程

    。 配置主服务器 (1) 在主服务器上修改MySQL的配置文件my.cnf,打开二进制日志功能,将参数 log_bin 设置为ON,并指定二进制日志文件的名称和路径,例如设置 log_bin=/var
    的头像 发表于 11-16 14:10 729次阅读

    Log4cpp优势及优点

    1、log4cpp概述 Log4cpp是一个开源的C++类库,它提供了C++程序中使用日志和跟踪调试的功能,它的优点如下: 提供应用程序运行上下文,方便跟踪调试; 可扩展的、多种方式记录日志,包括
    的头像 发表于 11-09 14:27 632次阅读
    <b class='flag-5'>Log</b>4cpp优势及优点