【MySQL】MySQL日志系统以及InnoDB背后的技术(MySQL专栏启动)

news2025/7/18 6:02:08

📫作者简介:小明java问道之路,专注于研究 Java/ Liunx内核/ C++及汇编/计算机底层原理/源码,就职于大型金融公司后端高级工程师,擅长交易领域的高安全/可用/并发/性能的架构设计与演进、系统优化与稳定性建设。

      

📫 热衷分享,喜欢原创~ 关注我会给你带来一些不一样的认知和成长。

      

🏆 InfoQ签约作者、CSDN专家博主/后端领域优质创作者/内容合伙人、阿里云专家/签约博主、51CTO专家 🏆

     

🔥如果此文还不错的话,还请👍关注、点赞、收藏三连支持👍一下博主~ 

本文目录

本文导读

一、Redo Log

1、什么是redo log

2、redo log工作原理解析

3、redo log 如何设置

二、Bin Log

三、InnoDB执行与Log系统的关系

1、InnoDB执行更新的底层原理

2、两阶段提交

四、Redo log 与 Bin Log 区别

五、Undo Log

1、什么是 Undo Log

2、Write Ahead Logging(WAL)

六、事务的四大特性与Log系统的关系

总结


本文导读

本文主要详解MySQL数据库中 Redo log(重做日志)、 Bin Log (归档日志)、Uudo Log(撤销日志),以及 Log 与 InnoDB 的关系和区别,和MySQL事务特性的底层原理。

本文也是对《MySQL事务隔离机制与实现原理详解》、《MVCC详解与MVCC实现原理》的补充说明。

一、Redo Log

在MySQL存储引擎的底部是物理存储层,它是文件的物理存储层(包括二进制日志、数据文件、错误日志、慢查询日志、完整日志、redo/undo 日志等)。

1、什么是redo log

在MySQL中,如果每次更新操作都需要写入磁盘,那么磁盘也必须找到相应的记录,然后进行更新。整个过程的 IO 成本和搜索成本都很高。

为了解决这个问题,MySQL中经常提到的WAL技术,WAL的全称是Write Ahead Logging(提前写入日志)。它的关键点是首先写入日志,然后写入磁盘

具体来说,当需要更新记录时,InnoDB引擎将首先将记录写入重做日志并更新内存。此时,更新完成。同时,InnoDB引擎会在适当的时候将此操作记录更新到磁盘,此更新通常在系统空闲时完成。

2、redo log工作原理解析

Redo log 是一个循环重用的文件集,负责记录 InnoDB 存储引擎中缓冲池(Buffer Pool)的所有物理修改日志。

提交事务时,日志缓冲区 log buffer 将刷新为 Redo log 日志文件。

当检查点位置的 LSN 和最新写入的 LSN 差值(checkpoint_age)达到总 Redo log 日志空间的 75% 时,InnoDB 存储引擎将执行异步刷新操作,直到其降至75%以下,并释放重做日志空间。

当 checkpoint_age  达到总文件大小的 90% 时,将触发同步刷新。此时,InnoDB处于暂停状态,无法运行。

write pos 写入位置是当前记录的位置。它在书写时向后移动。写入3号文件的末尾后,将返回0号文件的开头。checkpoint 检查点是要擦除的当前位置。它也向后移动并循环。在擦除记录之前,应将记录更新为数据文件。

write pos 写入位置和 checkpoint 检查点之间是的空白部分,可以用来记录新的操作。如果写入pos 赶上了检查点 checkpoint,则意味着 Redo log 已满,此时无法执行新的更新。相反,停止并擦除一些记录以推进 checkpoint 。

通过 Redo log 日志,InnoDB可以确保即使数据库异常重启,之前提交的记录也不会丢失。这种能力称为 crash-safe (碰撞安全)。

3、redo log 如何设置

Redo log 日志的大小直接影响数据库的处理能力,如果设置太小,强制检查点 checkpoint  操作将频繁刷新脏页。

InnoDB 的 Redo log 是固定大小的,比如可以配置为一组 4 个文件,每个文件的大小是 1GB,总共就可以记录 4GB 的操作,从头开始写,写到末尾就又回到开头循环写。

