【MySQL】深入解析日志系统:undo log、redo log、bin log

news2024/11/15 13:51:15

文章目录

      • 前言
      • 1、undo log
        • 1.1、undo log 是什么
        • 1.2、事务回滚
      • 2、redo log
        • 2.1、redo log 是什么
        • 2.2、redo log 刷盘
        • 2.3、redo log 硬盘文件
      • 3、bin log
        • 3.1、bin log 是什么
        • 3.2、bin log 和 redo log 区别
        • 3.3、bin log 刷盘
        • 3.4、两阶段提交

前言

MySQL数据库提供了功能强大的日志系统,其中比较重要的是:undolog、redolog、binlog,今天来深入学习下这三个日志实现细节。

1、undo log

1.1、undo log 是什么

undolog一般叫回滚日志,事务回滚rollback功能就是通过undolog实现的,通过undolog保证了为事务原子性undolog主要功能如下:

  • 事务回滚
  • MVCC
1.2、事务回滚

当开启一段事务还未提交时,事务中的操作可能会出现错误异常,这时候就可以通过undo log将事务中的操作进行回滚(rollback),意思是回到事务开启前那个状态。例如:开启事务后我对表中某条记录进行修改(将该记录字段值由a ——> b ——> c),如果从整个修改过程中出现异常,事务就会回滚,字段的值就回到最初的起点(值为a)。

事务如何通过undo log进行回滚操作呢?这个很好理解,我们只需要在undo log日志中记录事务中的反向操作即可,发生回滚时直接通过undolog中记录的反向操作进行恢复,例如:

事务进行insert操作,undo log记录delete操作
事务进行delete操作,undo log记录insert操作
事务进行update操作(a改为b),undolog记录update操作(b改为a)

接下来了解一下事务是如何通过undo log完成回滚的(undo log版本链),这就不得不通过一张图直观的表达undo log记录了:

在这里插入图片描述
上图中,trx_id代表事务id,记录了这一系列事务操作是基于哪个事务;roll_pointer代表回滚指针,就是当要发生rollback回滚操作时,就通过roll_pointer进行回滚,这个链表称为版本链

buffer pool 中有 undo 页,不仅对数据页修改操作会记录到redo log buffer,对 undo 页修改操作也会记录到 redo log buffer,这样就通过redo log保证了事务持久性。当事务Commit之后,undo 页本身就没有利用价值了,此时通过后台线程中的Master ThreadPurge Thread进行 undo 页 的回收工作。
在这里插入图片描述

2、redo log

2.1、redo log 是什么

redo log又称重做日志,保证了事务的持久性,当我们对缓冲池中的数据页进行了修改(变成了脏页),缓冲池本身就是操作系统内存分配的空间,所以数据页本质也是存在内存中的,内存有个特点就是断电即失。所以如果脏页还没有刷入磁盘,数据库服务发生宕机,那么脏页数据就会因为宕机而丢失,这时候redo log就派上了用场。
在这里插入图片描述

redo log通过WAL(Write-Ahead Logging)来进行故障恢复(crash-safe),所谓WAL就是先写日志,后写磁盘。当我们对缓存页进行了修改(变成脏页),我们就将本次操作先写入到redo log buffer中,当事务Commit时就会将redo log buffer中记录通过后台线程刷到磁盘中(事务提交是redo log默认刷盘时机),这时脏页还没有刷盘,但依旧可以认为本次的操作完成了,因为就算发生了故障脏页数据丢失也可以通过redo log恢复,需要注意redo log记录的是物理操作,例如:对AAA数据页BBB偏移量位置做了CCC更新,这跟undo log区别还是挺大的。

事务提交崩溃,通过 undo log 回滚事务
事务提交崩溃,通过 redo log 恢复事务

2.2、redo log 刷盘

上面已经介绍过了,redo log记录先写入到redo log buffer中,然后通过后台线程进行刷盘,也就是说最后还是从 redo log buffer 同步到硬盘中,那么redo log buffer何时进行刷盘操作呢?主要是以下几种情况:

  • Master Thread每秒刷盘一次
  • redo log buffer 剩余空间 < 1/2
  • 通过innodb_flush_log_at_trx_commit参数控制
    • 0:有事务提交的情况下,每秒刷盘一次
    • 1:每次提交事务,刷盘一次(默认,性能差)
    • 2:每次提交事务,把日志记录放到OS内核缓冲区,刷盘时机交给OS(性能好)

