MySQL知识学习03(三大日志详解 binlog、redo log、undo log)

news2024/9/24 5:32:30

前言

MySQL 日志 主要包括错误日志、查询日志、慢查询日志、事务日志、二进制日志几大类。其中,比较重要的还要属二进制日志 binlog(归档日志)事务日志 redo log(重做日志)undo log(回滚日志)

在这里插入图片描述
1、redo log?

redo log(重做日志)是InnoDB存储引擎独有的,它让MySQL拥有了崩溃恢复能力。

比如 MySQL 实例挂了或宕机了,重启时,InnoDB存储引擎会使用redo log恢复数据,保证数据的持久性与完整性。

在这里插入图片描述

MySQL 中数据是以页为单位,你查询一条记录,会从硬盘把一页的数据加载出来,加载出来的数据叫数据页,会放入到 Buffer Pool 中。

后续的查询都是先从 Buffer Pool 中找,没有命中再去硬盘加载,减少硬盘 IO 开销,提升性能

更新表数据的时候,也是如此,发现 Buffer Pool 里存在要更新的数据,就直接在 Buffer Pool 里更新。

然后会把“在某个数据页上做了什么修改”记录到重做日志缓存(redo log buffer)里,接着刷盘到 redo log 文件里

在这里插入图片描述

理想情况,事务一提交就会进行刷盘操作,但实际上,刷盘的时机是根据策略来进行的。

小贴士: 每条 redo 记录由“表空间号+数据页号+偏移量+修改数据长度+具体修改的数据”组成

2、刷盘时机

InnoDB 存储引擎为 redo log 的刷盘策略提供了 innodb_flush_log_at_trx_commit 参数,它支持三种策略:

  • 0 :设置为 0 的时候,表示每次事务提交时不进行刷盘操作
  • 1 :设置为 1 的时候,表示每次事务提交时都将进行刷盘操作(默认值)
  • 2 :设置为 2 的时候,表示每次事务提交时都只把 redo log buffer 内容写入 page cache

innodb_flush_log_at_trx_commit 参数默认为 1 ,也就是说当事务提交时会调用 fsyncredo log 进行刷盘

另外,InnoDB 存储引擎有一个后台线程,每隔1 秒,就会把 redo log buffer 中的内容写到文件系统缓存(page cache),然后调用 fsync 刷盘。

在这里插入图片描述

也就是说,一个没有提交事务的 redo log 记录,也可能会刷盘。

为什么呢?

因为在事务执行过程 redo log 记录是会写入redo log buffer 中,这些 redo log 记录会被后台线程刷盘。

在这里插入图片描述

除了后台线程每秒1次的轮询操作,还有一种情况,当 redo log buffer 占用的空间即将达到 innodb_log_buffer_size 一半的时候,后台线程会主动刷盘。

下面是不同刷盘策略的流程图。

innodb_flush_log_at_trx_commit=0

在这里插入图片描述

0时,如果MySQL挂了或宕机可能会有1秒数据的丢失。

innodb_flush_log_at_trx_commit=1

在这里插入图片描述

1时, 只要事务提交成功,redo log记录就一定在硬盘里,不会有任何数据丢失。

如果事务执行期间MySQL挂了或宕机,这部分日志丢了,但是事务并没有提交,所以日志丢了也不会有损失。

innodb_flush_log_at_trx_commit=2

在这里插入图片描述

2时, 只要事务提交成功,redo log buffer中的内容只写入文件系统缓存(page cache)。

如果仅仅只是MySQL挂了不会有任何数据丢失,但是宕机可能会有1秒数据的丢失。

3、日志文件组?

硬盘上存储的 redo log 日志文件不只一个,而是以一个日志文件组的形式出现的,每个的redo日志文件大小都是一样的。

比如可以配置为一组4个文件,每个文件的大小是 1GB,整个 redo log 日志文件组可以记录4G的内容。

它采用的是环形数组形式,从头开始写,写到末尾又回到头循环写,如下图所示。

在这里插入图片描述