最后我们需要将重做日志设置为更大的大小。在5.6版之前,Redo log 日志的总大小不能超过3.8GB。5.7版之后,此限制被释放。由于它太小而无法影响性能,所以将其设置为尽可能大是否更好?

二、Bin Log

MySQL有两个部分:一个是引擎层,负责与存储相关的具体事宜。我们上面讨论的 Redo log 日志是 InnoDB引擎的一个独特日志,

一个是服务器层,它主要在MySQL服务器层做事情,服务器层日志,称为 Bin Log(归档日志)

MySQL期初没有 InnoDB 存储引擎。MySQL自己的引擎是 MyISAM,但 MyISAM 没有崩溃安全功能,Bin log 日志只能用于存档。

三、InnoDB执行与Log系统的关系

1、InnoDB执行更新的底层原理

执行此更新语句时,执行器和InnoDB引擎的内部工作原理:

一、执行器首先查找引擎以获得行。ID是主键,引擎直接使用树搜索来查找该行。

如果该行的数据页已经在内存中,它将直接返回到执行器;否则,您需要在返回之前从磁盘读取内存。

二、执行器获取引擎给出的行数据,将1加到该值上,获取一行新数据,然后调用引擎接口写入新数据行。

三、引擎将新数据更新到内存,并将更新操作记录在重做日志中。此时,重做日志处于准备状态。然后告诉执行者执行已完成,事务可以随时提交。

四、执行器为该操作生成 Bin Log,并将 Bin Log 归档日志写入磁盘。

五、MySQL 执行器调用引擎的提交事务接口,引擎将刚刚写入的  Redo Log  日志更改为提交状态,更新完成。

2、两阶段提交

流程图中可以看到,MySQL InnoDB 将 Redo log 的写入拆成了两个步骤:prepare 和 commit,这就是"两阶段提交"。

Redo log Bin Log 都可以用来指示事务的提交状态。两阶段提交是为了保持两种状态的逻辑一致。

四、Redo log 与 Bin Log 区别

Redo log 重做日志对于InnoDB引擎是唯一的;Binlog 归档位置是在MySQL的服务器层上实现的,可以被所有引擎使用。

Redo log 是一个物理日志,记录对数据页所做的更改;Bin log是记录语句原始逻辑的逻辑日志。

Redo log 是循环写入的,空间会用完;可以附加 Bin log,Bin log 文件在写入到一定大小后将切换到下一个,并且不会覆盖上一个日志。

五、Undo Log

1、什么是 Undo Log

物理层在逻辑上分为系统表空间、用户表空间和 Undi Log 日志。

系统表空间包含 ibdata 文件和一些 Undo文件。ibdata文件包含 insert buffer 插入缓冲区段、 double write 双写段、回滚段、索引段、数据字典段和 Undo 信息段。

MySQL 5.7的新特性如下:Undo 撤销与共享表空间的 ibdata 文件分离。您可以在安装MySQL时自行指定文件大小和编号。

MySQL 8.0的新特性如下:InnoDB表的数据字典和 Undo 与共享表空间 ibdata 完全分离。此前,ibdata 文件中的数据字典需要与独立表空间ibd文件中的数据库字典保持一致。

2、Write Ahead Logging(WAL)

首先写入日志,然后写入磁盘。成功写入日志后,事务不会丢失。

稍后,检查点机制将确保磁盘物理文件和重做日志之间的一致性;

使用 Redo Log 记录更改的数据,即使用 Redo Log 来记录交易数据的更改值;

使用 Undo Log 记录更改前的数据,也就是说,Undo Log 将记录事务数据更改前的值,以便回滚和多版本读取其他事务。

六、事务的四大特性与Log系统的关系

事务的 ACID 都需要通过 Redo、Undo 日志来保证等。

本小节是对《MySQL事务隔离机制与实现原理详解》、《MVCC详解与MVCC实现原理》的补充说明。

