MySQL日志redo log、undo log、bin log简介

news/2024/5/9 1:26:55/文章来源:https://blog.csdn.net/peng_shakalaka/article/details/127329084

一条简单的SQL查询语句,执行流程:

查询缓存-词法分析-语法分析-语法书-预处理器-优化器-执行计划-执行器-调用API-引擎-数据
执行器-返回数据-返回缓存
在这里插入图片描述

概述

undo log:回滚日志,原子性,实现事务回滚和MVCC,引擎层实现
redo log:重做日志,崩溃恢复,持久性 ,引擎层实现
bin log:主从复制,数据备份,Server层实现

undo log作用?

undo log:在事务还没有提交之前,记录更新修改前的数据,插入一个新的记录保存新纪录的索引,需要回滚时
找到索引并删掉记录,更新和删除需要保存完整记录,用于恢复。记录的是逻辑日志,delete操作时会有insert记录,
update时反向的update记录。
每产生一个undo log日志都会有一个trx_id和roll_point生成:
trx_id:保存生成此日志的事务id;
roll_point:将undo log连接起来形成版本连;

undo log+ReadView 实现MVCC(多版本并发控制):根据ReadView里面存储的trx_id 和undo log版本链记录中的trx_id进行对比。
读提交隔离级别:每次select操作都生成一个ReadView,保证每次查询到的数据都是已经提交的
可重复读隔离界别:只有第一次select生成一个ReadView,后续每次查询都依据那个ReadView进行查找。
在这里插入图片描述

redo log作用?

redo log:Buffer pool提高了读写性能,但是数据放在内存中是不可靠的,当程序崩溃或者系统断电时会造成缓冲区中脏页
数据没来及持久化到磁盘,因此InnoDB引擎在一条记录需要更新时,现将内容保存在redo log中,后台线程择机将记录持久化
到磁盘中。WAL(Write-Ahead-Logging),即MySQL写操作并不马上更新磁盘,而是先记录在日志中,在适当时候在写到磁盘中。
redo log是物理日志,记录对XXX表空间YYY页的ZZZ偏移位置做了NNN更新。当事务提交时,先将更新记录在redo Log文件中并将其持久化
到磁盘即可,当发生崩溃,虽然缓存中脏页没有更新到磁盘,但是可以根据redo log文件进行恢复。
undo log 和 redo log的区别:
undo log记录事务提交前的状态,更新前的值,用于事务回滚;
redo log记录事务提交后的状态,更新后的值,用于数据恢复,持久化
事务提交前发生崩溃使用undo log来恢复,提交后崩溃使用redo log 恢复;

为什么将数据写入redo log文件比较快?
redo log文件记录时顺序写,而更新数据库磁盘是随机写,随机写速率远远低于顺写。
redo log直接写入磁盘嘛?
NO,redo log也有自己的缓冲区。所以redo log什么时候刷盘写入到磁盘的时机很重要。
主要有以下几个时机:
MySQL服务器正常关闭;
记录空间超过redo log缓冲区大小一半;
InnoDB后台线程1秒钟刷新一次;
每次事务提交根据配置的参数情况进行写入;
参数InnoDB_flush_log_at_trx_commit可以设置为0、1、2
参数为0:提交事务redo log只停留在redo log Buffer中,不会主动触发写入磁盘操作;
参数为1:提交事务时将redo log buffer中的redo log写入到磁盘,保证MySQL异常重启后不会丢失数据;
参数为2:将redo log buffer中的redo log写入到redo log文件中(并不是持久化到磁盘,因为操作系统也有page Cache),
意味写入操作系统的缓存。
在这里插入图片描述

所以当参数为0或者2时神魔时候写入到磁盘呢?
0:引擎后台线程隔1S调用waite()将redo log buffer中内容写入到Page Cache中,再调用fsync()将Page Cache中内容持久化到磁盘,
所以会导致1S钟数据丢失;
2:引擎后台线程隔1S调用fsync()将Page Cache内容持久化到磁盘,只有在操作系统崩溃情况下会导致1S钟数据丢失,MySQL异常退出不会有影响;
在这里插入图片描述

redo log文件满了怎么办?
InnoDB引擎中有重做日志文件组,有两个redo log文件组成(ib_logfile0、ib_logfile1),以循环方式写入两个文件,
write pos记录写的位置,check point记录要擦数的位置,都是顺时针移动。
当write pos追到check point时,导致没有空间进行记录,需要将redo log文件持久化到磁盘,所以MySQL服务器会阻塞,等待重做日志文件组腾出空间。因此在并发操作中,redo log文件大小的配置和参数InnoDB_flush_log_at_trx_commit的配置非常重要,不然会影响系统性能。
在这里插入图片描述

