当前位置: 首页 > news >正文

MySQL事务日志—redo日志介绍

MySQL事务日志—redo日志

事务有4种特性: 原子性、一致性、隔离性和持久性。

那么事务的四种特性到底是基于什么机制实现?

  • 事务的原子性、一致性由事务的 undo 日志
  • 事务的隔离性由锁机制和MVCC实现。
  • 事务的持久性由redo 日志来保证。

两类日志概述:

  • REDO LOG 称为重做日志,用于保存已提交事务的页修改操作, 保证事务的持久性。
  • UNDO LOG 称为回滚日志, 回滚行记录到某个特定版本, 用来保证事务的原子性、一致性。

redo日志作用

背景:在真正访问页面之前,需要把在磁盘上的页缓存到内存中的 Buffer Pool之后才可以访问。所有的变更都必须先更新缓冲池中的数据,然后缓冲池中的脏页会以一定的频率被刷入磁盘(checkPoint机制 ) ,通过缓冲池来优化CPU和磁盘之间的鸿沟, 这样就可以保证整体的性能不会下降太快。

问题:事务提交并不会触发check point机制马上进行持久化,所以有可能存在事务内容丢失的情况。

redo日志就是保证事务提交后的持久化的一种机制。如果发生宕机,只需要保证数据页的修改记录已经保存到了在redo log中,之后重启就就可以通过redo log去重新刷盘,保证了持久化。

在这里插入图片描述

为什么不是直接刷盘,而是把内存数据的修改记录到redo日志里?redo日志不也是磁盘中的吗?

  1. 数据修改量与刷盘的数据量的差距太大,因为mysql是以页为单位进行IO,而修改的数据量可能只有几个字节。
  2. 直接刷盘效率太低,因为SQL修改的磁盘页不一定连续,所以说是随机IO。

使用redo日志的优点?

  1. 降低了完整刷盘的频率,每次只记录页面修改的内容即可
  2. redo log是顺序写入磁盘的,属于顺序IO,效率高

redo log什么时候产生?

实时产生,每执行一个SQL语句对应的数据修改都会记录在redo log中,而不是事务提交才记录

redo日志工作原理

redo log的组成

Redo log可以简单分为以下两个部分:

  • 重做日志的缓冲 ( red o log buffer) , 保存在内存中, 是易失的。

  • 在这里插入图片描述

  • 重做日志文件 ( redo log file) , 保存在硬盘中, 是持久的。如var/lib/mysql目录下的ib_logfile0和 ib _logfile1 文件即为REDO日志。

redo log工作流程

InnoDB的更新操作采用的是 Write Ahead Log(预先日志持久化)策略, 即先写日志, 再写入磁盘。

mysql事务对数据进行修改,大致过程:

  1. 开始一个事务
  2. 执行SQL语句,先将原始数据从磁盘中读入内存的buffer pool中来
  3. 记录数据旧值到undo log以便于回滚,然后再对内存中的buffer pool数据进行修改
  4. 将内存页的修改情况记录到redo log buffer(内存中)
  5. 如果事务中途失败,则通过undo log回滚
  6. commit事务,根据刷盘策略的配置决定采取什么行为,默认:把redo buffer数据直接追加到redo磁盘文件中
  7. 按照一定频率执行真正的刷盘(check point机制)
  8. 如果事务成功commit但没有成功刷盘的时候(步骤5-6之间),发生宕机,则重启后会根据redo日志中的记录再执行刷盘

在这里插入图片描述

redo日志刷盘策略

redo log刷盘策略是指将redo buffer同步到redo log磁盘文件中的过程

在这里插入图片描述

注意:redo log buffer刷盘到 redo log file的过程并不是真正的刷到磁盘中去, 只是刷入到文件系统缓征 ( page cache) 中去 , 真正的写入会交给系统自己来决定。那么对于InnoDB来说就存在一个问题, 如果交给系统来同步, 同样如果系统宕机,那么数据也丢失了 (虽然整个系统宕机的概率还是比较小的) 。

