【面试八股总结】MySQL日志:undo log、redo log、binlog

news2024/9/19 10:38:01

 MySQL中存在三种日志:

  • undo log(回滚日志):是 Innodb 存储引擎层生成的日志,实现了事务中的原子性,主要用于事务回滚和 MVCC
  • redo log(重做日志):是 Innodb 存储引擎层生成的日志,实现了事务中的持久性,主要用于掉电等故障恢复
  • binlog (归档日志):是 Server 层生成的日志,主要用于数据备份和主从复制

一、回滚日志undo log

        undo log(回滚日志),它保证了事务的ACID中的原子性(Atomicity)。undo log 是一种用于撤销回退的日志。在事务没提交之前,MySQL 会先记录更新前的数据到 undo log 日志文件里面,当事务回滚时,就读取 undo log 里的数据,然后做原先相反操作。

        一条记录的每一次更新操作产生的 undo log 格式都有一个 roll_pointer 指针和一个 trx_id 事务id

  • 通过 trx_id 可以知道该记录是被哪个事务修改的;
  • 通过 roll_pointer 指针可以将这些 undo log 串成一个链表,这个链表就被称为版本链;

        另外,可以通过 ReadView + undo log 实现 MVCC(多版本并发控制)。对于「读提交」和「可重复读」隔离级别的事务来说,它们的快照读(普通 select 语句)是通过 Read View + undo log 来实现的,它们的区别在于创建 Read View 的时机不同:

  • 读提交隔离级别是在每个 select 都会生成一个新的 Read View,也意味着,事务期间的多次读取同一条数据,前后两次读的数据可能会出现不一致,因为可能这期间另外一个事务修改了该记录,并提交了事务。
  • 可重复读隔离级别是启动事务时生成一个 Read View,然后整个事务期间都在用这个 Read View,这样就保证了在事务期间读到的数据都是事务启动前的记录。

undo log 两大作用:

  • 实现事务回滚,保障事务的原子性。事务处理过程中,如果出现了错误或者用户执 行了 ROLLBACK 语句,MySQL 可以利用 undo log 中的历史数据将数据恢复到事务开始之前的状态。
  • 实现 MVCC(多版本并发控制)关键因素之一。MVCC 是通过 ReadView + undo log 实现的。undo log 为每条记录保存多份历史数据,MySQL 在执行快照读(普通 select 语句)的时候,会根据事务的 Read View 里的信息(trx_id 和 roll_pointer),顺着 undo log 的版本链找到满足其可见性的记录,从而控制并发事务访问同一个记录时的行为。

undo log 是如何刷盘(持久化到磁盘)的?

        undo log 和数据页的刷盘策略是一样的,都需要通过 redo log 保证持久化。

        buffer pool 中有 undo 页,对 undo 页的修改也都会记录到 redo log。redo log 会每秒刷盘,提交事务时也会刷盘,数据页和 undo 页都是靠这个机制保证持久化的。

Buffer Pool

        MySQL 的数据都是存在磁盘中的,要更新一条记录的时候,得先要从磁盘读取该记录,然后在内存中修改这条记录。将修改完的记录缓存起来,下次查询语句命中这条记录时,直接读取缓存中的记录,不需要从磁盘获取数据了。Innodb 存储引擎设计了一个缓冲池(Buffer Pool),来提高数据库的读写性能。

        InnoDB 会把存储的数据划分为若干个「页」,以页作为磁盘和内存交互的基本单位,一个页的默认大小为 16KB。因此,Buffer Pool 同样需要按「页」来划分。

        在 MySQL 启动的时候,InnoDB 会为 Buffer Pool 申请一片连续的内存空间,然后按照默认的16KB的大小划分出一个个的页, Buffer Pool 中的页就叫做缓存页。此时这些缓存页都是空闲的,之后随着程序的运行,才会有磁盘上的页被缓存到 Buffer Pool 中。

        Buffer Pool 除了缓存「索引页」和「数据页」,还包括了 Undo 页,插入缓存、自适应哈希索引、锁信息等等。

        InnoDB 引擎会在适当的时候,由后台线程将缓存在 Buffer Pool 的脏页刷新到磁盘里,这就是 WAL (Write-Ahead Logging)技术WAL 技术指的是, MySQL 的写操作并不是立刻写到磁盘上,而是先写日志,然后在合适的时间再写到磁盘上

