Innodb之redo日志

Innodb引擎执行流程
在这里插入图片描述

redo log

​ MySQL中的redo log(重做日志)是实现WAL(预写式日志)技术的关键组件,用于确保事务的持久性和数据库的crash-safe能力。借用《孔乙己》中酒店掌柜使用粉板记录赊账的故事,可以形象地解释redo log的工作原理和其在MySQL中的作用。

工作原理
  • 粉板(redo log)

​ MySQL中的redo log充当了酒店掌柜的粉板角色。当有数据更新操作时,InnoDB引擎首先将这些变更写入到redo log中,并同时更新内存。这一步完成后,更新操作即视为完成。这个过程非常快,因为写入redo log通常比直接更新磁盘上的数据要快得多。

  • 账本(磁盘数据文件)

​ 与掌柜的账本类似,MySQL中的磁盘数据文件存储了数据库的持久状态。在系统空闲时,或者当redo log快满时,InnoDB会将redo log中记录的变更同步到磁盘上的数据文件中,确保数据的持久化。

  • WAL技术

​ 即Write-Ahead Logging,其核心思想是先记录日志(即先写redo log),再将数据持久化到磁盘上。这样做的好处是提高了数据更新的效率,并且通过redo log可以在数据库异常重启后恢复未持久化的数据变更,保证数据的完整性。

循环使用

在这里插入图片描述

  • redo log空间是固定的,由一组文件组成。例如,可以配置为4个文件,每个1GB,总共可以记录4GB的操作。
  • 写入位置(write pos)标记了当前记录的位置,随着数据的不断写入而向后移动。当到达redo log末尾时,会循环回到开头继续写。
  • 擦除位置(checkpoint)标记了当前需要从redo log同步到磁盘数据文件的位置。在擦除记录之前,必须确保数据已经持久化到磁盘。
  • 当write pos追上checkpoint时,表示redo log已满。此时,必须暂停新的更新操作,将部分redo log记录持久化到磁盘数据文件中,以腾出空间。
重要性
  • 提高效率

​ 通过先写日志再写磁盘的方式,大大提高了更新操作的效率。

  • crash-safe能力

​ 有了redo log,InnoDB能够保证即使数据库发生异常重启,之前已提交的事务不会丢失,从而保障了数据的完整性和一致性。

redo log buffer

​ 这个缓冲区位于内存中,其主要作用是临时存储即将被写入到redo log文件的日志信息。使用缓冲区的目的是为了提高系统的性能和效率。

工作原理
  1. 写入流程

​ 当事务执行数据修改操作时,这些变更首先被记录到redo log buffer中。这允许事务快速继续执行,而不必等待数据被写入磁盘上的物理redo log文件。

  1. 异步刷新

​ 随后,在适当的时候(比如事务提交时或者当redo log buffer满时),InnoDB存储引擎会将缓冲区中的日志信息异步刷新到磁盘上的redo log文件。这个刷新操作是自动进行的,并且是在后台执行,从而最小化对数据库性能的影响。

  1. crash-safe保证

​ 通过redo log buffer和redo log文件的配合使用,InnoDB能够保证即使在数据库系统崩溃的情况下,所有已提交的事务修改都不会丢失,实现了数据库的crash-safe能力。

重要性
  • 性能提升

​ 使用redo log buffer允许InnoDB合并多个日志写入操作,减少磁盘I/O次数,从而显著提高了数据库操作的性能。

  • 数据安全

​ 尽管redo log buffer位于内存中,但InnoDB通过两阶段提交协议(先写日志后写数据)确保了数据的一致性和持久性,即使发生系统崩溃也能保证数据不丢失。

总结

​ redo log buffer是InnoDB存储引擎中关键的组成部分,它通过缓冲和优化日志写入操作,既提升了数据库的性能,又确保了数据的安全性和一致性。

redo log与binlog

