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.mfbz.cn/a/549286.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Flask前端页面文本框展示后端变量,路由函数内外两类

一、外&#xff01;路由函数外的前后端数据传输 Flask后端 ↓ 首先导入包&#xff0c;需要使用 后端&#xff1a;flask_socketio来进行路由外的数据传输&#xff0c; from flask_socketio import SocketIO, emit 前端&#xff1a;还有HTML头文件的设置。 <!DOCTYPE …

【云原生数据库:原理与实践】1- 数据库发展历程

1-数据库发展历程 1.1 数据库发展概述 从1960年&#xff1a;Integrated Database System&#xff08;IDS&#xff09;&#xff0c;该系统是一个网状模型&#xff08;Network Model&#xff09;到 IMS&#xff08;Information Management System&#xff09;&#xff0c;使用了…

Rust腐蚀服务器清档多教程

Rust腐蚀服务器清档多教程 大家好我是艾西&#xff0c;一个做服务器租用的网络架构师。上期教了大家怎么搭建服务器以及安装插件等那么随着大家自己架设服或是玩耍的时间肯定会有小伙伴想要去新增开区数量或是把原本的服务器进行一些调整等&#xff0c;那么今天主要聊的就是怎…

【智能算法】鸭群算法(DSA)原理及实现

目录 1.背景2.算法原理2.1算法思想2.2算法过程 3.结果展示4.参考文献 1.背景 2021年&#xff0c;Zhang等人受到自然界鸭群觅食行为启发&#xff0c;提出了鸭群算法&#xff08;Duck Swarm Algorithm, DSA&#xff09;。 2.算法原理 2.1算法思想 DSA基于自然界鸭群觅食过程&…

[leetcode] max-area-of-island

. - 力扣&#xff08;LeetCode&#xff09; 给你一个大小为 m x n 的二进制矩阵 grid 。 岛屿 是由一些相邻的 1 (代表土地) 构成的组合&#xff0c;这里的「相邻」要求两个 1 必须在 水平或者竖直的四个方向上 相邻。你可以假设 grid 的四个边缘都被 0&#xff08;代表水&…

基于SpringBoot+Vue的共享汽车管理系统(源码+文档+包运行)

一.系统概述 随着信息技术在管理上越来越深入而广泛的应用&#xff0c;管理信息系统的实施在技术上已逐步成熟。本文介绍了共享汽车管理系统的开发全过程。通过分析共享汽车管理系统管理的不足&#xff0c;创建了一个计算机管理共享汽车管理系统的方案。文章介绍了共享汽车管理…

从 MySQL 到 DynamoDB,Canva 如何应对每天新增的 5000 万素材

作为一款设计工具&#xff0c;Canva 吸引人的一个重要特色就是拥有数以亿计的照片和图形资源&#xff0c;支持用户上传个人素材。 Canva 于 2013 年推出&#xff0c;设立了一个包含大量照片和图形的资源库&#xff0c;并允许用户上传自己的素材以用于设计。从发布之日起&#…

Python数学建模学习-PageRank算法

1-基本概念 PageRank算法是由Google创始人Larry Page在斯坦福大学时提出&#xff0c;又称PR&#xff0c;佩奇排名。主要针对网页进行排名&#xff0c;计算网站的重要性&#xff0c;优化搜索引擎的搜索结果。PR值是表示其重要性的因子。 中心思想&#xff1a; 数量假设&#…

JavaScript基础:js介绍、变量、数据类型以及类型转换

目录 介绍 引入方式 内部方式 外部形式 注释和结束符 单行注释 多行注释 结束符 输入和输出 输出 输入 变量 声明 赋值 关键字 变量名命名规则 常量 数据类型 数值类型 字符串类型 布尔类型 undefined 类型转换 隐式转换 显式转换 Number ✨介绍 &a…

typescript中的type关键字和interface关键字区别