默认情况下,redo log在事务提交时就会进行一次刷盘。这有个疑问点,为啥事务提交时不直接将脏页刷盘呢,干嘛还要将 redo log buffer 中记录进行刷盘,然后脏页再刷盘呢,这不多了一步流程吗?

之所以这样设计是因为 redo log 刷盘操作采用磁盘顺序写方式进行的
这种方式性能相比于缓存页随机写方式性能好很多

2.3、redo log 硬盘文件

上面提到了redo log的刷盘操作采用顺序写方式进行,接下来咱们看下 redo log 文件在硬盘中是怎样的方式存在的。

redo log文件好像一个甜甜圈🍩,它是以ib_logfile文件组形式存在(也就是多个ib_logfile构成一个重做日志组),每个重做日志组中最少2个ib_logfile,每个ib_logfile占用内存1GB,当ib_logfile-1写满之后就开始写入ib_logfile2,以此类推:图片来自于《MySQL实战45讲》

在这里插入图片描述

上图中的重做日志组包含了4个重做日志文件ib_logfile,按照圆环顺时针顺序写入文件,这种写入磁盘的方式也叫循环写

  • write pos:当前redo log文件写到了哪个位置
  • check point:目前redo log文件哪些记录可以被覆盖

两个指针中间绿色部分表示还剩余多少可写入空间,也就是redo log 文件的可用空间了,当数据页进行刷盘操作(CheckPoint)时,check point指针也会顺时针进行覆盖(黄色变成绿色);当write pos追上了check point就说明 redo log 文件存满了,那就要强制CheckPoint了,将缓冲池中的脏页刷盘,然后再移动check point指针,这样就可以继续向重做日志组中写入数据了。说到这里大家就该明白,当数据页刷盘后,check point也会顺时针移动,将无用的redo log记录覆盖掉。所以redo log大小需要好好斟酌,如果太大那么故障恢复crash-safe时间会很久;如果太小就会频繁发生刷盘导致性能抖动!

3、bin log

3.1、bin log 是什么

bin log常称作二进制日志,该日志主要有两个功能:

  • 备份恢复
  • 主从复制

每次事务进行提交时,都会将增、删、改操作以追加的方式记录到bin log文件中。这样也就理解了为什么该日志具备备份恢复和主从复制的功能,关于备份恢复比较好理解,根据bin log日志中记录的二进制操作记录恢复即可;主从复制常用于MySQL主从集群搭建,MySQL从节点通过监听主节点bin log日志进行同步即可。

3.2、bin log 和 redo log 区别

bin logredo log二者之间还是有很大的区别:

  1. bin log 属于MySQL体系架构的Server层,而 redo log是InnoDB存储引擎特有的。
  2. bin log 写入方式是追加写,而 redo log 写入方式是循环写
  3. bin log 中记录的是二进制日志(3种类型),而 redo log 中记录的是物理日志信息。
  4. bin log 用于备份恢复、主从复制,而 redo log 用于故障恢复。

关于bin log的二进制日志格式,有以下三种类型:

  1. STATEMENT:增删改SQL语句,存储空间要求小
  2. ROW:记录表行的更改情况,存储空间要求大
  3. MIXED:混合场景,默认情况下STATEMENT,少数情况下ROW

redo log 不具备数据备份功能的原因是由于 redo log 文件组采用的是循环写方式,所以当脏页刷盘时redo log文件组内容会进行覆盖;之所以bin log不具备crash-safe原因是我们很难判断到底从那个位置进行恢复,而redo logwrite poscheck point指针指明了哪些数据需要恢复。

3.3、bin log 刷盘

bin log属于MySQL体系架构的Server层,事务操作进行过程中,会把日志信息先记录到bin log cache中,等到事务提交后会将bin log cache中记录刷盘到bin log 文件中。

这里需要注意,无论一个事务中包含了多少个增删改操作,都要一次性写入,不可拆分。当一个线程执行事务操作时,MySQL就会为该线程分配bin log cache,而且一个线程某一时刻最多只能执行一个事务。

bin log 刷刷盘时机通过参数sync_binlog控制:

0:每次提交事务写到内核缓冲区,不刷盘(由OS决定何时刷盘)
1:每次提交事务写到内核缓冲区,马上刷盘
N:每次提交事务写到内核缓冲区,累积 N 个事务后才刷盘(N > 1)

3.4、两阶段提交

当事务进行Commit操作时,redo logbin log都会被刷盘持久化保存,但是可能会出现以下两种情况:

