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

文章目录

      • 前言
      • 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.rhkb.cn/news/269831.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

List<Object>集合对象属性拷贝工具类

目录 问题现象&#xff1a; 问题分析&#xff1a; 解决方法&#xff1a; 问题现象&#xff1a; 最近在项目中经常会使用到BeanUtils工具类来作对象的属性字段拷贝&#xff0c;但如果应用到List集合的话就需要遍历去操作了&#xff0c;如下&#xff1a; 打印结果&#xff1a; …

《TCP/IP详解 卷一》第7章 防火墙和NAT

7.1 引言 NAT通常改变源IP和源端口&#xff0c;不改变目的IP和目的端口。 7.2 防火墙 常用防火墙&#xff1a; 包过滤防火墙&#xff08;packet-filter firewall&#xff09; 代理防火墙&#xff08;proxy firewall&#xff09; 代理防火墙作用&#xff1a; 1. 通过代理服务…

微信小程序接入百度地图(微信小程序插件)使用文档

第一步配置域名 :在微信公众平台登录后配置服务域名称:https://apis.map.qq.com 第二步申请密钥 申请开发者密钥申请地址 第三步使用插件 选择添加插件 搜索腾讯位置服务地图选点 选择要授权的小程序 授权完毕会在这里显示插件信息 第四步查看使用文档 跳转至文…

【控制台警告】npm WARN EBADENGINE Unsupported engine

今天用webpack下载几个loader依赖&#xff0c;爆出了三个警告&#xff0c;大概的意思就是本地安装的node和npm的版本不是很匹配&#xff1f; 我的解决思路是&#xff1a; 先检查node和npm版本 然后去官网查找版本的对应 靠&#xff0c;官网404 Node.js (nodejs.org) 就找到…

基本设计模式

单例模式 ES5 function Duck1(name:string){this.namenamethis.instancenull }Duck1.prototype.getNamefunction(){console.log(this.name) }Duck1.getInstancefunction(name:string){if(!this.instance){this.instance new Duck1(name)} } const aDuck1.getInstance(a) const…

web学习笔记(二十五)BOM

目录 1.BOM概述 1.1什么是BOM 1.2BOM的构成 2.windom常用属性汇总 3.window常用方法汇总 4.window对象常见事件汇总 5.this总结&#xff1a; 1.BOM概述 1.1什么是BOM BOM(Browser Object Model)就是浏览器对象模型(整个浏览器)&#xff0c;他的核心对象是window,BOM缺…

【计算机】本科考研还是就业?

其实现在很多计算机专业的学生考研&#xff0c;也是无奈的选择 技术发展日新月异&#xff0c;而在本科阶段&#xff0c;大家学着落后的技术&#xff0c;出来找工作自然会碰壁。而且现在用人单位的门槛越来越高&#xff0c;学历默认研究生起步&#xff0c;面试一般都是三轮起步…

前端知识点、技巧、webpack、性能优化(持续更新~)

1、 请求太多 页面加载慢 &#xff08;webpack性能优化&#xff09; 可以把 图片转换成 base64 放在src里面 减少服务器请求 但是图片会稍微大一点点 以上的方法不需要一个一个自己转化 可以在webpack 进行 性能优化 &#xff08;官网有详细描述&#xff09;

第九篇:– 过程发现(Process Discovery)是如何赋能数字化市场营销全过程?- 我为什么要翻译介绍美国人工智能科技巨头IAB公司

IAB平台&#xff0c;使命和功能 IAB成立于1996年&#xff0c;总部位于纽约市。 作为美国的人工智能科技巨头社会媒体和营销专业平台公司&#xff0c;互动广告局&#xff08;IAB- the Interactive Advertising Bureau&#xff09;自1996年成立以来&#xff0c;先后为700多家媒体…

【学习心得】爬虫JS逆向通解思路

我希望能总结一个涵盖大部分爬虫逆向问题的固定思路&#xff0c;在这个思路框架下可以很高效的进行逆向爬虫开发。目前我仍在总结中&#xff0c;下面的通解思路尚不完善&#xff0c;还望各位读者见谅。 一、第一步&#xff1a;明确反爬手段 反爬手段可以分为几个大类 &#…

