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

    文章

    6511

    浏览量

    87581
  • 存储
    +关注

    关注

    12

    文章

    3854

    浏览量

    84646
  • MySQL
    +关注

    关注

    1

    文章

    774

    浏览量

    25997

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

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

收藏 人收藏

    评论

    相关推荐

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

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

    mysql密码忘了怎么重置

    mysql密码忘了怎么重置  MySQL是一种开源的关系型数据库管理系统,密码用于保护数据库的安全性和保密性。如果你忘记了MySQL的密码,可以通过以下几种方法进行重置。 方法一:使用MySQ
    的头像 发表于 12-27 16:51 836次阅读

    安装sqlyog之前要装mysql

    在安装 SQLyog 前是否需要安装 MySQL 取决于您的情况。MySQL 是一个关系型数据库管理系统,而 SQLyog 是一个可视化数据库管理工具,主要用于管理和操作 MySQL 数据库。 对于
    的头像 发表于 11-21 11:02 559次阅读

    MySQL导出的步骤

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

    mysql主从复制的原理

    MySQL主从复制是一种数据库复制技术,它允许将一个MySQL数据库的更新操作自动复制到其他MySQL数据库上的过程。主要通过MySQL的binlog(二进制日志)和relay
    的头像 发表于 11-16 14:18 267次阅读

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

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

    Log4cpp优势及优点

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

    windows环境下mysql的安装

    1 下载并安装MySQL 首先输入如下命令下载Yum Repository,大概25KB的样子 [root @localhost ~ ]# wget - i - c http
    的头像 发表于 10-08 15:29 278次阅读
    windows环境下<b class='flag-5'>mysql</b>的安装

    基于Rust的Log日志库介绍

    Rust是一门系统级编程语言,因其安全性、高性能和并发性而备受欢迎。在Rust应用程序中,日志记录是一项非常重要的任务,因为它可以帮助开发人员了解应用程序的运行情况并解决问题。Rust的Log库提供
    的头像 发表于 09-19 14:49 2079次阅读

    SQLite和MySQL区别

    SQLite和MySQL区别  SQLite和MySQL是当前使用最普遍的关系型数据库软件,虽然它们都是关系型数据库,但SQLite和MySQL以不同的方式处理数据和执行查询。在使用SQLite
    的头像 发表于 08-28 17:09 2621次阅读

    MySQL运维常用脚本

    进入MySQL:启动MySQL Command Line Client(MySQL的DOS界面),直接输入安装时的密码即可。此时的提示符是:mysql>
    的头像 发表于 07-29 11:23 388次阅读

    MySQL三种日志讲解

    MySQL 日志包含了错误日志、查询日志、慢查询日志、事务日志、二进制日志等,如果存储引擎使用的是 InnoDB ,二进制日志(binlog)和事务日志(包括redo log和undo log
    的头像 发表于 07-25 11:15 457次阅读
    <b class='flag-5'>MySQL</b>三种日志讲解

    mysql运维实用脚本序列~

    进入MySQL:启动MySQL Command Line Client(MySQL的DOS界面),直接输入安装时的密码即可。此时的提示符是:mysql>
    的头像 发表于 07-16 15:25 659次阅读

    PTP Clock Manager for Linux Message Log 手册

    PTP Clock Manager for Linux Message Log 手册
    发表于 07-03 20:29 2次下载
    PTP Clock Manager for Linux Message <b class='flag-5'>Log</b> 手册

    Linux中如何使用Docker安装MySQL

    如果您是 MySQL 的新手或希望快速轻松地安装 MySQL 数据库的人,那么本文适合您,在本文中,我们将学习如何在 Linux 中使用 Docker 和 Docker compose 设置 MySQL。 让我们首先设置
    的头像 发表于 05-12 16:22 3116次阅读
    Linux中如何使用Docker安装<b class='flag-5'>MySQL</b>