针对这种情况, InnoDB给出 innodb _ flush _ log _ at _ trx _ commit参数, 该参数控制 commit提交事务时, 如何将 redo log buffer中的日志刷新到 red o log file中。它支持三种策略:

  • 设置为0: 表示每次事务提交时不进行刷盘操作。(系统默认 master thread每隔1s进行一次重做日志的同步)
  • 设置为1 : 表示每次事务提交时都将进行同步, 刷盘操作 (默认值)
  • 设置为2: 表示每次事务提交时都只把 red o log buffer 内容写入 page cache, 不进行同步。由 os自己决定什么时候同步到磁盘文件。(其实也是交给master thread处理)

拓展:master thread是InnoDB存储引擎的后台线程, 每隔1 秒, 就会把 redo log buffer 中的内容写到文件系统缓存( page cache) , 然后调用刷盘操作。三种刷盘策略都会收到master thread的影响。

在这里插入图片描述

策略一:事务提交,立马同步到redo log文件

优点:安全性很高,只要事务提交了,数据就是安全的

缺点:速度慢

在这里插入图片描述

策略二:事务提交,只保存到文件系统的page cache

优点:速度快,安全性也相对较高,因为只要把修改记录保存到page cache中了,即使MySQL崩溃了,数据也还是能够保证持久化,除非整个系统宕机了(概率小)

缺点:有概率产生事务数据丢失的情况,丢失1s的数据(等待master thread同步的1s的过程中宕机了)

在这里插入图片描述

策略三:事务提交,什么也不干

优点:速度快

缺点:安全性差,1s内发生MySQL奔溃或者OS宕机,都会丢失事务的修改数据
在这里插入图片描述

总结

