草庐IT

【MySQL】MySQL日志系统以及InnoDB背后的技术(MySQL专栏启动)

小明java问道之路 2023-04-03 原文

📫作者简介:小明java问道之路,专注于研究 Java/ Liunx内核/ C++及汇编/计算机底层原理/源码,就职于大型金融公司后端高级工程师,擅长交易领域的高安全/可用/并发/性能的架构设计与演进、系统优化与稳定性建设。

      

📫 热衷分享,喜欢原创~ 关注我会给你带来一些不一样的认知和成长。

      

🏆 InfoQ签约作者、CSDN专家博主/后端领域优质创作者/内容合伙人、阿里云专家/签约博主、51CTO专家 🏆

     

🔥如果此文还不错的话,还请👍关注、点赞、收藏三连支持👍一下博主~ 

本文目录

本文导读

一、Redo Log

1、什么是redo log

2、redo log工作原理解析

3、redo log 如何设置

二、Bin Log

三、InnoDB执行与Log系统的关系

1、InnoDB执行更新的底层原理

2、两阶段提交

四、Redo log 与 Bin Log 区别

五、Undo Log

1、什么是 Undo Log

2、Write Ahead Logging(WAL)

六、事务的四大特性与Log系统的关系

总结


本文导读

本文主要详解MySQL数据库中 Redo log(重做日志)、 Bin Log (归档日志)、Uudo Log(撤销日志),以及 Log 与 InnoDB 的关系和区别,和MySQL事务特性的底层原理。

本文也是对《MySQL事务隔离机制与实现原理详解》、《MVCC详解与MVCC实现原理》的补充说明。

一、Redo Log

在MySQL存储引擎的底部是物理存储层,它是文件的物理存储层(包括二进制日志、数据文件、错误日志、慢查询日志、完整日志、redo/undo 日志等)。

1、什么是redo log

在MySQL中,如果每次更新操作都需要写入磁盘,那么磁盘也必须找到相应的记录,然后进行更新。整个过程的 IO 成本和搜索成本都很高。

为了解决这个问题,MySQL中经常提到的WAL技术,WAL的全称是Write Ahead Logging(提前写入日志)。它的关键点是首先写入日志,然后写入磁盘

具体来说,当需要更新记录时,InnoDB引擎将首先将记录写入重做日志并更新内存。此时,更新完成。同时,InnoDB引擎会在适当的时候将此操作记录更新到磁盘,此更新通常在系统空闲时完成。

2、redo log工作原理解析

Redo log 是一个循环重用的文件集,负责记录 InnoDB 存储引擎中缓冲池(Buffer Pool)的所有物理修改日志。

提交事务时,日志缓冲区 log buffer 将刷新为 Redo log 日志文件。

当检查点位置的 LSN 和最新写入的 LSN 差值(checkpoint_age)达到总 Redo log 日志空间的 75% 时,InnoDB 存储引擎将执行异步刷新操作,直到其降至75%以下,并释放重做日志空间。

当 checkpoint_age  达到总文件大小的 90% 时,将触发同步刷新。此时,InnoDB处于暂停状态,无法运行。

write pos 写入位置是当前记录的位置。它在书写时向后移动。写入3号文件的末尾后,将返回0号文件的开头。checkpoint 检查点是要擦除的当前位置。它也向后移动并循环。在擦除记录之前,应将记录更新为数据文件。

write pos 写入位置和 checkpoint 检查点之间是的空白部分,可以用来记录新的操作。如果写入pos 赶上了检查点 checkpoint,则意味着 Redo log 已满,此时无法执行新的更新。相反,停止并擦除一些记录以推进 checkpoint 。

通过 Redo log 日志,InnoDB可以确保即使数据库异常重启,之前提交的记录也不会丢失。这种能力称为 crash-safe (碰撞安全)。

3、redo log 如何设置

Redo log 日志的大小直接影响数据库的处理能力,如果设置太小,强制检查点 checkpoint  操作将频繁刷新脏页。

InnoDB 的 Redo log 是固定大小的,比如可以配置为一组 4 个文件,每个文件的大小是 1GB,总共就可以记录 4GB 的操作,从头开始写,写到末尾就又回到开头循环写。