为什么需要binlog?

MySQL的Server层在更新一条记录后待事务提交时候,会将该事物执行过程中产生变更操作(show和select操作不会记录)的binlog统一写入binlog文件中。

最开始 MySQL 里并没有 InnoDB 引擎,MySQL 自带的引擎是 MyISAM,但是 MyISAM 没有 crash-safe 的能力,binlog 日志只能用于归档。
而 InnoDB 是另一个公司以插件形式引入 MySQL 的,既然只依靠 binlog 是没有 crash-safe 能力的,所以 InnoDB 使用 redo log 来实现 crash-safe 能力。

binlog和redo log的区别?

- binlog是Server层实现的日志,所有引擎都可以使用; redo log是InnoDB引擎实现的日志;
- 两者文件格式不同:
binlog有三种格式类型:
STATEMENT(默认格式):每条修改数据的SQL都会记录到binlog中(逻辑操作),主从复制的slave端再根据SQL重现。但是关于动态函数的操作(now)会导致主从库结果不一致;
ROW:记录数据最终被修改为神魔样子,不会出现动态函数的问题。但是每行数据的变化都会被记录,导致binlog文件过大,而STATEMENT格式只会记录一条语句。
MIXED:上面两种的结合,看情况使用STATEMENT或者ROW模式。
- 写入方式不同:
redo log是循环写,会覆盖。
binlog追加写,满了就创建新的
- 用途不一样:
redo log用于掉电故障恢复
binlog主从复制、备份操作

主从复制是如何实现的?

异步、二进制形式(binlog)

基本分为三个阶段:
在这里插入图片描述

  • 写入binlog:主库写binlog文件,提交事务,更新本地存储数据
  • 同步binlog:binlog复制到从库上,从库把binlog暂存到中继日志中
  • 回放binlog:从库SQL线程读取中继日志更新存储引擎中的数据

主从复制模型:

  • 同步复制:主库提交事务等待所有从库复制完成
  • 异步复制:主库提交事务不等待从库
  • 版同步复制:只要有一个从库复制完成就可

binlog何时刷盘?
事务提交后会把binlog cache中的完整事务写入到binlog文件中,并清空binlog cache。

但是并没有持久化到磁盘中,还在文件系统的page cache中,如上提write速度较快因为不涉及磁盘I/O。只有执行fsync才会持久化到磁盘中(此过程速度较慢)
MySQL中参数sync_binlog可设置刷入到磁盘的频率:
在这里插入图片描述

  • sync_binlog = 0提交事务只write,不会fsync,后续操作交给操作系统;
  • sync_binlog = 1:每次write都会fsync;
  • sync_binlog = N:提交事务都write,积累N个失误才会fsync;

事务提交的两个阶段

事务提交后redo log和binlog都需要持久化到磁盘,这两个是独立的逻辑,可能会出现一个成功一个失败的情况:

  • redo log刷盘成功,MySQL宕机机,binlog还没有写入磁盘,重启后会导致主库可以恢复,从库无法恢复,主从不一致;
  • binlog成功,redo log失败,从库执行了相关的操作,但是主库重启后无法恢复,导致主从不一致;

所以为了保持主从库的一致性,必须保证两个日志逻辑上是一致的,提出了两阶段提交,分别是准备(Prepare)和提交(Commit):
MySQL会同时维护binlog日志与InnoDB的redo log,为保证两者的一致性,MySQL使用了内部事务XA,XA事务由binlog作为协调者,存储引擎是参与者。
两阶段的提交流程如下:
在这里插入图片描述

  • Prepare:将内部事务的ID(XID),写入到redo log,并将redo log对应的事务状态设置为prepare,然后将redo log刷新到硬盘;
  • Commit:把XID写入到binlog,将binlog刷入硬盘,调用引擎的提交事务接口,将redo log状态设置为commit;
    遇到MySQL宕机后,会按照顺序扫扫描redo log,碰到处于Prepare状态的redo log,用XID,查看binlog中是否存在此XID:如果存在说明binlog也完成了写入磁盘,则提交事务,如果不存在,说明binlog还没有写入到磁盘,则回滚事务,从而保证了主从一致。

事务没有提交,redo log也会被写入磁盘吗?
会的,事务执行过程中redo log也是写入在redo log buffer中,后台线程将redo logbuffer中的数据一秒钟持久化一次。

