聊聊binlog是什么

news2024/12/24 10:59:17

1. 上一讲思考題解答:redo日志刷盘策略的选择建议

先给大家解释一下上一讲的思考題,我给大家的一个建议,其实对于redo日志的三种刷盘策略,我们通常建议是设置为1

也就是说,提交事务的时候,redo日志必须是刷入磁盘文件里的。

这样可以严格的保证提交事务之后,数据是绝对不会丢失的,因为有redo日志在磁盘文件里可以恢复你做的所有修改。

如果要是选择0的话,可能你提交事务之后,mysql宕机,那么此时redo日志没有刷盘,导致内存里的redo日志丢失,你提交的事务更新的数据就丢失了;

如果要是选择2的话,如果机器宕机,虽然之前提交事务的时候,redo日志进入os cache了,但是还没进入磁盘文件,此时机器宕机还是会导致os cache里的redo日志丢失。

所以对于数据库这样严格的系统而言,一般建议redo日志刷盘策略设置为1,保证事务提交之后,数据绝对不能丢失。

2. MySQL binlog到底是什么东西?

接着我门来看看MySQL binloq到底是个什么东西?

“对哪实际上我们之前说的redo log,他是一种偏向物理性质的重做日志,因为他里面记录的是类似这样的东西,个数据真中的什么记录,做了个什么修改”

而且redo log本身是属于InnoDB存储引擎特有的一个东西,

而binlog叫做归档日志,他里面记录的是偏向于逻辑性的日志,类似于“对users表中的id=10的一行数据做了更新操作,更新以后的值是什么:

binlog不是InnoDB存储引擎特有的日志文件,是属于mysqlserver自己的日志文件

3. 提交事务的时候,同时会写入binlog

所以其实我们上一讲讲到,在我们提交事务的时候,会把redolog日志写入磁盘文件中去。然后其实在提交事务的时候,我们同时还会把这次更新对应的binlog日志写入到磁盘文件中去,如下图所示。

大家可以在这个图里看到一些变动,就是我把跟InnoDB存储引擎进行交互的组件加入了之前提过的执行器这个组件,他会负责跟InnoDB进行交互,包括从磁盘里加载数据到BufferPool中进行缓存,包括写入undo日志,包括更新Buffer Pool里的数据,以及写入redo log buffer,redo loq刷入磁盘,写binlog,等等。

实际上,执行器是非常核心的一个组件,负责跟存储引擎配合完成一个SQL语句在磁盘与内存层面的全部数据更新操作,

而且我们在上图可以看到,我把一次更新语句的执行,拆分为了两个阶段,上图中的1、2、3、4几个步骤,其实本质是你执行这个更新语句的时候干的事,

然后上图中的5和6两个步骤,是从你提交事务开始的,属于提交事务的阶段了。

4. binlog日志的刷盘策略分析

对于binlog日志,其实也有不同的刷盘策略,有一个sync binlog参数可以控制binloq的刷盘策略,他的默认值

是0,此时你把binlog写入磁盘的时候,其实不是直接进入磁盘文件,而是进入os cache内存缓存。

所以跟之前分析的一样,如果此时机器宕机,那么你在os cache里的binlog日志是会丢失的,我们看下图的示意

如果要是把sync_binlog参数设置为1的话,那么此时会强制在提交事务的时候,把binlog直接写入到磁盘文件里去,那么这样提交事务之后,哪怕机器宕机,磁盘上的binlog是不会丢失的,如下图所示

5. 基于binlog和redolog完成事务的提交

当我们把binlog写入磁盘文件之后,接着就会完成最终的事务提交,此时会把本次更新对应的binlog文件名称和这次更新的binlog日志在文件里的位置,都写入到redoloq日志文件里去,同时在redolog日志文件里写入一个commit标记。

在完成这个事情之后,才算最终完成了事务的提交,我们看下图的示意,

6. 最后一步在redo日志中写入commit标记的意义是什么?

这时候肯定有同学会问了,最后在redo日志中写入commit标记有什么意义呢?

说白了,他其实是用来保持redolog日志与binlog日志一致的。

我门来举个例子,假设我门在提交事务的时候,一共有上图中的5、6、7三个步骤,必须是三个步骤都丸行完毕,才算是提交了事务。那么在我门刚完成步骤5的时候,也就是redo log刚刷入磁盘文件的时候,mysql宕机了,此时怎么办?

这个时候因为没有最终的事务commit标记在redo日志里,所以此次事务可以判定为不成功。不会说redo日志文件里有这次更新的日志,但是binlog日志文件里没有这次更新的日志,不会出现数据不一致的问题。

如果要是完成步骤6的时候,也就是binlog写入磁盘了,此时mysql宕机了,怎么?

同理,因为没有redo log中的最终commit标记,因此此时事务提交也是失败的