​ 在MySQL数据库中,binlog(二进制日志)和redo log(重做日志)都是关键的日志系统,但它们服务于不同的目的,具有不同的特性和工作机制。

redo log
  • 主要用途

​ redo log主要用于确保事务的持久性和数据库的crash-safe能力。它是InnoDB存储引擎特有的日志系统,用于记录对数据库进行更改的操作,以便在数据库发生崩溃时能够恢复数据。

  • 工作方式

​ redo log采用循环写的方式,固定大小。当空间满时,旧的日志会被新的日志覆盖。redo log记录的是物理日志,即具体修改了哪些数据页。

  • 写入时机

​ 在事务提交时,相关的redo log必须先写入磁盘(这是实现WAL机制的一部分),确保即使系统崩溃,事务的更改也不会丢失。

binlog
  • 主要用途

​ binlog是MySQL服务器层的日志,记录了所有修改了数据库数据的操作(如INSERT、UPDATE、DELETE等),不仅限于InnoDB引擎。binlog主要用于数据复制和数据恢复。

  • 工作方式

​ binlog是追加写的,可以包含多个文件,当一个文件达到一定大小后,会自动切换到新的文件。binlog记录的是逻辑日志,即记录了哪些SQL语句被执行了。

  • 写入时机

​ 事务提交后,相关操作会被写入binlog。在主从复制环境中,从库利用binlog来复制主库上的数据变更,实现数据的同步。

主要区别
  1. 目的和用途

​ redo log主要用于恢复事务提交后的数据,保证数据库的crash-safe。binlog用于数据复制和恢复,支持数据库的高可用和数据备份。

  1. 属于哪一层

​ redo log属于InnoDB存储引擎层,仅适用于InnoDB引擎;而binlog属于MySQL的服务器层,适用于所有的存储引擎。

  1. 日志内容

​ redo log是物理日志,记录了数据页的物理变更;binlog是逻辑日志,记录了修改数据库的SQL语句。

  1. 写入方式

​ redo log采用循环写入,空间固定;binlog采用追加写入,可以无限增长,直到磁盘空间被占满。

  1. 对恢复和复制的影响

​ redo log是实现事务的持久性和数据库恢复的关键;binlog是实现数据复制和某些类型的数据恢复(如点时间恢复)的基础。

redo log相关参数

​ 在MySQL的InnoDB存储引擎中,redo log(重做日志)是实现事务持久性和crash-safe能力的关键组成部分。管理和配置redo log涉及几个关键的参数,这些参数影响着数据库的恢复能力和性能。以下是一些重要的redo log相关参数:

innodb_log_buffer_size
  • 描述:这个参数设置了内存中redo log buffer的大小。redo log buffer是用来暂存日志信息的内存缓冲区,在数据被异步刷新到磁盘上的redo log文件之前,会先写入这个缓冲区。
  • 默认值:默认为16MB。
  • 调整建议:如果你的事务涉及大量的写操作,增加这个参数的值可以减少对磁盘的写操作频率,从而提高性能。但是,增加缓冲区大小也意味着在崩溃恢复时可能需要更长的时间。
innodb_log_group_home_dir
  • 描述:定义了redo log文件的存储位置。
  • 默认值:默认为"./",意味着redo log文件存储在数据目录下。
  • 调整建议:在大多数情况下,你可能不需要更改这个参数。但如果需要优化I/O性能,可以考虑将redo log文件存储在不同的磁盘或存储系统上。
innodb_log_files_in_group
  • 描述:设置redo log组中文件的数量。
  • 默认值:默认为2。
  • 调整建议:增加文件数量可以提高redo log的总大小,但过多的文件可能会增加管理的复杂度。通常情况下,默认值已经足够使用。
innodb_log_file_size
  • 描述:定义了每个redo log文件的大小。
  • 默认值:默认为48MB。
  • 调整建议:这是一个重要的性能调优参数。较大的redo log文件可以减少日志的循环写入,对于高负载的数据库系统来说,可能需要增加此值以提高性能。但是,较大的日志文件在恢复时可能也会花费更多时间。