两阶段提交的问题?

  • I/O次数高,每次事务的提交都会进行两次fsync(刷盘)。
  • 多个事务时无法保证两者的顺序是一致性,还需要加锁,性能不佳。

所以引出了组提交
当有所个失误提交时,会将多个binlog 的刷盘合并成一个,减少磁盘I/O的次数,将commit分为三个阶段:

  • flush阶段:多个事务按进入顺序将binlog从cache写入文件(不刷盘);
  • sync阶段:对binlog文件做fsync操作(多个事务的binlog合并刷盘);
  • commit阶段:各个事务按顺序做InnoDB commit操作;
    上面内个极端都有一个队列,每个阶段都有锁保护,保证了事务写入的顺序,第一个进入队列的事务会成为leader,全权负责整队的操作。
    在这里插入图片描述

redo log有组提交吗?
在5.7版本中,Prepare阶段不在让各个事务各自执行redo log刷盘操作。将组提交推迟到flush阶段。

MySQL磁盘I/O很高,有什么优化方法?

  • 延迟binlog刷盘操作,减少binlog的刷盘次数
  • 将sync_binlog设置为大于1 的值,每次提交事务都write,延迟binlog刷盘时机。但是掉电可能会丢掉N个事务的binlog日志;
  • redo log文件持久化时只write不去操作fsync。

以上内容和图片参考告别鸽子,从我做起

就是这事,散会。

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

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

相关文章

windows下vs code配置c++环境

1. 下载vs code 下载链接:https://code.visualstudio.com/ 2. 下载mingw64 下载链接:https://sourceforge.net/projects/mingw-w64/ 然后复制到没有中文路径的文件夹中,再配置环境变量。 验证GCC是否配置成功。gcc -v 3. 下载CMake&am…

RTSP,Java实现简单的RTSP报文交换

这里写目录标题RTSP协议是什么报文实例:1. OPTIONS2. DESCRIBE4. SETUP5. PLAYJava实现简单的RTSP报文交换了解RTSP协议使用Java程序编写RTSP客户端 访问 RTSP服务端,实现拉流 RTSP协议是什么 RTSP是一种基于文本的协议,用CRLF(回车换行)作…

PT_概率论基本概念和事件运算性质