在个日志文件组中还有两个重要的属性,分别是 write poscheckpoint

  • write pos 是当前记录的位置,一边写一边后移
  • checkpoint 是当前要擦除的位置,也是往后推移

每次刷盘 redo log 记录到日志文件组中write pos 位置就会后移更新。

每次 MySQL 加载日志文件组恢复数据时,会清空加载过的 redo log 记录,并把 checkpoint 后移更新。

write poscheckpoint 之间的还空着的部分可以用来写入新的 redo log 记录。

在这里插入图片描述

如果 write pos 追上 checkpoint ,表示日志文件组满了,这时候不能再写入新的 redo log 记录,MySQL 得停下来,清空一些记录,把 checkpoint 推进一下。

在这里插入图片描述

4、redo log 小结?

现在我们来思考一个问题: 只要每次把修改后的数据页直接刷盘不就好了,还有 redo log 什么事?

它们不都是刷盘么?差别在哪里?

1 Byte = 8bit
1 KB = 1024 Byte
1 MB = 1024 KB
1 GB = 1024 MB
1 TB = 1024 GB

实际上,数据页大小是16KB,刷盘比较耗时,可能就修改了数据页里的几 Byte 数据,有必要把完整的数据页刷盘吗?

而且数据页刷盘是随机写,因为一个数据页对应的位置可能在硬盘文件的随机位置,所以性能是很差。

如果是写 redo log,一行记录可能就占几十 Byte,只包含表空间号、数据页号、磁盘文件偏移 量、更新值,再加上是顺序写,所以刷盘速度很快

所以用 redo log 形式记录修改内容,性能会远远超过刷数据页的方式,这也让数据库的并发能力更强。

其实内存的数据页在一定时机也会刷盘,我们把这称为页合并,讲 Buffer Pool的时候会对这块细说

5、binlog?

redo log 它是物理日志,记录内容是“在某个数据页上做了什么修改”,属于 InnoDB 存储引擎

binlog逻辑日志,记录内容是语句的原始逻辑,类似于“给 ID=2 这一行的 c 字段加 1”,属于MySQL Server 层。

不管用什么存储引擎,只要发生了表数据更新,都会产生 binlog 日志

那 binlog 到底是用来干嘛的?

可以说MySQL数据库的数据备份、主备、主主、主从都离不开binlog,需要依靠binlog来同步数据,保证数据一致性

在这里插入图片描述

binlog会记录所有涉及更新数据的逻辑操作,并且是顺序写。

6、记录格式

binlog 日志有三种格式,可以通过binlog_format参数指定。

  • statement
  • row
  • mixed

指定statement,记录的内容是SQL语句原文,比如执行一条update T set update_time=now() where id=1,记录的内容如下。

在这里插入图片描述

同步数据时,会执行记录的SQL语句,但是有个问题,update_time=now()这里会获取当前系统时间,直接执行会导致与原库的数据不一致。

为了解决这种问题,我们需要指定为row,记录的内容不再是简单的SQL语句了,还包含操作的具体数据,记录内容如下。

在这里插入图片描述

row格式记录的内容看不到详细信息,要通过mysqlbinlog工具解析出来。

update_time=now()变成了具体的时间update_time=1627112756247,条件后面的@1、@2、@3 都是该行数据第 1 个~3 个字段的原始值(假设这张表只有 3 个字段)。

这样就能保证同步数据的一致性,通常情况下都是指定为row, 这样可以为数据库的恢复与同步带来更好的可靠性。

但是这种格式,需要更大的容量来记录,比较占用空间 ,恢复与同步时会更消耗IO资源,影响执行速度。

所以就有了一种折中的方案,指定为mixed,记录的内容是前两者的混合。

MySQL会判断这条SQL语句是否可能引起数据不一致,如果是,就用row格式否则就用statement格式

7、写入机制

binlog的写入时机也非常简单,事务执行过程中,先把日志写到binlog cache,事务提交的时候,再把binlog cache写到binlog文件中。

因为一个事务的binlog不能被拆开,无论这个事务多大,也要确保一次性写入,所以系统会给每个线程分配一个块内存作为binlog cache

