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

    文章

    7315

    浏览量

    93998
  • 存储
    +关注

    关注

    13

    文章

    4701

    浏览量

    89582
  • MySQL
    +关注

    关注

    1

    文章

    897

    浏览量

    29241

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

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

收藏 人收藏
加入交流群
微信小助手二维码

扫码添加小助手

加入工程师交流群

    评论

    相关推荐
    热点推荐

    工业数据台支持接入MySQL数据库吗

    工业数据台完全支持接入MySQL数据库 ,且通过数据同步、集成与治理等技术手段,能够充分发挥MySQL在数据存储与事务处理方面的优势,同时弥补其在数据分析与共享能力上的不足,具体分析如下: 技术
    的头像 发表于 12-04 11:23 199次阅读
    工业数据<b class='flag-5'>中</b>台支持接入<b class='flag-5'>MySQL</b>数据库吗

    Texas Instruments LOG300DEVM和LOG300RGTEVM评估模块数据手册

    单一器件LOG300。该评估模块可工作在3V至5.2V的单电源范围内。对数检测器模块可以接受25µV至1.6Vp的输入,而整个模拟前端(LNA + 对数检测器的组合)支持6µVp至200mVp的输入
    的头像 发表于 07-21 10:15 473次阅读
    Texas Instruments <b class='flag-5'>LOG</b>300DEVM和<b class='flag-5'>LOG</b>300RGTEVM评估模块数据手册

    Texas Instruments LOG200EVM放大器评估模块 (EVM)数据手册

    Texas Instruments LOG200EVM放大器评估模块 (EVM) 是一个用于评估LOG200的开发平台,LOG200是一款精密、高速对数放大器,集成了光电二极管偏置和暗电流校正功能
    的头像 发表于 07-21 09:51 470次阅读
    Texas Instruments <b class='flag-5'>LOG</b>200EVM放大器评估模块 (EVM)数据手册

    MySQL数据备份与恢复策略

    数据是企业的核心资产,MySQL作为主流的关系型数据库管理系统,其数据的安全性和可靠性至关重要。本文将深入探讨MySQL的数据备份策略、常用备份工具以及数据恢复的最佳实践,帮助运维工程师构建完善的数据保护体系。
    的头像 发表于 07-14 11:11 478次阅读

    企业级MySQL数据库管理指南

    在当今数字化时代,MySQL作为全球最受欢迎的开源关系型数据库,承载着企业核心业务数据的存储与处理。作为数据库管理员(DBA),掌握MySQL的企业级部署、优化、维护技能至关重要。本文将从实战角度出发,系统阐述MySQL在企业环
    的头像 发表于 07-09 09:50 523次阅读

    介绍三种常见的MySQL高可用方案

    在生产环境,为了确保数据库系统的连续可用性、降低故障恢复时间以及实现业务的无缝切换,高可用(High Availability, HA)方案至关重要。本文将详细介绍三种常见的 MySQL 高可用
    的头像 发表于 05-28 17:16 1006次阅读

    MySQL数据库是什么

    MySQL数据库是一种 开源的关系型数据库管理系统(RDBMS) ,由瑞典MySQL AB公司开发,后被Oracle公司收购。它通过结构化查询语言(SQL)进行数据存储、管理和操作,广泛应用于Web
    的头像 发表于 05-23 09:18 924次阅读

    全栈开发进阶指南:LuatOS-log库从入门到实战!

    本文将带你深入探索LuatOS系统log库的核心原理与实战技巧,通过代码示例解析日志管理、错误追踪及性能优化的最佳实践,助力全栈工程师构建更稳健的物联网应用。 今天,我们一起来认识LuatOS
    的头像 发表于 05-15 16:12 2679次阅读
    全栈开发进阶指南:LuatOS-<b class='flag-5'>log</b>库从入门到实战!

    解锁LuatOS-log库:全栈工程师的日志管理实战课!

    针对全栈开发者设计的实战教程,本文聚焦LuatOS平台log库的高效使用,从基础配置到高级调试策略,手把手教你搭建可扩展的日志系统,提升项目维护效率。 今天,我们一起来认识LuatOS的log
    的头像 发表于 05-12 15:23 1325次阅读
    解锁LuatOS-<b class='flag-5'>log</b>库:全栈工程师的日志管理实战课!

    恩智浦解读Zephyr log系统的使用 Zephyr的shell和log功能介绍

    之前 我们从 0 开始新建了一个简单的 Zephyr 应用- 从0开始打造属于自己的HelloWorld ,本期就 带着大家熟悉一下 Zephyr 的 shell 和 log 系统。 首先给大家介绍
    的头像 发表于 02-27 09:19 1718次阅读
    恩智浦解读Zephyr <b class='flag-5'>log</b>系统的使用 Zephyr的shell和<b class='flag-5'>log</b>功能介绍

    使用插件将Excel连接到MySQL/MariaDB

    ,可以快速地将数据从 MySQL 或 MariaDB 加载到 Excel,立即从数据库刷新 Excel 工作簿的数据,编辑这些数据,并将它们保存回 MySQL。之后您能够像使用的 Excel 工作表一样
    的头像 发表于 01-20 12:38 1144次阅读
    使用插件将Excel连接到<b class='flag-5'>MySQL</b>/MariaDB

    适用于MySQL和MariaDB的.NET连接器

    支持 ORM 的适用于 MySQL 和 MariaDB 的 .NET 连接器 dotConnect for MySQL 是一种高性能 ADO.NET 数据提供程序,可在开发 MySQL 的应用程序
    的头像 发表于 01-16 14:17 797次阅读
    适用于<b class='flag-5'>MySQL</b>和MariaDB的.NET连接器

    MySQL数据库的安装

    MySQL数据库的安装 【一】各种数据库的端口 MySQL :3306 Redis :6379 MongoDB :27017 Django :8000 flask :5000 【二】MySQL 介绍
    的头像 发表于 01-14 11:25 866次阅读
    <b class='flag-5'>MySQL</b>数据库的安装

    windows服务器备份mysql脚本

    :天,超过就删除backup_keep_time = 30# 此列表的数据库将不会备份,下面是默认的基础数据库。ignore_database = ['Database','information_schema','mysql','sys','perf
    的头像 发表于 01-02 09:14 670次阅读

    数据库数据恢复—Mysql数据库表记录丢失的数据恢复流程

    Mysql数据库故障: Mysql数据库表记录丢失。 Mysql数据库故障表现: 1、Mysql数据库表无任何数据或只有部分数据
    的头像 发表于 12-16 11:05 1003次阅读
    数据库数据恢复—<b class='flag-5'>Mysql</b>数据库表记录丢失的数据恢复流程