最后我们需要将重做日志设置为更大的大小。在5.6版之前,Redo log 日志的总大小不能超过3.8GB。5.7版之后,此限制被释放。由于它太小而无法影响性能,所以将其设置为尽可能大是否更好?

二、Bin Log

MySQL有两个部分:一个是引擎层,负责与存储相关的具体事宜。我们上面讨论的 Redo log 日志是 InnoDB引擎的一个独特日志,

一个是服务器层,它主要在MySQL服务器层做事情,服务器层日志,称为 Bin Log(归档日志)

MySQL期初没有 InnoDB 存储引擎。MySQL自己的引擎是 MyISAM,但 MyISAM 没有崩溃安全功能,Bin log 日志只能用于存档。

三、InnoDB执行与Log系统的关系

1、InnoDB执行更新的底层原理

执行此更新语句时,执行器和InnoDB引擎的内部工作原理:

一、执行器首先查找引擎以获得行。ID是主键,引擎直接使用树搜索来查找该行。

如果该行的数据页已经在内存中,它将直接返回到执行器;否则,您需要在返回之前从磁盘读取内存。

二、执行器获取引擎给出的行数据,将1加到该值上,获取一行新数据,然后调用引擎接口写入新数据行。

三、引擎将新数据更新到内存,并将更新操作记录在重做日志中。此时,重做日志处于准备状态。然后告诉执行者执行已完成,事务可以随时提交。

四、执行器为该操作生成 Bin Log,并将 Bin Log 归档日志写入磁盘。

五、MySQL 执行器调用引擎的提交事务接口,引擎将刚刚写入的  Redo Log  日志更改为提交状态,更新完成。

2、两阶段提交

流程图中可以看到,MySQL InnoDB 将 Redo log 的写入拆成了两个步骤:prepare 和 commit,这就是"两阶段提交"。

Redo log Bin Log 都可以用来指示事务的提交状态。两阶段提交是为了保持两种状态的逻辑一致。

四、Redo log 与 Bin Log 区别

Redo log 重做日志对于InnoDB引擎是唯一的;Binlog 归档位置是在MySQL的服务器层上实现的,可以被所有引擎使用。

Redo log 是一个物理日志,记录对数据页所做的更改;Bin log是记录语句原始逻辑的逻辑日志。

Redo log 是循环写入的,空间会用完;可以附加 Bin log,Bin log 文件在写入到一定大小后将切换到下一个,并且不会覆盖上一个日志。

五、Undo Log

1、什么是 Undo Log

物理层在逻辑上分为系统表空间、用户表空间和 Undi Log 日志。

系统表空间包含 ibdata 文件和一些 Undo文件。ibdata文件包含 insert buffer 插入缓冲区段、 double write 双写段、回滚段、索引段、数据字典段和 Undo 信息段。

MySQL 5.7的新特性如下:Undo 撤销与共享表空间的 ibdata 文件分离。您可以在安装MySQL时自行指定文件大小和编号。

MySQL 8.0的新特性如下:InnoDB表的数据字典和 Undo 与共享表空间 ibdata 完全分离。此前,ibdata 文件中的数据字典需要与独立表空间ibd文件中的数据库字典保持一致。

2、Write Ahead Logging(WAL)

首先写入日志,然后写入磁盘。成功写入日志后,事务不会丢失。

稍后,检查点机制将确保磁盘物理文件和重做日志之间的一致性;

使用 Redo Log 记录更改的数据,即使用 Redo Log 来记录交易数据的更改值;

使用 Undo Log 记录更改前的数据,也就是说,Undo Log 将记录事务数据更改前的值,以便回滚和多版本读取其他事务。

六、事务的四大特性与Log系统的关系

事务的 ACID 都需要通过 Redo、Undo 日志来保证等。

本小节是对《MySQL事务隔离机制与实现原理详解》、《MVCC详解与MVCC实现原理》的补充说明。

原子性:原子性与 WAL 有很大的关系。需要从 Redo 重做日志恢复的数据。如果事务没有提交,缓冲池的脏页被刷新,那么不应该存在的数据怎么会消失?它需要通过撤销来实现,这是通过 Undo 重做来保证的。因此,最终原子性由 Redo 的 WAL 机制保证。