文章目录基本概念随机试验样本点SP(ω\omegaω)例样本空间SSΩ\OmegaΩ例随机事件/事件例基本事件随机事件和基本事件的关系出现/发生必然事件Ω\OmegaΩ不可能事件事件之间的关系事件的包含事件相等交事件/积事件互斥事件(互斥/不相容)∅\varnothing∅并事件(和事件)对立事件(…

CIAGAN: Conditional Identity Anonymization Generative Adversarial Networks

CIAGAN: Conditional Identity Anonymization Generative Adversarial Networks CIAGAN:条件身份匿名生成对抗网络 https://github.com/dvl-tum/ciagan ABSTRCT 计算机视觉技术在社会上的使用空前增加,与此同时,人们对数据隐私的关注也日益…

[附源码]Java计算机毕业设计SSM巴州监控中心人事管理系统

项目运行 环境配置: Jdk1.8 Tomcat7.0 Mysql HBuilderX(Webstorm也行) Eclispe(IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持)。 项目技术: SSM mybatis Maven Vue 等等组成,B/S模式 M…

北京化工大学数据结构2022/10/13作业 题解

目录 问题 A: 字符串变换 问题 B: 字符串求反 问题 C: 字符串转化为整数(附加代码模式) 问题 D: 字符串匹配(朴素算法)-附加代码模式 问题 E: 求解最长首尾公共子串-附加代码模式 问题 F: 算法4-7:KMP算法中的模…

AR 配置并导出IOS开发环境配置

文章目录前言一、导入插件二、设置开发环境三、搭建基础框架四、代码五、导出六、测试总结前言 最近接了公司的一个AR项目,需要用MacBook,所以赶鸭子上架,现学…小本本记下来 我用的unity是2020.3.15f2c1, MacBook是 2020MacBook M1, ipad是…

Azkaban(三):进阶案例-java作业类型案例、条件工作流案例、定时执行案例

目录 Javaprocess作业类型案例 条件工作流案例 运行时参数案例 预定义宏案例 定时执行案例 Javaprocess作业类型案例 Javaprocess类型可以运行一个自定义主类方法,type类型为javaprocess。 1.创建maven工程,创建类名,创建AzkabanCase类…

ISP图像信号处理 | GAMES204-计算成像

图像信号处理 | GAMES204-计算成像Dead Pixel CorrectionBlack Level CompensationAnti-aliasingLens Shading CorrectionNoise Reduction3ASAuto-exposureAuto FocusAWBDemosaic:CFA InterpolationColor CorrectionEdge EnhancementFalse Color SuppressionBrightn…

运动用品品牌排行榜,双十一运动装备选购清单

运动需要我们坚定的决心与毅力,因为它也是一个枯燥而艰辛的过程,需要无数汗水的挥洒与不断重复的坚持。为了让自己能更坚持下去运动,我一般都会选择用外在运动装备来辅助锻炼,不仅仅能提高运动效率,还能让运动更加快乐…

移动端自动化任务-AutoJs Pro v9使用教程(一)

官网 - Auto.js Pro Github代码示例 教程与博客 (autojs.org) 开源版文档 Pro 版 API 旧文档 Pro 版 v9新文档 一、前言 本教程是本人学习 Auto.js Pro V9 的记录,算是个入门教程,通过本文可帮你快速了解 autojs 的大体用法和开发步骤。官方文档也有中文…

【qml】QQuickPaintedItem作为代理在ListView中使用

文章目录1.说明2.程序截图3.TextBalloon 类3.1 TextBalloon.h3.2 TextBalloon.cpp3.3 textballoons.qml3.4 main.cpp1.说明 QQuickPaintedItem类提供了一种在QML场景图中使用QPainter API的方法。 QQuickPaintedItem本身作为Item,也可以在ListView中作为代理使用。…

机器学习笔记 - sklearn决策树(kaggle 实战 Titanic 入门)

Kaggle - Titanic 前言 这是 Kaggle 上非常典型的一道入门题,可以用很多机器学习或者深度学习甚至是一些“奇淫技巧”的方法来解决。因为我是一个初学者,所以我希望在尽可能提高正确率的情况下,用更简单的方法。如果这也能帮助到你&#xf…

数据库作业一

MySQL数据库 MySQL官方提供了两个不同的版本: 1、社区版 (MySQL Commimity Server)免费,MySQL不提供任何技术支持(本文操作选用社区版) 2、商业版(MySQL Enterprise Edition)收费&a…

[Microsoft] 通过Microsoft Spotlight 中国站云技能挑战获取微软免费考试券

这是一篇关于微软Spotlight 推出学习活动的同时,如何获得免费考试券的方法,如果该文章在未来时间已经失效,那么建议你关注一下这个博客,有Azure China Cloud最新的消息会进行更新通知。 文章目录1. 所需准备注册账号2. 参加 Micro…

二十八、Hive集成HBase分析搜索引擎用户行为数据

我们已经知道,HBase数据库没有类SQL的查询方式,因此在实际的业务中操作和计算数据非常不方便。而Hive支持标准的SQL语法(HiveQL),若将Hive与HBase集成,则可以通过HiveQL直接对HBase的表进行读写操作,让HBase支持JOIN、GROUP等SQL查询语法,完成复杂的数据分析。甚至可以…

【电源设计】13开关电源仿真与应用

0.前言 本章主要是大概了解一下开关电源仿真与应用,开关电源仿真设计全过程:包括需求分析/控制/PWM。因为本人并不是专门做电源的,此部分内容仅作了解,并不专门去学习。 文章目录0.前言1.项目需求2.方案介绍2.1DCDC级&#xff08…

互联网重提内容为王?学Netflix(奈飞)做好内容营销

Netflix 成立于1997年,不久便一跃成为最受瞩目的流媒体服务网站。它为什么能在短短时间内获得如此巨大的成功呢?答案就在于它使用的超凡 内容营销策略 和方法 —— 数据驱动 、优化内容、以流量转化为目标。 内容为王众人皆知,内容营销是品牌…

【计算机毕业设计】java ssm高校计算机网络考试系统(源码+论文)

提供了一些今年最新计算机毕业设计源代码、文档及帮助指导,公众号:一点毕设,领取更多毕设资料。 随着计算机以及网络在教学领域的高速发展,为了加快数字化校园的进程,更好的实现现代化的教育改革,针对于当下…

手动制作满足SARscape要求的_dem数据

手动制作满足SARscape要求的_dem数据问题描述1 下载研究区的原始DEM数据,在envi中镶嵌裁剪,得到.dat格式的数据,然后用envi中的Original ENVI工具把.dat转成_dem1.1 下载研究区的原始DEM数据1.2 将.tif数据转成envi格式的.dat2. 能不能直接将…