我们可以通过binlog_cache_size参数控制单个线程 binlog cache 大小,如果存储内容超过了这个参数,就要暂存到磁盘(Swap)。

binlog日志刷盘流程如下

在这里插入图片描述

  • 上图的 write,是指把日志写入到文件系统的 page cache,并没有把数据持久化到磁盘,所以速度比较快
  • 上图的 fsync,才是将数据持久化到磁盘的操作

writefsync的时机,可以由参数sync_binlog控制,默认是0

为0的时候,表示每次提交事务都只write,由系统自行判断什么时候执行fsync。

在这里插入图片描述

虽然性能得到提升,但是机器宕机,page cache里面的 binlog 会丢失。

为了安全起见,可以设置为1,表示每次提交事务都会执行fsync,就如同 redo log 日志刷盘流程 一样。

最后还有一种折中方式,可以设置为N(N>1),表示每次提交事务都write,但累积N个事务后才fsync

在这里插入图片描述

在出现IO瓶颈的场景里,将sync_binlog设置成一个比较大的值,可以提升性能。

同样的,如果机器宕机,会丢失最近N个事务的binlog日志。

8、两阶段提交

  • redo log(重做日志)让InnoDB存储引擎拥有了崩溃恢复能力。
  • binlog(归档日志)保证了MySQL集群架构的数据一致性。

虽然它们都属于持久化的保证,但是侧重点不同。

在执行更新语句过程,会记录redo logbinlog两块日志,以基本的事务为单位,redo log在事务执行过程中可以不断写入,而binlog只有在提交事务时才写入,所以redo log与binlog的写入时机不一样。

在这里插入图片描述

回到正题,redo logbinlog两份日志之间的逻辑不一致,会出现什么问题?

我们以update语句为例,假设id=2的记录,字段c值是0,把字段c值更新成1,SQL语句为update T set c=1 where id=2

假设执行过程中写完redo log日志后,binlog日志写期间发生了异常,会出现什么情况呢?

在这里插入图片描述

由于binlog没写完就异常,这时候binlog里面没有对应的修改记录。因此,之后用binlog日志恢复数据时,就会少这一次更新,恢复出来的这一行c值是0,而原库因为redo log日志恢复,这一行c值是1,最终数据不一致。

在这里插入图片描述

为了解决两份日志之间的逻辑一致问题,InnoDB存储引擎使用两阶段提交方案

原理很简单,将redo log写入拆成了两个步骤preparecommit,这就是两阶段提交。

在这里插入图片描述

使用两阶段提交后,写入binlog时发生异常也不会有影响,因为MySQL根据redo log日志恢复数据时,发现redo log还处于prepare阶段,并且没有对应binlog日志,就会回滚该事务

在这里插入图片描述

再看一个场景,redo log设置commit阶段发生异常,那会不会回滚事务呢?

在这里插入图片描述

并不会回滚事务,它会执行上图框住的逻辑,虽然redo log是处于prepare阶段,但是能通过事务id找到对应的binlog日志,所以MySQL认为是完整的,就会提交事务恢复数据。

9、undo log

我们知道如果想要保证事务的原子性,就需要在异常发生时,对已经执行的操作进行回滚

在 MySQL 中,恢复机制是通过 回滚日志(undo log) 实现的,所有事务进行的修改都会先记录到这个回滚日志中,然后再执行相关的操作。如果执行过程中遇到异常的话,我们直接利用 回滚日志 中的信息将数据回滚到修改之前的样子即可!

并且,回滚日志会先于数据持久化到磁盘上。这样就保证了即使遇到数据库突然宕机等情况,当用户再次启动数据库的时候,数据库还能够通过查询回滚日志来回滚将之前未完成的事务。

另外,MVCC 的实现依赖于:隐藏字段、Read View、undo log。在内部实现中,InnoDB 通过数据行的 DB_TRX_IDRead View 来判断数据的可见性,如不可见,则通过数据行的 DB_ROLL_PTR 找到 undo log 中的历史版本。

每个事务读到的数据版本可能是不一样的,在同一个事务中,用户只能看到该事务创建 Read View 之前已经提交的修改和该事务本身做的修改

10、总结