word转PDF的方法 简介快速

在现代办公环境中&#xff0c;文档格式转换已成为一项常见且重要的任务。其中&#xff0c;将Word文档转换为PDF格式的需求尤为突出&#xff0c;将Word文档转换为PDF格式具有多方面的优势和应用场景。无论是为了提高文档的可读性和稳定性、保障文档的安全性和保护机制、还是为了…

PCM会重塑汽车OTA格局吗(2)

目录 1.概述 2. PCM技术视角下的OTA 3.小结 1.概述 上一篇文章&#xff0c;我们着重讲解了OTA的概述内容&#xff0c;和意法半导体推出的跨域融合MCU的四大特征&#xff0c;其中就包含了OTA技术。 他们针对OTA做了比较创新的设计&#xff0c;在总的可用memory容量不变情况…

day04-Maven

一、初识 Maven Maven 是 Apache 旗下的一个开源项目&#xff0c;是一款用于管理和构建 java 项目的工具。 官网&#xff1a;https://maven.apache.org/ Maven的作用 依赖管理&#xff08;方便快捷的管理项目依赖的资源(jar包)&#xff0c;避免版本冲突问题&#xff09;统一项目…

mq基础类设计

消息队列就是把阻塞队列这样的数据结构单独提取成一个程序独立进行部署。——>实现生产者消费者模型。 但是阻塞队列是在一个进程内部进行的&#xff1b; 消息队列是在进程与进程之间进行实现的&#xff0c; 解耦合&#xff1a;就是在分布式系统中&#xff0c;A服务器调用B…

浅谈马尔科夫链蒙特卡罗方法(MCMC)算法的理解

1.解决的问题 计算机怎么在任意给定的概率分布P上采样&#xff1f;首先可以想到把它拆成两步&#xff1a; &#xff08;1&#xff09;首先等概率的从采样区间里取一个待定样本x&#xff0c;并得到它的概率为p(x) &#xff08;2&#xff09;然后在均匀分布U[0,1]上取一个值&a…

汽车级瞬态抑制TVS二极管优势特性及型号大全

汽车级瞬态抑制TVS二极管是一种高性能的防浪涌过电压电路保护元器件&#xff0c;能够在瞬态电压过高的情况下提供可靠的保护。它能够迅速响应并吸收过电压&#xff0c;将其导向地线&#xff0c;从而保护车辆的电子设备免受损坏。东沃汽车级TVS二极管具有以下几个关键优势&#…

Java包装类

包装类 每种基本数据类型都有一个对应的包装类。这些包装类主要用于包装基本数据类型的值&#xff0c;使其可以作为对象处理。 包装类主要有两个用途&#xff1a; 当需要一个对象而不是一个原始类型时。例如&#xff0c;许多集合类如 ArrayList 只能存储对象&#xff0c;不能存…

网络信息安全:11个常见漏洞类型汇总

一、SQL注入漏洞 SQL注入攻击&#xff08;SQL Injection&#xff09;&#xff0c;简称注入攻击、SQL注入&#xff0c;被广泛用于非法获取网站控制权&#xff0c;是发生在应用程序的数据库层上的安全漏洞。 在设计程序&#xff0c;忽略了对输入字符串中夹带的SQL指令的检查&…

Java项目:38 springboot005学生心理咨询评估系统

作者主页&#xff1a;舒克日记 简介&#xff1a;Java领域优质创作者、Java项目、学习资料、技术互助 文中获取源码 项目介绍 学生心理咨询评估系统有管理员和用户 【主要功能】 用户管理、试题管理、试卷管理、考试管理 【技术组成】 SpringBoot MyBatis Vue Bootstrap j…

CSS字体样式的使用,前端开发手册

零基础学web前端开发要怎么去学? 首先要学习的就是基础知识&#xff1a;html、css和JavaScript。HTML是内容&#xff0c;CSS是表现&#xff0c;JavaScript是行为。前端开发的门槛其实非常低&#xff0c;与服务器端语言先慢后快的学习曲线相比&#xff0c;前端开发的学习曲线是…