bin log刷盘后,redo log还未来得及刷盘,数据库宕机,数据不一致。
redo log刷盘后,bin log还未来得及刷盘,数据库宕机,数据不一致。

说到这里大概知道两阶段提交其实就是为了防止这两个日志不一致,它将事务Commit操作分为两个阶段:Prepare、Commit

  • Prepare:XID(内部 XA 事务的 ID) 写入到 redo log,同时将 redo log 对应的事务状态设置为 prepare,然后将 redo log 持久化到磁盘(默认redo log刷盘策略);
  • Commit:XID 写入到 bin log,马上将 bin log 刷盘(sync_binlog = 1),接着调用引擎的提交事务接口,将 redo log 状态设置为 commit,只要 bin log 写磁盘成功,就算 redo log 的状态还是 prepare 也没有关系,一样会被认为事务已经执行成功。

图片来自于小林coding:
在这里插入图片描述

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

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

相关文章

6.3 业务分析方法 (15%)

一、业务分析方法 1、客户分析 用户从哪里来到哪里去&#xff1b;来源于各个渠道&#xff1b; 分析: 投入产出比&#xff1a;微博&#xff1e;公众号 展示量&#xff1a;微博低于公众号&#xff1b;若增加品牌曝光率&#xff0c;可用公众号渠道 跳失率&#xff1a;微博低于公…

C# Winform画图绘制圆形

一、因为绘制的圆形灯需要根据不同的状态切换颜色,所以就将圆形灯创建为用户控件 二、圆形灯用户控件 1、创建用户控件UCLight 2、设值用户控件大小(30,30)。放一个label标签,AutoSize为false(不自动调整大小),Dock为Fill(填充),textaglign为居中显示。 private Color R…

【leetcode】删除链接的倒数第N个节点

/*** Definition for singly-linked list.* function ListNode(val, next) {* this.val (valundefined ? 0 : val)* this.next (nextundefined ? null : next)* }*/ /*** param {ListNode} head* param {number} n* return {ListNode}*/ var removeNthFromEnd fun…

赋能中国制造,大道云行发布智能制造分布式存储解决方案

《中国制造2025》指出&#xff0c;“制造业是国民经济的主体&#xff0c;是立国之本、兴国之器、强国之基。” 智能制造引领产业提质增效 智能制造是一种利用先进的信息技术、自动化技术和智能技术来优化和升级制造业生产过程的方法。它将人工智能、大数据、物联网、机器学习等…

3DEXPERIENCE Works八大核心优势分析

云技术正在加速普及&#xff0c;助力各行各业数字化转型。根据IDC 2023年12月发布的报告&#xff0c;2023年全球云计算市场规模达到3329亿美元&#xff0c;同比增长19.4%。其中&#xff0c;公有云市场规模达到2587亿美元&#xff0c;同比增长21.5%;私有云市场规模达到742亿美元…

深度学习500问——Chapter02:机器学习基础(3)

文章目录 2.10 主成分分析&#xff08;PCA&#xff09; 2.10.1 主成分分析&#xff08;PCA&#xff09;思想总结 2.10.2 图解PCA核心思想 2.10.3 PCA算法推理 2.10.4 PCA算法流程总结 2.10.5 PCA算法主要优缺点 2.10.6 降维的必要性及目的 2.10.7 KPCA与PCA的区别 2.11 模型评估…

JavaScript基础2之运算符、函数

JavaScript基础 运算符一元操作符递增/递减一元加和减 布尔操作符逻辑非逻辑与逻辑或 乘性操作符乘法操作符除法操作符取模操作符 加性操作符加法操作符减法操作符 比较操作符相等操作符关系操作符 函数函数声明函数表达式箭头函数函数的实参和形参arguments 默认参数参数的拓展…

vue 使用vue-scroller 列表滑动到底部加载更多数据

安装插件 npm install vue-scroller -dmain.js import VueScroller from vue-scroller Vue.use(VueScroller)<template><div class"wrap"><div class"footer"><div class"btn" click"open true">新增</d…

1.2计算机体系结构与存储系统-2

1.编址的相关计算 存1个1或1个0的单位是位&#xff08;bit&#xff09;&#xff1b; 内存是按字节&#xff08;byte&#xff09;编址的&#xff1b; 1byte8bit&#xff1b; 如果有4096个字节的内存&#xff0c;想要表示内存地址的话需要多少位&#xff1f; 0-4095&#xff08;…

项目总体测试计划word