原子性:原子性与 WAL 有很大的关系。需要从 Redo 重做日志恢复的数据。如果事务没有提交,缓冲池的脏页被刷新,那么不应该存在的数据怎么会消失?它需要通过撤销来实现,这是通过 Undo 重做来保证的。因此,最终原子性由 Redo 的 WAL 机制保证。

持久性:一旦事务通过原子性提交,即使在停机的情况下,也可以从逻辑上检索数据,然后再次写入物理存储空间。这确保了数据不会从逻辑和物理方面(即数据库的持久性)丢失。

隔离性:指事务的执行不能受到其他事务的干扰,即事务中使用的操作和数据与其他并发事务隔离。锁定和多版本控制符合隔离。MVCC多版本实现有三个隐藏字段。回滚指针(DB_ROLL_PT)指向当前记录项的 Rollback Segment 的 Undo log日志记录,通过该记录可以找到以前版本的数据。

总结

本文主要详解MySQL数据库中 Redo log(重做日志)、 Bin Log (归档日志)、Uudo Log(撤销日志),以及 Log 与 InnoDB 的关系和区别,和MySQL事务特性的底层原理。

本文也是对《MySQL事务隔离机制与实现原理详解》、《MVCC详解与MVCC实现原理》的补充说明。

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

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

相关文章

Java基于springboot+vue的个人博客网站 前后端分离

随着现在网络的快速发展,网上管理系统也逐渐快速发展起来,网上管理模式很快融入到了许多网站的之中,随之就产生了“博客网站”,这样就让博客网站更加方便简单。 对于本博客网站的设计来说,系统开发主要是采用java语言技…

2022国产8K摄像机介绍

摄像机是一种把光学图像信号转变为电信号,以便于存储或者传输的设备。当我们拍摄一个物体时,此物体上反射的光被摄像机镜头收集,使其聚焦在摄像器件的受光面(例如摄像管的靶面)上,再通过摄像器件把光转变为…

N-HiTS: Neural Hierarchical Interpolation for Time Series Forecasting

N-HiTS: Neural Hierarchical Interpolation for Time Series Forecasting 神经预测的最新进展加速了大规模预测系统性能的提高。然而,长期预测仍然是一项非常困难的任务。影响这项任务的两个常见挑战是预测的波动性和它们的计算复杂性。本文提出N-HiTS,一种通过结合新的分层…

不同字符编码对比

目录 1. ASCII码 2. Unicode 3. GBK编码 1. ASCII码 ASCII码使用一个字节编码,但只适用于英文; 2. Unicode Unicode定义了字符集,有 17 个 code plane,总共规划了 1,114,112 个 code point。而这些字符可以使用UTF-8、UTF-1…

Windows无法访问指定设备、路径或文件怎么办?

如何解决Windows 无法访问指定的设备、路径或文件错误? 1.修改安全中心的设置 如果在安装程序的过程中,遇到该错误,可以进入到【Windows安全中心】进行设置修改。 第一步:点击左下角的开始按钮,然后依次点击【设置】…

直接安装WSL2及安装Ubuntu到F盘

1. 勾选这三项,重启 2. 以管理员方式运行powersell wsl --updatewsl --shutdownwsl --set-default-version 2wsl --status3. 解压缩ubuntu 解压缩Ubuntu_1804.2019.522.0_x64.appx到F盘 4. 安装ubuntu 双击ubuntu1804.exe安装 5. 运行 双击ubuntu1804.exe …

AI人工智能实践技术系统性教学方案

郁磊老师【副教授】 :长期从事Python、Matlab机器学习及深度学习等研究工作,具备良好的数学及信号处理基础,熟悉如神经网络、支持向量机、决策树、随机森林等,以及群优 化算法,如遗传算法、蚁群算法、蝙蝠算法等&#…

React源码解读之更新的创建

React 的鲜活生命起源于 ReactDOM.render ,这个过程会为它的一生储备好很多必需品,我们顺着这个线索,一探婴儿般 React 应用诞生之初的悦然。 更新创建的操作我们总结为以下两种场景 ReactDOM.rendersetStateforceUpdate ReactDom.render …

k8s-dynamic-pvc

