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

    文章

    7030

    浏览量

    89036
  • 存储
    +关注

    关注

    13

    文章

    4314

    浏览量

    85846
  • MySQL
    +关注

    关注

    1

    文章

    809

    浏览量

    26569

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

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

收藏 人收藏

    评论

    相关推荐

    MySQL还能跟上PostgreSQL的步伐吗

    Percona 的老板 Peter Zaitsev最近发表一篇博客,讨论了MySQL是否还能跟上PostgreSQL的脚步。Percona 作为MySQL 生态扛旗者,Percona 开发了知名
    的头像 发表于 11-18 10:16 216次阅读
    <b class='flag-5'>MySQL</b>还能跟上PostgreSQL的步伐吗

    香港云服务器怎么部署MySQL数据库?

    在香港云服务器上部署MySQL数据库的步骤如下: 步骤 1: 更新软件包列表 首先,确保软件包列表是最新的。在终端执行以下命令: sudo apt update 步骤 2: 安装 MySQL
    的头像 发表于 11-14 16:15 176次阅读

    详解MySQL多实例部署

    详解MySQL多实例部署
    的头像 发表于 11-11 11:10 243次阅读

    LOG200评估模块

    电子发烧友网站提供《LOG200评估模块.pdf》资料免费下载
    发表于 11-09 14:23 0次下载
    <b class='flag-5'>LOG</b>200评估模块

    MySQL编码机制原理

    MyQL 编解码机制介绍 问题解答 读者问题简介 为叙述方便,以下的「我」指代读者 我们知道在 Java 是通过  JDBC 来访问数据库的,以访问 MySQL 为例,需要配置以下 url 才能访问
    的头像 发表于 11-09 11:01 243次阅读

    适用于MySQL的dbForge架构比较

    dbForge Schema Compare for MySQL 是一种工具,用于轻松有效地比较和部署 MySQL 数据库结构和脚本文件夹差异。该工具提供了 MySQL 数据库架构中所有差异的全面视图。
    的头像 发表于 10-28 09:41 210次阅读
    适用于<b class='flag-5'>MySQL</b>的dbForge架构比较

    Jtti:MySQL初始化操作如何设置root密码

    '@'localhost' IDENTIFIED BY 'your_new_password';   刷新权限以使更改生效:   FLUSH PRIVILEGES;   退出MySQL命令行工具:   exit   从此,您就成功设置了root密码。在之后的登录,需要使
    的头像 发表于 08-08 16:45 368次阅读

    MySQL知识点汇总

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

    华纳云:如何修改MySQL的默认端口

    更改MySQL的默认端口。 理解MySQL配置文件 MySQL的配置文件是控制服务器设置的关键。在不同的操作系统,这个文件可能位于不同的位置: Linux: /etc/
    的头像 发表于 07-22 14:56 310次阅读
    华纳云:如何修改<b class='flag-5'>MySQL</b>的默认端口

    MySQL的整体逻辑架构

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

    MySQL忘记root密码解决方案

    mysql登录密码为password()算法加密,解密成本太高,以下为通用方案; 原理:mysql提供了特殊启动方式,即跳过权限表验证,启动后,登录不需要提供密码; 登录后,即可修改mysql数据库的user表,重置
    的头像 发表于 04-23 16:08 702次阅读

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

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

    MySQL密码忘记了怎么办?MySQL密码快速重置方法步骤命令示例!

    MySQL密码忘记了怎么办?MySQL密码快速重置方法步骤命令示例! MySQL是一种常用的关系型数据库管理系统,如果你忘记了MySQL的密码,不必担心,可以通过一些简单的步骤来快速重
    的头像 发表于 01-12 16:06 751次阅读

    怎么简单实现由Labview读取的串口数据自增写入mysql5.7数据库

    怎么简单实现由Labview读取的串口数据自增写入mysql5.7数据库? 已实现:串口数据的接收处理 mysql5.7的安装(已测试数据库正常运行) 愿付费解决此问题(QQ:84295699)感谢
    发表于 01-11 22:05

    如何使用Golang连接MySQL

    首先我们来看如何使用Golang连接MySQL
    的头像 发表于 01-08 09:42 3379次阅读
    如何使用Golang连接<b class='flag-5'>MySQL</b>