二、重做日志redo log

        redo log 保证了事务四大特性中的持久性。redo log 是物理日志,记录了某个数据页做了什么修改,例如对 XXX 表空间中的 YYY 数据页 ZZZ 偏移量处做了AAA 更新,每当执行⼀个事务就会产生⼀条或多条物理日志。在事务提交时,只要先将 redo log 持久化到磁盘即可。

redo log和undo log的区别是什么?

        undo log 和 redo log 这两个日志都是 Innodb 存储引擎生成的。

  • redo log 记录了此次事务「完成后」的数据状态,记录的是更新之后的值;
  • undo log 记录了此次事务「开始前」的数据状态,记录的是更新之前的值;

        事务提交之前发生崩溃,重启后会通过 undo log 回滚事务,事务提交之后发生崩溃,重启后会通过 redo log 恢复事务。

redo log 作用:

  • 实现事务的持久性,让 MySQL 有 crash-safe 的能力,能够保证 MySQL 在任何时间段突然崩溃,重启后之前已提交的记录都不会丢失;
  • 将写操作从「随机写」变成了「顺序写」,提升 MySQL 写入磁盘的性能。

三、归档日志 binlog 

        binlog 文件是记录了所有数据库表结构变更和表数据修改的日志,不会记录查询类的操作。

        MySQL 在完成一条更新操作后,Server 层还会生成一条 binlog,等之后事务提交的时候,会将该事物执行过程中产生的所有 binlog 统一写 入 binlog 文件。

redo log和bin log有什么区别?

1. 适用对象不同:

        binlog 是 MySQL 的 Server 层实现的,所有存储引擎都可以使用;

        redo log 是 Innodb 存储 引擎实现的日志。

2. 文件格式不同:

        redo log 是物理日志,记录的是在某个数据页做了什么修改;

        binlog 主要包括三种格式: Statement 、 Row 和 Mixed 。

3. 写入方式不同:

        binlog 是追加写,写满⼀个⽂件,就创建⼀个新的文件继续写,不会覆盖以前的⽇志,保存 的是全量的日志。

        redo log是循环写,日志空间大小是固定,全部写满就从头开始,保存未被刷⼊磁盘的脏页日志。

4. 用途不同:

        binlog 用于备份恢复、主从复制;

        redo log 用于掉电等故障恢复。

binlog 什么时候刷盘?

        事务执行过程中,先把日志写到 binlog cache(Server 层的 cache),事务提交的时候,再把 binlog cache 写到 binlog 文件中。

        一个事务的 binlog 是不能被拆开的,因此无论这个事务有多大也要保证一次性写入。这是因为有一个线程只能同时有一个事务在执行的设定,所以每当执行一个 begin/start transaction 的时候,就会默认提交上一个事务,这样如果一个事务的 binlog 被拆开的时候,在备库执行就会被当做多个事务分段执行,这样破坏了原子性,是有问题的。

        MySQL 给每个线程分配了一片内存用于缓冲 binlog ,该内存叫 binlog cache,参数 binlog_cache_size 用于控制单个线程内 binlog cache 所占内存的大小。如果超过了这个参数规定的大小,就要暂存到磁盘。

四、两阶段提交

        事务提交后,redo log 和 binlog 都要持久化到磁盘,但是这两个是独立的逻辑,可能出现半成功的状态,这样就造成两份日志之间的逻辑不一致。

  • 如果在将 redo log 刷入到磁盘之后, MySQL 突然宕机了,而 binlog 还没有来得及写入。MySQL 重启后,通过 redo log 能将 Buffer Pool 恢复到新值,但是 binlog 里面没有记录这条更新语句,在主从架构中,binlog 会被复制到从库,由于 binlog 丢失了这条更新语句,从库的这一行 name 字段是旧值,与主库的值不一致性;
  • 如果在将 binlog 刷入到磁盘之后, MySQL 突然宕机了,而 redo log 还没有来得及写入。由于 redo log 还没写,崩溃恢复以后这个事务无效,所以数据字段还是旧值,而 binlog 里面记录了这条更新语句,在主从架构中,binlog 会被复制到从库,从库执行了这条更新语句,那么这一行新值,与主库的值不一致性;

        redo log 影响主库的数据,binlog 影响从库的数据,所以 redo log 和 binlog 必须保持一致才能保证主从数据一致。

        两阶段提交把单个事务的提交拆分成了 2 个阶段,分别是「准备(Prepare)阶段」和「提交(Commit)阶段」,每个阶段都由协调者(Coordinator)和参与者(Participant)共同完成。