1. 引言 1.1 目的 1.2 适用范围 2. 测试类型 2.1 集成测试 2.2 系统测试 2.3 验收测试 2.4 回归测试 3. 测试环境 4. 测试工具 5. 测试内容 5.1 集成测试 5.1.1 集成测试角色与职责 5.1.2 集成测试产生的工作产品清单 5.2 系统测试 5.2.1 系统测试的角色与职责 5.2.2 系统测试产…

双缝实验是量子力学的重要基石之一

双缝实验是物理学界的基石&#xff0c;特别是对于量子力学来讲。理解这个实验需要结合直觉、数学以及对量子理论抽象且奇异的现实的接受。 一、双缝实验的基础知识 双缝实验证明了波粒二象性的概念&#xff0c;这是量子粒子的基本属性。量子粒子同时具有粒子和波的性质。 在这…

【鸿蒙 HarmonyOS 4.0】登录流程

一、背景 登录功能在应用中是一个常用模块&#xff0c;此次使用 HarmonyOS 实现登录流程&#xff0c;包含页面呈现与网络请求。 二、页面呈现 三、实现流程 3.1、创建项目 构建一个ArkTS应用项目(Stage模型)&#xff0c;今天创建流程可查看官网教程&#xff1a;文档中心 目…

BUUCTF crypto做题记录(13)新手向

一、[MRCTF2020]vigenere 这是一道维吉尼亚密码&#xff0c;但由于不知道密钥&#xff0c;所以我们需要采用爆破的方式。Vigenere Solver | guballa.de 答案&#xff1a;flag{vigenere_crypto_crack_man} 二、[MRCTF2020]keyboard 之前做过一个类似的题目&#xff0c;用九宫格…

一文掌握:教务管理系统该如何设计?

hello&#xff0c;我是贝格前端工场&#xff0c;本期给大家分享教务管理系统的知识点&#xff0c;欢迎老铁们点赞、关注&#xff0c;如有需求可以私信我们。 一、什么是教务管理系统 教务管理系统是一种用于管理学校或教育机构的学生、课程和教学活动的软件系统。它提供了一种…

基于SpringBoot+Apache POI的前后端分离外卖项目-苍穹外卖(十九)

数据导出 1. 工作台1.1 需求分析和设计1.1.1 产品原型1.1.2 接口设计1.2.1 Controller层1.2.2 Service层接口1.2.3 Service层实现类1.2.4 Mapper层 1.3 功能测试 2. Apache POI2.1 介绍2.2 入门案例2.2.1 将数据写入Excel文件2.2.2 读取Excel文件中的数据 3. 导出运营数据Excel…

K8s+ArgoCD,低投入构建内部开发者平台

01 简介 许多人认为&#xff0c;要建立内部开发人员平台&#xff0c;就必须使用像 Spotify Backstage 这样的工具。其实未必&#xff0c;如果将 Kubernetes label 等更原生的方法与 Argo CD 等工具和 GitOps 原则相结合&#xff0c;也可以有效地为开发人员和平台团队提供自助服…

java spring 03 启动细节

启动类ClassPathXmlApplicationContext public ClassPathXmlApplicationContext(String[] configLocations, boolean refresh, Nullable ApplicationContext parent)throws BeansException {super(parent);setConfigLocations(configLocations);if (refresh) {refresh();}}其中…

护眼台灯怎么样选择?5款好用的护眼台灯推荐,完全凭实力说话!

随着护眼台灯用户增长&#xff0c;近年来护眼台灯检测不合格的的问题频频爆出&#xff0c;这种情况大多数都是来自于一些价格低廉、非专业缺乏技术积累的品牌厂家&#xff0c;长期使用存在很大风险。所以我们在选购护眼台灯的时候不能盲目根据销量或者价格就购买&#xff0c;需…

vue2+vite+@vitejs/plugin-vue2可以使用require引用图片资源

很多文章都说vite不能用require&#xff0c;vue3vite确实是这样的&#xff0c;但今天无意间发现vue2vite中是可以使用require引用资源的 vue3搭配vite一般使用的是vitejs/plugin-vue解析vue语法&#xff0c;而vue2使用的则是另一个插件vitejs/plugin-vue2插件解析vue语法 看下…

表单验证、属性绑定(一个属性根据另一个属性有无进行操作)

表单验证 一个属性根据另一个属性有无进行操作&#xff08;属性绑定&#xff09; 1、问题描述 ​ 需求&#xff1a;表单里面后两个属性需要根据前面一个属性进行有无判断。如果前面属性没有输入值&#xff0c;则不需要进行操作&#xff1b;如果前面属性有输入值&#xff0c;则…