调整这些参数时,需要考虑到系统的整体性能、数据恢复需求以及磁盘空间限制。在生产环境中做出调整前,推荐先在测试环境中评估改动的影响。调整redo log配置可以优化数据库的性能和恢复能力,但同时也需要权衡潜在的风险。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/820879.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

2024.4.16

三个按键的中断 do_irq.c #include "mykey.h" extern void printf(const char *fmt, ...); unsigned int i 0; void do_irq(void) {//获取中断号unsigned int irqno (GICC->IAR&0x3ff);switch (irqno){case 99://中断处理逻辑printf("KEY1_INTC\n&q…

jenkins构建微信小程序并展示二维码

测试小程序的过程中,很多都是在回头和前端开发说一句,兄弟帮我打一个测试版本的测试码,开发有时间的情况下还好,就直接协助了,但是很多时候他们只修复了其中几个bug,其他需要修复的bug代码正在编写&#xf…

健身管理小程序|基于微信开发健身管理小程序的系统设计与实现(源码+数据库+文档)

健身管理小程序目录 基于微信开发健身管理小程序设计与实现 一、前言 二、系统设计 三、系统功能设计 小程序端: 后台 四、数据库设计 五、核心代码 六、论文参考 七、最新计算机毕设选题推荐 八、源码获取: 博主介绍:✌️大厂码…

策略模式(知识点)——设计模式学习笔记