两阶段提交过程

        MySQL 会同时维护 binlog 日志与 InnoDB 的 redo log,为了保证这两个日志的一致性,MySQL 使用了内部 XA 事务,内部 XA 事务由 binlog 作为协调者,存储引擎是参与者。

        事务的提交过程有两个阶段,将 redo log 的写入拆成了两个步骤:prepare 和 commit,中间再穿插写入binlog,具体如下: 

  • prepare 阶段:将 XID(内部 XA 事务的 ID) 写入到 redo log,同时将 redo log 对应的事务状态设置为 prepare,然后将 redo log 持久化到磁盘(innodb_flush_log_at_trx_commit = 1 的作用);

  • commit 阶段:把 XID 写入到 binlog,然后将 binlog 持久化到磁盘(sync_binlog = 1 的作用),接着调用引擎的提交事务接口,将 redo log 状态设置为 commit,此时该状态并不需要持久化到磁盘,只需要 write 到文件系统的 page cache 中就够了,因为只要 binlog 写磁盘成功,就算 redo log 的状态还是 prepare 也没有关系,一样会被认为事务已经执行成功。

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

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

相关文章

服务网关工作原理,如何获取用户真实IP?

文章目录 一、什么是网关二、网关工作原理 (★)三、SpringCloud Gateway3.1 Gateway 简介3.2 Gateway 环境搭建3.3 自定义路由规则 (★)3.4 局部过滤器3.5 全局过滤器(案例:获取用户真实IP地址) (★) 补充1:不同类型的客户端如何设…

MapSet之相关概念

系列文章: 1. 先导片--Map&Set之二叉搜索树 2. Map&Set之相关概念 目录 1.搜索 1.1 概念和场景 1.2 模型 2.Map的使用 2.1 关于Map的说明 2.2 关于Map.Entry的说明 2.3 Map的常用方法说明 3.Set的说明 3.1关于Set说明 3.2 常见方法说明 1.搜…

CTFHub技能树-Git泄漏-Index

目录 一、Git索引(Index)的基本概念 二、解题过程 主旨:使用git泄漏恢复源代码 方法一:使用GitHack手动恢复 方法二:直接使用Git_Extract获取网站源代码拿去flag 当前大量开发人员使用git进行版本控制&#xff0c…

图神经网络(2)预备知识

1. 图的基本概念 对于接触过数据结构和算法的读者来说,图并不是一个陌生的概念。一个图由一些顶点也称为节点和连接这些顶点的边组成。给定一个图G(V,E), 其 中V{V1,V2,…,Vn} 是一个具有 n 个顶点的集合。 1.1邻接矩阵 我们用邻接矩阵A∈Rnn表示顶点之间的连接关…

初识Linux · 有关gdb

目录 前言: 1 预备知识 2 gdb的使用 前言: 当我们Linux学到了这里的时候,我们大概会有一种感觉是,从VS2022转战Linux,写代码对我们来说是一种重新构建读写代码的一个过程,从文本编辑器,到文…

怎样将手机屏幕(远程)投屏到家里的大电视上?

我不住家里,前几次回去都会替老爸老妈清理手机。这两个星期没空回去,老爸吐槽手机用几天就又卡了,其实就是清理一些手机缓存的问题。 我说我远程控制他的手机,给他清理一下。他一听“控制”就不喜欢,说我大了&#xf…

视频中的噪点怎么去除?

在数字视频时代,拍摄高质量的视频成为了许多人的追求。然而,在实际拍摄过程中,由于多种原因,我们常常会遇到视频噪点过多、画面模糊的问题,这不仅影响了观看体验,还可能让精心拍摄的作品大打折扣。那么&…

【生物信息学算法】图算法1:概念和算法

文章目录 1. 图的定义、分类、表达方式图的定义图的分类表达方式Python实现 2.相邻节点和度概念定义python实现 3.路径、距离和搜索路径和距离搜索环 4.图论中的欧拉定理 1. 图的定义、分类、表达方式 图的定义 图G可以由两个集合来定义,即G(V,E)。其中&#xff0…