持久性:一旦事务通过原子性提交,即使在停机的情况下,也可以从逻辑上检索数据,然后再次写入物理存储空间。这确保了数据不会从逻辑和物理方面(即数据库的持久性)丢失。

隔离性:指事务的执行不能受到其他事务的干扰,即事务中使用的操作和数据与其他并发事务隔离。锁定和多版本控制符合隔离。MVCC多版本实现有三个隐藏字段。回滚指针(DB_ROLL_PT)指向当前记录项的 Rollback Segment 的 Undo log日志记录,通过该记录可以找到以前版本的数据。

总结

本文主要详解MySQL数据库中 Redo log(重做日志)、 Bin Log (归档日志)、Uudo Log(撤销日志),以及 Log 与 InnoDB 的关系和区别,和MySQL事务特性的底层原理。

本文也是对《MySQL事务隔离机制与实现原理详解》、《MVCC详解与MVCC实现原理》的补充说明。

有关【MySQL】MySQL日志系统以及InnoDB背后的技术(MySQL专栏启动)的更多相关文章

  1. ruby - 什么是填充的 Base64 编码字符串以及如何在 ruby​​ 中生成它们? - 2

    我正在使用的第三方API的文档状态:"[O]urAPIonlyacceptspaddedBase64encodedstrings."什么是“填充的Base64编码字符串”以及如何在Ruby中生成它们。下面的代码是我第一次尝试创建转换为Base64的JSON格式数据。xa=Base64.encode64(a.to_json) 最佳答案 他们说的padding其实就是Base64本身的一部分。它是末尾的“=”和“==”。Base64将3个字节的数据包编码为4个编码字符。所以如果你的输入数据有长度n和n%3=1=>"=="末尾用于填充n%

  2. ruby-on-rails - 启动 Rails 服务器时 ImageMagick 的警告 - 2

    最近,当我启动我的Rails服务器时,我收到了一长串警告。虽然它不影响我的应用程序,但我想知道如何解决这些警告。我的估计是imagemagick以某种方式被调用了两次?当我在警告前后检查我的git日志时。我想知道如何解决这个问题。-bcrypt-ruby(3.1.2)-better_errors(1.0.1)+bcrypt(3.1.7)+bcrypt-ruby(3.1.5)-bcrypt(>=3.1.3)+better_errors(1.1.0)bcrypt和imagemagick有关系吗?/Users/rbchris/.rbenv/versions/2.0.0-p247/lib/ru

  3. 电脑0x0000001A蓝屏错误怎么U盘重装系统教学 - 2

      电脑0x0000001A蓝屏错误怎么U盘重装系统教学分享。有用户电脑开机之后遇到了系统蓝屏的情况。系统蓝屏问题很多时候都是系统bug,只有通过重装系统来进行解决。那么蓝屏问题如何通过U盘重装新系统来解决呢?来看看以下的详细操作方法教学吧。  准备工作:  1、U盘一个(尽量使用8G以上的U盘)。  2、一台正常联网可使用的电脑。  3、ghost或ISO系统镜像文件(Win10系统下载_Win10专业版_windows10正式版下载-系统之家)。  4、在本页面下载U盘启动盘制作工具:系统之家U盘启动工具。  U盘启动盘制作步骤:  注意:制作期间,U盘会被格式化,因此U盘中的重要文件请注

  4. 【鸿蒙应用开发系列】- 获取系统设备信息以及版本API兼容调用方式 - 2

    在应用开发中,有时候我们需要获取系统的设备信息,用于数据上报和行为分析。那在鸿蒙系统中,我们应该怎么去获取设备的系统信息呢,比如说获取手机的系统版本号、手机的制造商、手机型号等数据。1、获取方式这里分为两种情况,一种是设备信息的获取,一种是系统信息的获取。1.1、获取设备信息获取设备信息,鸿蒙的SDK包为我们提供了DeviceInfo类,通过该类的一些静态方法,可以获取设备信息,DeviceInfo类的包路径为:ohos.system.DeviceInfo.具体的方法如下:ModifierandTypeMethodDescriptionstatic StringgetAbiList​()Obt

  5. UE4 源码阅读:从引擎启动到Receive Begin Play - 2

    一、引擎主循环UE版本:4.27一、引擎主循环的位置:Launch.cpp:GuardedMain函数二、、GuardedMain函数执行逻辑:1、EnginePreInit:加载大多数模块int32ErrorLevel=EnginePreInit(CmdLine);PreInit模块加载顺序:模块加载过程:(1)注册模块中定义的UObject,同时为每个类构造一个类默认对象(CDO,记录类的默认状态,作为模板用于子类实例创建)(2)调用模块的StartUpModule方法2、FEngineLoop::Init()1、检查Engine的配置文件找出使用了哪一个GameEngine类(UGame

  6. Unity 热更新技术 | (三) Lua语言基本介绍及下载安装 - 2

    ?博客主页:https://xiaoy.blog.csdn.net?本文由呆呆敲代码的小Y原创,首发于CSDN??学习专栏推荐:Unity系统学习专栏?游戏制作专栏推荐:游戏制作?Unity实战100例专栏推荐:Unity实战100例教程?欢迎点赞?收藏⭐留言?如有错误敬请指正!?未来很长,值得我们全力奔赴更美好的生活✨------------------❤️分割线❤️-------------------------

  7. 使用canal同步MySQL数据到ES - 2

    文章目录一、概述简介原理模块二、配置Mysql使用版本环境要求1.操作系统2.mysql要求三、配置canal-server离线下载在线下载上传解压修改配置单机配置集群配置分库分表配置1.修改全局配置2.实例配置垂直分库水平分库3.修改group-instance.xml4.启动监听四、配置canal-adapter1修改启动配置2配置映射文件3启动ES数据同步查询所有订阅同步数据同步开关启动4.验证五、配置canal-admin一、概述简介canal是Alibaba旗下的一款开源项目,Java开发。基于数据库增量日志解析,提供增量数据订阅&消费。Git地址:https://github.co

  8. MIMO-OFDM无线通信技术及MATLAB实现(1)无线信道:传播和衰落 - 2

     MIMO技术的优缺点优点通过下面三个增益来总体概括:阵列增益。阵列增益是指由于接收机通过对接收信号的相干合并而活得的平均SNR的提高。在发射机不知道信道信息的情况下,MIMO系统可以获得的阵列增益与接收天线数成正比复用增益。在采用空间复用方案的MIMO系统中,可以获得复用增益,即信道容量成倍增加。信道容量的增加与min(Nt,Nr)成正比分集增益。在采用空间分集方案的MIMO系统中,可以获得分集增益,即可靠性性能的改善。分集增益用独立衰落支路数来描述,即分集指数。在使用了空时编码的MIMO系统中,由于接收天线或发射天线之间的间距较远,可认为它们各自的大尺度衰落是相互独立的,因此分布式MIMO

  9. kvm虚拟机安装centos7基于ubuntu20.04系统 - 2

    需求:要创建虚拟机,就需要给他提供一个虚拟的磁盘,我们就在/opt目录下创建一个10G大小的raw格式的虚拟磁盘CentOS-7-x86_64.raw命令格式:qemu-imgcreate-f磁盘格式磁盘名称磁盘大小qemu-imgcreate-f磁盘格式-o?1.创建磁盘qemu-imgcreate-fraw/opt/CentOS-7-x86_64.raw10G执行效果#ls/opt/CentOS-7-x86_64.raw2.安装虚拟机使用virt-install命令,基于我们提供的系统镜像和虚拟磁盘来创建一个虚拟机,另外在创建虚拟机之前,提前打开vnc客户端,在创建虚拟机的时候,通过vnc

  10. 阿里云国际版免费试用:如何注册以及注意事项 - 2

    作为新的阿里云用户,您可以50免费试用多种优惠,价值高达1,700美元(或8,500美元)。这将让您了解和体验阿里云平台上提供的一系列产品和服务。如果您以个人身份注册免费试用,您将获得价值1,700美元的优惠。但是,如果您是注册公司,您可以选择企业免费试用,提交基本信息通过企业实名注册验证,即可开始价值$8,500的免费试用!本教程介绍了如何设置您的帐户并使用您的免费试用版。​关于免费试用在我们开始此试用之前,您还必须遵守以下条款和条件才能访问您的免费试用:只有在一年内创建的账户才有资格获得阿里云免费试用。通过此免费试用优惠,用户可以免费试用免费试用活动页面上列出的每种产品一次。如果您有多个帐

随机推荐