安装 storage class: external-storage/nfs-client/deploy at master kubernetes-retired/external-storage GitHub 下载文件并安装: class.yaml deployment.yaml rbac.yaml 其中修改: 安装 测试: [rootmaster test-dir]# cat nginx-1.yaml apiVersion: v1 kind: Pers…

【Pytorch with fastai】第 4 章 :底层训练数字分类器

🔎大家好,我是Sonhhxg_柒,希望你看完之后,能对你有所帮助,不足请指正!共同学习交流🔎 📝个人主页-Sonhhxg_柒的博客_CSDN博客 📃 🎁欢迎各位→点赞…

一切为了喵喵 | 攻防世界 x Nepnep x CATCTF邀你一战!

各位极客请注意❗ 各位极客请注意❗❗ 为了坚决捍卫每只小猫咪吃饱饭的权利 为了彻底贯彻“可爱就是王道”的正义 攻防世界 x Nepnep x CATCTF 邀你一战! 此战若成,8333只流浪喵星人将能饱餐一顿! 没有一只修猫咪饿肚子的明天在等着我们…

【Python】初始Python

文章目录一. Python背景知识1. Python的起源2. Python的作用3. Python的优缺点4. Python的前景二. 搭建Python环境1. 安装Python2. 安装 PyCharm一. Python背景知识 1. Python的起源 Python祖师爷吉多 范罗苏姆(Guido van Rossum)是一个荷兰程序员&am…

简易的Python小游戏,上班可玩一天,零基础小白可练手

文章目录 一、第一次写Python小游戏二、对小游戏进行改进 1.对玩家进行提示2.提供多次机会给玩家3.每次答案应该是随机的 三、总结 一、第一次写Python小游戏 刚开始学习Python这门计算机语言,所以在网上找了一个非常简易的小游戏来进行模仿编写,目的…

【数据挖掘】聚类分析

聚类分析 Cluster Analysis 肝到爆炸呜呜呜 一、什么是聚类分析 关键词 1️⃣ 簇 Cluster:数据对象的集合,相同簇中的数据彼此相似,不同簇中的数据彼此相异。 2️⃣ 聚类分析 Cluster analysis:根据数据特征找到数据中的相似性…

Servlet | HttpServlet源码分析、web站点的欢迎页面

目录 一:HttpServlet源码分析 二:web站点的欢迎页面 一:HttpServlet源码分析 1、HttpServlet类是专门为HTTP协议准备的,比GenericServlet更加适合HTTP协议下的开发 HttpServlet在哪个包下? jakarta.servlet.http.Ht…

vue - - - - vite创建vue3项目(不使用TS)

vite创建vue3项目 vite官方文档 1. 使用指令创建项目 > npm create vite your-project-name > or > yarn create vite your-project-name此处演示使用npm,执行该指令时,遇到下述7.1所示报错。 Need to install the following packages(需…

asp.net+sqlserver婚纱影楼摄影管理系统C#

目录 1绪论 5 1.1 选题背景目的和意义 5 1.2研究现状 5 1.3 课题理由 5 2系统需求分析 7 2.1可行性分析 7 2.1.1 技术可行性 7 2.1.2 经济可行性 7 2.2.3 操作可行性 8 2.2系统架构 8 2.3 业务流程分析 9 3系统总体设计 10 3.1 系统物理环…

JavaSE——异常

目录 一、基本概念 1.1 什么是异常? 1.2 java提供的异常处理机制有什么作用? 1.3 java语言中异常以什么形式存在? 例1: 二、异常处理机制 2.1 所有Exception的直接子类都叫做编译时异常 2.2 所有的RuntimeException及子类都属于…

Spring面试

1. IOC (1)如何实现一个IOC容器 (2)IOC理解 (3)BeanFactory BeanFactory 是 Spring 框架的基础设施,面向 Spring 本身;ApplicationContext 面向使用 Spring 框架的开发者&#xff…

Zookeeper和Eureka的区别

Zookeeper: CP设计(强⼀致性),⽬标是⼀个分布式的协调系统,⽤于进⾏资源的统⼀管理。当节点crash后,需要进⾏leader的选举,在这个期间内,zk服务是不可⽤的。 eureka: AP设计(高可用&…