MapSet之二叉搜索树

系列文章: 1. 先导片--Map&Set之二叉搜索树 2. Map&Set之相关概念 目录 前言 1.二叉搜索树 1.1 定义 1.2 操作-查找 1.3 操作-新增 1.4 操作-删除(难点) 1.5 总体实现代码 1.6 性能分析 前言 TreeMap 和 TreeSet 是 Java 中基于搜索树实现的 M…

申万宏源证券完善金融服务最后一公里闭环,让金融服务“零距离、全天候”

在数字化转型的浪潮中,申万宏源作为金融行业的先锋,持续探索科技如何赋能金融服务,以提升企业效率并优化客户服务体验。面对日益增长的视频化需求,传统的图文形式已难以满足市场与用户的新期待。为了应对这一挑战,申万…

简单梳理一个历史脉络

B 站上王山水老师的一个视频引发的思考:没有司马篡国,能避免300年的大乱世吗? 我的答案如下: 视野放宽到欧亚大陆,广义上公元184年黄巾军起义开启内乱,狭义上公元220年正式进入三国,280年晋统一…

新手做短视频素材在哪里找?做短视频素材工具教程网站有哪些?

本文将为你提供一系列新手友好的视频制作资源,包括素材网站和编辑工具,帮助你快速成为短视频领域的新星。让我们从国内知名的蛙学网开始介绍。 蛙学网:新手的视频素材天堂 对于短视频新手而言,蛙学网绝对是一个宝库。该网站提供了…

1-10 图像增强对比度 opencv树莓派4B 入门系列笔记

目录 一、提前准备 二、代码详解 enhanced_image cv2.convertScaleAbs(image, alpha1.5, beta0) 三、运行现象 四、完整工程贴出 一、提前准备 1、树莓派4B 及 64位系统 2、提前安装opencv库 以及 numpy库 3、保存一张图片 二、代码详解 import cv2 # 增强图像的对比度 …

环境配置!

一 安装CUDA 在安装CUDA之前,建议先看下pytorch的更新版本,应为pytorch更新较慢,请保证CUDA的版本,对应的pytorch版本存在。 去pytorch官网查看电脑支持的cuda版本最高是多少。PyTorch 我这边在网站上看最高支持的CUDA版本为12.…

SpringDataJPA系列(7)Jackson注解在实体中应用

SpringDataJPA系列(7)Jackson注解在实体中应用 常用的Jackson注解 Springboot中默认集成的是Jackson,我们可以在jackson依赖包下看到Jackson有多个注解 一般常用的有下面这些: 一个实体的示例 测试方法如下: 按照上述图片中的序号做个简…

【python】Python中如何通过rembg实现图片背景去除

✨✨ 欢迎大家来到景天科技苑✨✨ 🎈🎈 养成好习惯,先赞后看哦~🎈🎈 🏆 作者简介:景天科技苑 🏆《头衔》:大厂架构师,华为云开发者社区专家博主,…

Java预备知识 - day2

1.IDEA的简单使用与介绍 1.1 IDEA的项目工程介绍 Day2_0904:项目名称 E:\0_code\Day2_0904:表示当前项目所在路径 .idea:idea软件自动生成的文件夹,最好不要动 src:srcsourse→源,我们的源代码就放在这…

计算机网络知识点复习——TCP协议的三次握手与四次挥手(连接与释放)

TCP协议的三次握手与四次挥手(连接与释放) 一、前言二、简单的知识准备1. TCP协议的主要特点2. TCP报文段 三、TCP连接的建立(三次握手)四、TCP连接的释放(四次挥手)五、TCP连接与释放的总结六、结束语 一、…

计算机基础知识复习9.6

点对点链路:两个相邻节点通过一个链路相连,没有第三者 应用:PPP协议,常用于广域网 广播式链路:所有主机共享通信介质 应用:早期的总线以太网,无线局域网,常用于局域网 典型拓扑结…

qtdraw-使用qt绘图之开源源码学习

1. 资源介绍 功能:使用qt在画板上绘制各种形状,并保持绘制内容到xml文件中。 项目源码:https://github.com/egan2015/qdraw 软件界面: 1.1 支持shape 6种 1.2 支持的功能 6种,分别是对绘制的图形进行撤销undo&…