MySQL InnoDB 引擎使用 redo log(重做日志) 保证事务的持久性,使用 undo log(回滚日志) 来保证事务的原子性

MySQL数据库的数据备份、主备、主主、主从都离不开binlog,需要依靠binlog来同步数据,保证数据一致性。

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

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

相关文章

【校招VIP】很神奇,把简历上的学校名称和姓名盖住,其它的部分都很常见,那简历通过率一定很低

在五一之前的一场简历指导的直播里面,发现了一份有意思的简历。 大家如果把这份简历的学校和姓名抹掉,会发现好像跟自己写的简历一模一样。 技能、项目等都是很通用的。 也就是说,这份简历你能写,你的同学也可以写,甚…

项目执行落地的6个步骤

项目执行是将项目计划付诸行动的过程,为客户或利益相关者生产可交付的产品或服务,也就是所谓的产品或服务。它发生在规划阶段之后,在此期间,一个团队确定了项目的关键目标,以及时间表和预算。 执行包括协调资源和衡量…

现在的00后测试员这么野?领导:这我真管不了...

马上就要迎来一年一度的毕业季,今年即将有1158万00后毕业生正式踏入职场。虽然00后是最近两年才晋升为新鲜出炉的职场小鲜肉,但在一众前辈的眼中,已经身居重任,期望他们能够成为职场中的一股清流,改变一贯以来的职场风…

I2C工作流程

FM33A0XX的I2C接口只用作主机,且不支持多主机,因此挂在总线上的其他设备都是从机。总线上总是由主机提供同步时钟SCL,SDA数据流方向可以是主机发送从机接收,或者从机发送主机接收。 数据发送流程 1、主机发起 START 时序 2、主机…

比较两种精细结构的迭代次数

( A, B )---3*30*2---( 1, 0 )( 0, 1 ) 让网络的输入有3个节点,训练集AB各由5张二值化的图片组成,让A中有6个1,B中全是0,排列组合A ,统计迭代次数的顺序。共有5005组不同的排列组合,但只有181个不同的迭代…

C#,生信软件实践(02)——DNA数据库EMBL格式详解及转为FASTA格式文件的源代码

>生信老白写的基础代码.fasta MAYBENOANYUSAGE 1 EMBL 1.1 EMBL组织 欧洲分子生物学实验室EMBL(European Molecular Biology Laboratory)1974年由欧洲14个国家加上亚洲的以色列共同发起建立,现在由欧洲30个成员国政府支持组成&#xf…

文字流光效果

提示&#xff1a;文字流光动画效果&#xff0c;炫酷标题 前言 提示&#xff1a;以下是本篇文章的代码内容,供大家参考,相互学习 一、html代码 <!DOCTYPE html> <html><head><meta http-equiv"content-type" content"text/html; charsetu…

文献阅读(50)—— Transformer 用于肺癌诊断预测

文献阅读&#xff08;50&#xff09;—— Transformer 用于肺癌诊断预测 文章目录 文献阅读&#xff08;50&#xff09;—— Transformer 用于肺癌诊断预测先验知识/知识拓展文章结构背景文章方法1. 文章核心网络结构2. Time Encoding ViT &#xff08;TeViT&#xff09;3. Tim…

【测试面试】软件测试技术面试,知己知彼百战百胜-成为offer收割机...

目录&#xff1a;导读 前言一、Python编程入门到精通二、接口自动化项目实战三、Web自动化项目实战四、App自动化项目实战五、一线大厂简历六、测试开发DevOps体系七、常用自动化测试工具八、JMeter性能测试九、总结&#xff08;尾部小惊喜&#xff09; 前言 软件测试面试题&am…

自动化测试中验证码问题如何解决?

经常会被问到如何解决验证码的问题&#xff0c;在此记录一下我所知道的几种方式。 对于web应用来说&#xff0c;大部分的系统在用户登录时都要求用户输入验证码&#xff0c;验证码的类型的很多&#xff0c;有字母数字的&#xff0c;有汉字的&#xff0c;甚至还要用户输入一条算…

贪心法——迪杰斯特拉算法