必须是在redo log中写入最终的事务commit标记了,然后此时事务提交成功,而且redo loq里有本次更新对应的日志,binlog里也有本次更新对应的日志,redoloq和binlog完全是一致的。

7. 后台I0线程随机将内存更新后的脏数据刷回磁盘

现在我们假设已经提交事务了,此时一次更新“update users set name='xxxwhere id=10”,他已经把内存里的buffer pool中的缓存数据更新了,同时磁盘里有redo日志和binloq日志,都记录了把我们指定的“id=10”这行数据修改了“name='xxx’

此时我们会思考一个问题了,但是这个时候磁盘上的数据文件里的“id=10”这行数据的name字段还是等于zhangsan这个日的值啊!

所以MySQL有一个后台的I0O线程,会在之后某个时间里,随机的把内存buffer pool中的修改后的脏数据给刷回到磁盘上的数据文件里去,我们看下图:

当上图中的I0线程把buffer pool里的修改后的脏数据刷回磁盘的之后,磁盘上的数据才会跟内存里一样,都是name=xxx这个修改以后的值了!

在你IO线程把脏数据刷回磁盘之前,哪怕mysql宕机崩溃也没关系,因为重启之后,会根据redo日志恢复之前提交事务做过的修改到内存里去,就是id=10的数据的name修改为了xxx,然后等适当时机,I0线程自然还是会把这个修改后的数据刷到磁盘上的数据文件里去的

8. 基于更新数据的流程,总结一下InnoDB存储引擎的架构原理

大家通过一次更新数据的流程,就可以清晰地看到,InnoDB存储引擎主要就是包含了一些buffer pool、redologbufer等内存里的缓存数据,同时还包含了一些undo日志文件,redo日志文件等东西,同时mysql server自己还有binlog日志文件。

在你执行更新的时候,每条SQL语句,都会对应修改buffer pool里的缓存数据、写undo日志、写redo log buffer几个步骤;

但是当你提交事务的时候,一定会把redoloq刷入磁盘,binloq刷入磁盘,完成redolog中的事务commit标记;最后后台的IO线程会随机的把bufferpool里的脏数据刷入磁盘里去。

9. 思考題:执行更新操作的时候,为什么不能执行修改磁盘上的数据?

好了,今天的文章接近尾声,咱们再来思考一个问题:

为什么MVSQL在更新数据的时候,要大费周章的搞这么多事情,包括buffer pool、redo log、undo log.

binlog、事务提交、脏数据。引入了一大堆的概念,有复杂的流程和步骤。

为什么他反而最关键的修改磁盘里的数据,要通过I0线程不定时的去执行?

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

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

相关文章

Java代码基础算法练习-水仙花数-2024.04.17

任务描述: 水仙花数也被称为超完全数字不变数、自恋数、自幂数、阿姆斯壮数或阿姆斯特朗数。水仙花数是 指一个 3 位数,它的每个位上的数字的3次幂之和等于它本身。 例如: 1的3次方 5的3次方 …

python 海龟画图tutle螺旋线