文章目录 0 概念1 使用场景2 优缺点2.1 优点2.2 缺点 3 实现方式4 和其他模式的区别5 具体例子实现5.1 实现代码 0 概念 定义:定义一个算法族,并分别封装起来。策略让算法的变化独立于它的客户(这样就可在不修改上下文代码或其他策略的情况下…

前端三件套学习笔记(持更)

HTML CSS 1、HTML&#xff0c;CSS&#xff0c;JS区别 HTML--结构 CSS--表现 JavaScript--行为 2、HTML5 中新增 1&#xff09;语义化标签 <header>、<main>页面主要内容、<aside>侧边栏、<footer>、<nav>、<article> 加载页面一块…

Redis 缓存预热、预热数据选取策略、缓存保温、性能边界

缓存预热 热点数据预热&#xff1a;根据业务分析或统计数据&#xff0c;确定热点数据&#xff08;经常被访问的数据&#xff09;&#xff0c;并将其提前加载到Redis缓存中。可以根据访问频率、访问量或其他业务指标来确定热点数据。定时预热&#xff1a;可以设置定时任务&…

QT 串口助手 学习制作记录

QT 串口助手qt 学习制作记录 参考教程&#xff1a;​​​​​​QT初体验&#xff1a;手把手带你写一个自己的串口助手_qt设计串口助手的流程图-CSDN博客 Qt之串口编程&#xff08;添加QSerialPort模块&#xff09;_如何安装 qt串口模块教程-CSDN博客 串口调试助手&#xff1…

纯golang开发的mqtt server

Mochi-MQTT Server github地址&#xff1a;https://github.com/mochi-mqtt/server Mochi-MQTT 是一个完全兼容的、可嵌入的高性能 Go MQTT v5&#xff08;以及 v3.1.1&#xff09;中间件/服务器。 Mochi MQTT 是一个完全兼容 MQTT v5 的可嵌入的中间件/服务器&#xff0c;完…

【C语言】每日一题,快速提升(3)!

&#x1f525;博客主页&#x1f525;&#xff1a;【 坊钰_CSDN博客 】 欢迎各位点赞&#x1f44d;评论✍收藏⭐ 题目&#xff1a;杨辉三角 在屏幕上打印杨辉三角。 1 1 1 1 2 1 1 3 3 1 ……......... 解答&#xff1a; 按照题设的场景&#xff0c;能发现数字规律为&#xff1…

Flink学习(六)-容错处理

前言 Flink 是通过状态快照实现容错处理 一、State Backends 由 Flink 管理的 keyed state 是一种分片的键/值存储&#xff0c;每个 keyed state 的工作副本都保存在负责该键的 taskmanager 本地中。 一种基于 RocksDB 内嵌 key/value 存储将其工作状态保存在磁盘上&#x…

【MogDB】在ORACLE和MogDB中查看存储过程出参游标数据的方式

一、前言 使用ORACLE作为数据库的应用软件中&#xff0c;偶尔会遇到使用游标作为出参的存储过程&#xff0c;这种存储过程迁移到MogDB并不需要进行改造&#xff0c;但是在开发这样的存储过程时&#xff0c;开发人员偶尔会想要在数据库中测试执行一下&#xff0c;看看游标中的数…

项目5-博客系统1(准备工作+博客列表+博客详情页)

1.创建项目 导入以下依赖 2.项目介绍 使⽤SSM框架实现⼀个简单的博客系统 共5个页面 2.1 前端页面展示 2.1.1 用户登录 2.1.2 博客发表页 2.1.3 博客编辑页 2.1.4 博客列表页 2.1.5博客详情页 2.2 功能描述: ⽤⼾登录成功后, 可以查看所有⼈的博客. 点击 <<查看全⽂…

Big Data and Cognitive Computing (IF=3.7) 计算机/大数据/人工智能期刊投稿

Special Issue: Artificial Cognitive Systems for Computer Vision 欢迎计算机/大数据/人工智能/计算机视觉相关工作的投稿&#xff01; 影响因子3.7&#xff0c;截止时间2024年12月31日 投稿咨询&#xff1a;lqyan18fudan.edu.cn 投稿网址&#xff1a;https://www.mdpi.com/j…

2024 计算机毕业设计之SpringBoot+Vue项目合集(源码+L文+PPT)

各位朋友大家好&#xff0c;有幸与屏幕前你们相识&#xff0c;博主现已经搬砖9年&#xff0c;趁着头发还充裕&#xff0c;希望给大家提供一些编程领域的帮助&#xff0c;深知计算机毕业生这个阶段的崩溃与闹心&#xff0c;让我们共同交流进步。 博主给大家列举了项目合集&#…

如何在PPT中获得网页般的互动效果

如何在PPT中获得网页般的互动效果 效果可以看视频 PPT中插入网页有互动效果 当然了&#xff0c;获得网页般的互动效果&#xff0c;最简单的方法就是在 PPT 中插入网页呀。 那么如何插入呢&#xff1f; 接下来为你讲解如何获得&#xff08;此方法在 PowerPoint中行得通&#…

吴恩达llama课程笔记:第七课llama安全工具

羊驼Llama是当前最流行的开源大模型&#xff0c;其卓越的性能和广泛的应用领域使其成为业界瞩目的焦点。作为一款由Meta AI发布的开放且高效的大型基础语言模型&#xff0c;Llama拥有7B、13B和70B&#xff08;700亿&#xff09;三种版本&#xff0c;满足不同场景和需求。 吴恩…

【笔记】探索生成范式:大型语言模型在信息提取中的作用

探索生成范式&#xff1a;大型语言模型在信息提取中的作用 摘要介绍 &#x1f308;你好呀&#xff01;我是 是Yu欸 &#x1f30c; 2024每日百字篆刻时光&#xff0c;感谢你的陪伴与支持 ~ &#x1f680; 欢迎一起踏上探险之旅&#xff0c;挖掘无限可能&#xff0c;共同成长&am…

基于Qt的二维码生成与识别

基于Qt的二维码生成与识别 一、获取QZxing开源库 1.通过封装的QZxing开源库生成和识别二维码&#xff0c;下载地址&#xff1a;GitCode - 开发者的代码家园https://gitcode.com/mirrors/ftylitak/qzxing/tree/master。 2.下载解压后&#xff0c;使用Qt Creator xx&#xff0…