问题描述&#xff1a; 迪杰斯特拉算法Time Limit: 2000 MSMemory Limit: 5000 KB Description 给定n(n<500)个顶点,以及E(E<10000)条边&#xff0c;使用迪杰斯特拉算法计算顶点s到顶点t的最短路径.Input 第一行输入T表示有T组数据。每组数据第一行输入n、E、s、t&…

大数据图书推荐:Python数据分析与挖掘实战(第2版)

《Python数据分析与挖掘实战&#xff08;第2版&#xff09;》的配套学习视频&#xff0c;课程内容共分为基础篇&#xff08;第1~5章&#xff09;和实战篇&#xff08;第6~11章&#xff09;。 基础篇内容包括数据挖掘的概述、基本流程、常用工具、开发环境&#xff0c;Python数据…

7种超轻量级的Linux发行版,希望能够帮助你找到适合自己的操作系统

Linux是一种非常受欢迎的开源操作系统&#xff0c;而且有许多版本可以选择。有时候&#xff0c;你需要一种超轻量级的Linux发行版&#xff0c;它可以在资源有限的设备上运行&#xff0c;并且能够快速启动。本文将介绍7种超轻量级的Linux发行版&#xff0c;希望能够帮助你找到适…

【Python习题集4】字符串与正则表达式

字符串与正则表达式 一、实验内容二、实验总结 一、实验内容 1.输人一个字符串,将该字符串中下标为偶数的字符组成新串并通过字符串格式化方式显示。 (1)源代码 x input("请输入一个字符串&#xff1a;") y x[::2] print("下标为偶数的字符组成的新串为&…

1.goldeye百个靶机渗透(精写-思路为主)

1-goldeye 特别注明&#xff1a;本文章只用于学习交流&#xff0c;不可用来从事违法犯罪活动&#xff0c;如使用者用来从事违法犯罪行为&#xff0c;一切与作者无关。 文章目录 1-goldeye特别注明&#xff1a;本文章只用于学习交流&#xff0c;不可用来从事违法犯罪活动&#…

Multi-Band Blending

多频带融合&#xff08;Multi-Band Blending&#xff09;算法是一种图像融合技术&#xff0c;用于将两个或多个图像无缝地合并在一起&#xff0c;以创建一个平滑的过渡区域。该算法常用于图像合成、图像拼接和全景图像生成等应用中。 多频带融合算法基于频域的图像处理技术&am…

Three——三、动画执行、画布大小、渲染帧率和相机适配体验

动画渲染循环 threejs 可以借助 HTML5 的 API 请求动画帧 window.requestAnimationFrame 实现动画渲染。 请求动画帧window.requestAnimationFrame(实现周期性循环执行) // requestAnimationFrame实现周期性循环执行 // requestAnimationFrame默认每秒钟执行60次&#xff0c…

DJI RTK无人机采集后的文件分析:nav、bin、event、MRK文件

NAV文件&#xff1a; NAV文件是导航数据文件。它们通常存储有关飞行路径、GPS坐标、高度和其他相关数据的信息。这些数据可用于图像的地理参照、飞行分析或故障排除。 EVENT文件&#xff1a; EVENT文件记录了飞行过程中发生的各种事件&#xff0c;如无人机何时起飞&#xff0c…

在线办公大势所趋,细说3种主流云办公方式优劣

文章目录 前言在线协作&#xff1a;WPS优势方面部分缺点 远程控制&#xff1a;ToDesk优势方面部分缺点 云桌面&#xff1a;阿里云桌面优势方面部分缺点 总结 前言 云办公会不会在未来五到十年成为普遍现象&#xff1f;当我们在疫情期间不得不加入远程办公行列时&#xff0c;其…

DC-DC 自举电容

背景&#xff1a; 最近在调试一个DC-DC电路&#xff0c;16V/20A的芯片&#xff0c;功率算是中等偏上。 DCDC工作不正常&#xff0c;空载有输出&#xff0c;接负载后&#xff0c;电压马上掉落到大概2.3V&#xff0c;一开始以为是电感选取不对&#xff0c;瞬态响应不足&#xf…