目录 初识turtle模块 基本绘图概念 示例:绘制一个正方形 示例:绘制彩色螺旋线 附录 常用命令 其它命令 在Python编程中,使用turtle模块进行图形绘制是一种非常有趣和富有教育意义的活动。通过控制一个小海龟(Turtle&#x…

2010-2022年各省新质生产力测算数据(含原始数据+计算代码+计算结果)

2010-2022年各省新质生产力测算数据(含原始数据计算代码计算结果) 1、时间:2010-2022年 2、来源:国家统计局、各省年鉴、能源年鉴、环境年鉴 3、范围:31省 4、指标: 省份、年份、分地区授权专利数&…

Java中类加载的机制

Java中类加载的机制 从宏观上看: 加载->链接->初始化 整个生命周期流程: 加载->验证->准备->解析->初始化->使用->卸载 1、加载 查找并加载类的二进制数据,并生成Class对象的实例的过程 也就是将类的.class文件…

excel里如何的科学计数法的数字转换成数值?

比如下图,要想把它们转换成3250跟1780,有什么快捷的办法吗? 科学计数法在excel里的格式,与我们常规在数学上写的有差异。这个转换可以这样做: 1.转换后的效果: 2.问题分析 题目中所附截图,单元…

Docker镜像,什么是Docker镜像,Docker基本常用命令【搜索,镜像下载,镜像删除,创建容器,导入到处镜像】及其镜像的分层

docker镜像 1.1什么是镜像,镜像基础 1.1.1 镜像的简介 镜像是一种轻量级,可执行的独立软件包,也可以说是一个精简的操作系统。镜像中包含应用软件及应用软件的运行环境,具体来说镜像包含运行某个软件所需的所有内容,…

ThingsBoard自定义需求生成告警规则以及清除告警规则

上一章已对基础的生成告警规则进行了介绍,如想查看基础,请查看下面的文章 ThingsBoard实现告警规则创建并生成报警信息-CSDN博客文章浏览阅读991次,点赞9次,收藏25次。发起者警报发起者是警报的实体例如:如果收到来自…

Golang基础-13

Go语言基础 介绍 并发 channel goroutine 互斥锁 读写锁 原子操作 select 超时处理 sync包 runtime包 介绍 本文介绍Go语言中 channel、goroutine、互斥锁、读写锁、原子操作、select、超时处理、sync包、runtime包等相关知识。 并发 进程是是最小的资源管理单元…

ArcGIS多数据框联动批量出图

这次内容是《ArcPy结合数据驱动模块的批量制图》课程的新增内容。学完这个课程大家对arcgis的数据驱动页面的批量出图应该是驾轻就熟,不管是无编程的完全基于ArcGIS数据驱动模块批量出图还是结合ArcPy的Mapping模块批量出图(arcpy.mapping)。…

MercadoLibre(美客多)入仓预约系统操作流程-自动化约号(开篇)

目录 一、添加货件信息 二、输入货件信息 三、选择发货 四、填写交货日期 五、注意事项 MercadoLibre(美客多)于2021年10月18号上线了新预约入仓系统,在MercadoLibre美客多平台上,新入仓预约系统是一项非常重要的功能&#x…

【技巧】win11 删除网络中心中多余的以太网信息

因为网络环境的变化,系统在识别网络时会出现“以太网1”,“以太网2”,“以太网3”的情况。虽然不影响使用,但是对于一些强迫症来说很不友好,通过以下方式删除: 1、Win R 打开,运行,…

「 安全工具介绍 」软件成分分析工具Black Duck,业界排名TOP 1的SCA工具

在现代的 DevOps 或 DevSecOps 环境中,SCA 激发了“左移”范式的采用。提早进行持续的 SCA 测试,使开发人员和安全团队能够在不影响安全性和质量的情况下提高生产力。前期在博文《「 网络安全常用术语解读 」软件成分分析SCA详解:从发展背景到…

open Gauss 数据库-05 openGauss数据库备份恢复指导手册

发文章是为了证明自己真的掌握了一个知识,同时给他人带来帮助,如有问题,欢迎指正,祝大家万事胜意! 目录 前言 openGauss数据库备份恢复 1 实验介绍 1.1 关于本实验 1.2 实验目的 2 实验前提 3 物理备份和恢复…

Day3 权限管理

Day3 权限管理 这里会总结构建项目过程中遇到的问题,以及一些个人思考!! 学习方法: 1 github源码 文档 官网 2 内容复现 ,实际操作 项目源码同步更新到github 欢迎大家star~ 后期会更新并上传前端项目 创建管理员…

技术周刊的转变:如何平衡热爱与现实?

大家好,我是那个自己打脸自己的猫哥,本来说周刊不做订阅制的,现在却推出了订阅专栏。今天想为自己辩护一下,同时聊聊技术周刊今后的发展计划。 首先回顾一下我过去的想法吧,然后再解释为什么会突然出现转变。 出于对…

Stable Diffusion 3 API 发布!超越Midjourney v6和DALL-E 3

Stable Diffusion 3 于 2 月首次宣布作为预览版发布。而今天,StabilityAI 正式推出了 Stable Diffusion 3 和 Stable Diffusion 3 Turbo API 的API接口服务。 Stability AI 称仍在持续改进该模型,并没有说明发布日期。模型还没发布,但API先来…

Python | Leetcode Python题解之第28题找出字符串中的第一个匹配项的下标

题目: 题解: class Solution:def strStr(self, haystack: str, needle: str) -> int:# Func: 计算偏移表def calShiftMat(st):dic {}for i in range(len(st)-1,-1,-1):if not dic.get(st[i]):dic[st[i]] len(st)-idic["ot"] len(st)1re…

JS-39-underscore01-初识underscore

一、underscore简介 前面我们已经讲过了,JavaScript是函数式编程语言,支持高阶函数和闭包。 函数式编程非常强大,可以写出非常简洁的代码。例如Array的map()和filter()方法: use strict; var a1 [1, 4, 9, 16]; var a2 a1.ma…

数据结构书后习题

p17 1&#xff0c; 个人解答&#xff1a; int DeleteMinElem(SqList &L,int &min) {int j 0;if (L.length 0){printf("error!");return 0;}int min L.data[0];for (int i 1; i < L.length; i){if (L.data[i] < min){min L.data[i];j i;}}L.dat…

电工与电子技术选择题填空题计算题复习题含参考答案

答案&#xff1a;更多答案&#xff0c;请关注【电大搜题】微信公众号 答案&#xff1a;更多答案&#xff0c;请关注【电大搜题】微信公众号 答案&#xff1a;更多答案&#xff0c;请关注【电大搜题】微信公众号 电工与电子技术复习题 一 . 单选题&#xff08;共 33 题&a…