redo buffer是实时变化的,而刷盘不是实时进行的,根据同步时机,可分为如下三种:

  • 事务commit时,将redo buffer同步到操作系统的文件缓存cache中,然后马上将文件缓存cache同步写入到redo log文件中(默认,做两步
  • 事务commit时,只将redo buffer同步到操作系统的文件缓存cache中,具体什么时候同步到redo log文件中,取决于后台子线程(做一步,另一步交给后台线程
  • 事务commit时,什么也不做,什么时候同步完全取决于后台子线程(什么都不做,都交给后台线程

三种策略的安全性由高到低,速度由慢到快,但出于安全考虑,最好还是选择默认的。

相关文章:

MySQL事务日志—redo日志介绍

MySQL事务日志—redo日志 事务有4种特性: 原子性、一致性、隔离性和持久性。 那么事务的四种特性到底是基于什么机制实现? 事务的原子性、一致性由事务的 undo 日志事务的隔离性由锁机制和MVCC实现。事务的持久性由redo 日志来保证。 两类日志概述:…...

告别音乐小白!字节跳动AI音乐创作工具,让你一键变作曲家!

还在羡慕别人能创作动听的音乐?五音不全的你,也梦想着谱写属于自己的乐章?现在,机会来了!字节跳动推出了一款AI音乐创作工具——抖音推出的海绵音乐,它能让你轻松一键创作音乐,即使是“音乐小白…...

空心正方形图案

KiKi学习了循环,BoBo老师给他出了一系列打印图案的练习,该任务是打印用“*”组成的“空心”正方形图案。 输入描述: 多组输入,一个整数(3~20),表示输出的行数,也表示组成正方形边的“ * ”的数量。 输出描述…...

【EXCEL数据处理】000020 案例 保姆级教程,附多个操作案例。EXCEL使用表格。

前言:哈喽,大家好,今天给大家分享一篇文章!创作不易,如果能帮助到大家或者给大家一些灵感和启发,欢迎收藏关注哦 💕 目录 【EXCEL数据处理】000020 案例 保姆级教程,附多个操作案例。…...

虾皮Shopee大数据面试题及参考答案

Cube 表性能优化,还有其他优化的方法吗? Cube 表性能优化可以从多个方面入手。 一方面,可以优化数据存储格式。选择合适的存储格式能够减少存储空间占用,提高数据读取速度。例如,Parquet 格式是一种高效的列式存储格式,它可以按列进行数据压缩,大大减少磁盘 I/O 和内存占…...

重学SpringBoot3-集成Redis(六)之消息队列

更多SpringBoot3内容请关注我的专栏:《SpringBoot3》 期待您的点赞👍收藏⭐评论✍ 重学SpringBoot3-集成Redis(六)之消息队列 1. 什么是发布/订阅(Pub/Sub)?2. 场景应用3. Spring Boot 3 整合 R…...

LeetCode 134 Gas Station 解题思路和python代码

题目: There are n gas stations along a circular route, where the amount of gas at the ith station is gas[i]. You have a car with an unlimited gas tank and it costs cost[i] of gas to travel from the ith station to its next (i 1)th station. You …...

服务攻防

171、一次完整的 HTTP 请求过程 域名解析 --> 发起 TCP 的 3 次握手 --> 建立 TCP 连接后发起 http 请求 --> 服务器 响应 http 请求,浏览器得到 html 代码 --> 浏览器解析 html 代码,并请求 html 代码中的资源(如 js、 css…...

leetcode 力扣算法题 快慢指针 双指针 19.删除链表的倒数第n个结点

删除链表的倒数第N个结点 题目要求题目示例解题思路从题目中的已知出发思考寻找目标结点条件转换核心思路 需要注意的点改进建议 完整代码提交结果 题目要求 给你一个链表,删除链表的倒数第n个结点,并且返回链表的头结点。 题目示例 示例 1&#xff1…...

网络五层模型:物理层、数据链路层、网络层、传输层、应用层,分别解决了什么问题?

网络五层模型(也称为TCP/IP模型的简化版本)将网络通信过程分为五个层次,每一层都解决了特定的问题。以下是每一层的详细解释及其解决的问题: 1. 物理层(Physical Layer) 解决的问题:数据的物理…...

OpenCV视频I/O(18)视频写入类VideoWriter之初始化 VideoWriter 对象的函数open()的使用

操作系统:ubuntu22.04 OpenCV版本:OpenCV4.9 IDE:Visual Studio Code 编程语言:C11 算法描述 初始化或重新初始化视频编写器。 该方法打开视频编写器。参数与构造函数 VideoWriter::VideoWriter 中的相同。 cv::VideoWriter::open() 函数用…...

大数据处理从零开始————4.认识HDFS分布式文件系统

1.分布式文件系统HDFS 1.1 认识HDFS 当单台服务器的存储容量和计算性能已经无法处理大文件时,分布式文件系统应运而生。什么是分布式系统,分布式系统是由多个独立的计算机或节点组成的系统,这些计算机通过网络连接&#xff…...

jwt认证课件讲解

JWT 基本概念 在用户登录后,我们需要在不同请求之间记录用户的登录状态,常用方式一般有三种:Cookie,Session和Token。 这里我们使用第三种Token令牌方式来实现认证鉴权,采用Json Web Token认证机制(简称…...

【判断推理】逻辑基础

1.1 命题 用语言、符号或者式子表达的,可以判断真假的陈述句称为命题,一般写为 若p,则q 真命题:判断为真的语句假命题:判断为假的语句 eg1:小张是中国人(若是小张,则是中国人&#…...

AcWing 655:天数转换 ← 整除、求余

【题目来源】https://www.acwing.com/problem/content/657/【题目描述】 读取对应于一个人的年龄(以天为单位)的整数值,并转化为年,月和日表示方式输出,年、月、日分别对应 ano(s), mes(es), dia(s)。 注意&#xff1a…...

【解决办法】git clone报错unable to access ‘xxx‘: SSL certificate problem:

使用git clone 时报错unable to access xxx: SSL certificate problem: 这个报错通常是由于SSL证书问题引起的。通常可以按照以下步骤进行排查: 检查网络连接:确保你的网络连接正常,可以访问互联网。尝试使用其他网站或工具测试网络连接是否正…...

算法笔记(十三)——BFS 解决最短路问题

文章目录 迷宫中离入口最近的出口最小基因变化单词接龙为高尔夫比赛砍树 BFS 解决最短路问题 BFS(广度优先搜索) 是解决最短路径问题的一种常见算法。在这种情况下,我们通常使用BFS来查找从一个起始点到目标点的最短路径。 迷宫中离入口最近的出口 题目:…...

Android 简单实现联系人列表+字母索引联动效果

效果如上图。 Main Ideas 左右两个列表左列表展示人员数据,含有姓氏首字母的 header item右列表是一个全由姓氏首字母组成的索引列表,点击某个item,展示一个气泡组件(它会自动延时关闭), 左列表滚动并显示与点击的索引列表item …...

自动驾驶-问题笔记-待解决

参考线的平滑方法 参考线平滑算法主要有三种: 离散点平滑;螺旋曲线平滑;多项式平滑; 参考链接:参考线平滑 对于平滑方法,一直不太理解平滑、拟合以及滤波三者的作用与区别; 规划的起点&#x…...

在掌控板中加载人教版信息科技教学指南中的educore库

掌控板中加载educore库 人教信息科技数字资源平台(https://ebook.mypep.cn/free)中的《信息科技教学指南硬件编程代码说明》文件中提到“本程序说明主要供教学参考。需要可编程主控板须支持运行MicroPython 脚本程序。希望有更多的主控板在固件中支持ed…...

测试微信模版消息推送

进入“开发接口管理”--“公众平台测试账号”,无需申请公众账号、可在测试账号中体验并测试微信公众平台所有高级接口。 获取access_token: 自定义模版消息: 关注测试号:扫二维码关注测试号。 发送模版消息: import requests da…...

django filter 统计数量 按属性去重

在Django中,如果你想要根据某个属性对查询集进行去重并统计数量,你可以使用values()方法配合annotate()方法来实现。这里有两种常见的方法来完成这个需求: 方法1:使用annotate()和Count 假设你有一个模型Item,并且你想…...

【2025年】解决Burpsuite抓不到https包的问题

环境:windows11 burpsuite:2025.5 在抓取https网站时,burpsuite抓取不到https数据包,只显示: 解决该问题只需如下三个步骤: 1、浏览器中访问 http://burp 2、下载 CA certificate 证书 3、在设置--隐私与安全--…...

【OSG学习笔记】Day 16: 骨骼动画与蒙皮(osgAnimation)

骨骼动画基础 骨骼动画是 3D 计算机图形中常用的技术,它通过以下两个主要组件实现角色动画。 骨骼系统 (Skeleton):由层级结构的骨头组成,类似于人体骨骼蒙皮 (Mesh Skinning):将模型网格顶点绑定到骨骼上,使骨骼移动…...

实现弹窗随键盘上移居中

实现弹窗随键盘上移的核心思路 在Android中&#xff0c;可以通过监听键盘的显示和隐藏事件&#xff0c;动态调整弹窗的位置。关键点在于获取键盘高度&#xff0c;并计算剩余屏幕空间以重新定位弹窗。 // 在Activity或Fragment中设置键盘监听 val rootView findViewById<V…...

Python基于历史模拟方法实现投资组合风险管理的VaR与ES模型项目实战

说明&#xff1a;这是一个机器学习实战项目&#xff08;附带数据代码文档&#xff09;&#xff0c;如需数据代码文档可以直接到文章最后关注获取。 1.项目背景 在金融市场日益复杂和波动加剧的背景下&#xff0c;风险管理成为金融机构和个人投资者关注的核心议题之一。VaR&…...

【网络安全】开源系统getshell漏洞挖掘

审计过程&#xff1a; 在入口文件admin/index.php中&#xff1a; 用户可以通过m,c,a等参数控制加载的文件和方法&#xff0c;在app/system/entrance.php中存在重点代码&#xff1a; 当M_TYPE system并且M_MODULE include时&#xff0c;会设置常量PATH_OWN_FILE为PATH_APP.M_T…...

Linux系统部署KES

1、安装准备 1.版本说明V008R006C009B0014 V008&#xff1a;是version产品的大版本。 R006&#xff1a;是release产品特性版本。 C009&#xff1a;是通用版 B0014&#xff1a;是build开发过程中的构建版本2.硬件要求 #安全版和企业版 内存&#xff1a;1GB 以上 硬盘&#xf…...

Scrapy-Redis分布式爬虫架构的可扩展性与容错性增强:基于微服务与容器化的解决方案

在大数据时代&#xff0c;海量数据的采集与处理成为企业和研究机构获取信息的关键环节。Scrapy-Redis作为一种经典的分布式爬虫架构&#xff0c;在处理大规模数据抓取任务时展现出强大的能力。然而&#xff0c;随着业务规模的不断扩大和数据抓取需求的日益复杂&#xff0c;传统…...

nnUNet V2修改网络——暴力替换网络为UNet++

更换前,要用nnUNet V2跑通所用数据集,证明nnUNet V2、数据集、运行环境等没有问题 阅读nnU-Net V2 的 U-Net结构,初步了解要修改的网络,知己知彼,修改起来才能游刃有余。 U-Net存在两个局限,一是网络的最佳深度因应用场景而异,这取决于任务的难度和可用于训练的标注数…...