Type又叫类型别名&#xff08;type alias&#xff09;,作用是给一个类型起一个新名字&#xff0c;不仅支持interface定义的对象结构&#xff0c;还支持基本类型、联合类型、交叉类型、元组等任何你需要手写的类型。 type num number; // 基本类型 type stringOrNum string |…

47.HarmonyOS鸿蒙系统 App(ArkUI)创建轮播效果

创建轮播效果&#xff0c;共3页切换 Entry Component struct Index {State message: string Hello Worldprivate swiperController: SwiperController new SwiperController()build() {Swiper(this.swiperController) {Text("第一页").width(90%).height(100%).bac…

BLE架构图

PHY层(Physical layer 物理层) PHY层用来指定BLE所用的无线频段(2.4G)&#xff0c;调制解调方式和方法、跳频等。PHY层的性能直接决定整个BLE芯片的功耗、灵敏度以及selectivity等射频指标。 LL层(Link Layer 链路层) 链路层主要是对RF射频控制。链路层定义了协议栈中最为基础的…

C++解决大学课设所有管理系统(增删查改)

C一篇解决大学课设所有**管理系统(增删查改) 文章目录 C一篇解决大学课设所有**管理系统(增删查改)1.引言1.1 使用结果展示 2. 基本原理3. 文件层次结构4.具体实现(通讯录管理系统为例)4.1 通讯录实体类(addressbook.h)4.2 通讯录实现类(addressbook.cpp)4.3 通讯录管理类&…

蓝桥杯 — — 完全日期

完全日期 友情链接&#xff1a;完全日期 题目&#xff1a; 思路&#xff1a; 直接从20010101枚举到20211231&#xff0c;然后再判断每一个数是否是一个合法的日期&#xff0c;如果这个日期是合法的&#xff0c;接着判断这个日期的每一个位置上的数字之和是否是一个完全平方数…

ChatGPT 可以预测未来吗?

推荐 4月13日的一篇有趣的 paper&#xff0c;特来分享。 &#x1f449; 当前的大型语言模型&#xff08;LLMs&#xff09;具有强大的数据合成和推理能力&#xff0c;但它们在直接预测尚未发生事件的准确性上常常受到限制。传统的预测方法依赖于直接询问模型关于未来的问题。 …

linux下安装nacos2.2.0

1、获取下载地址并下载 1.1、打开nacos官网 1.2、找到对应版本&#xff0c;点进去 ## 1.3、复制地址 1.4下载 # 进入要安装的目录&#xff0c;cd /usr/local/src # 执行wget https://github.com/alibaba/nacos/releases/download/2.2.0/nacos-server-2.2.0.tar.gz2、 安装…

【产品经理修炼之道】- 平台型产品经理与业务型产品经理

从2015年开始&#xff0c;阿里的产品经理招聘分为平台型和业务型&#xff0c;后来很多互金公司逐步学习采纳了这种分工方式&#xff0c;那么什么是平台型产品经理&#xff0c;什么是业务型产品经理呢&#xff1f;先上结论&#xff1a; 平台型产品经理&#xff08;产品设计&…

loD:如何实现代码的“高内聚、低耦合“

设计模式专栏&#xff1a;http://t.csdnimg.cn/3a25S 目录 1.引用 2.何为"高内聚、低耦合" 3.LoD 的定义描述 4.定义解读与代码示例一 5.定义解读与代码示例二 1.引用 本节介绍最后一个设计原则:LoD(Law of Demeter&#xff0c;迪米特法则)。尽LoD不像SOLID、KI…

CTFshow-PWN-Test_your_nc(pwn0-pwn4)

1、pwn0 连上&#xff0c;等它程序执行完你可以直接来到 shell 界面 执行命令&#xff0c;获取 flag ctfshow{294ffc57-ee28-40ea-8c74-4dfeaf89d1e7} 2、pwn1 提供一个后门函数&#xff0c;连上即可得到flag 下载附件&#xff0c;拉进 ubantu &#xff0c;使用命令 checksec …
最新文章