mysql中的这些日志,你都知道吗?

news2024/9/20 17:37:05

在使用mysql的过程中,经常会听到mysql具有数据恢复能力,当我们在业务开发中误删了某些数据后,可以将数据库恢复到误删之前的状态。同时还具有故障恢复能力,当数据库所在的机器突然掉电停机后,mysql也可以保证数据一致性。同时对数据库中事务比较了解的小伙伴也知道,在可重复读的事务隔离级别下,可以支持快照读。在赞叹mysql这么强大的能力时,你可曾想过他是怎么实现的吗?

其实上面这些功能实现的背后,都离不了日志的支持,接下来,我们来一起研究一下,mysql中有哪些日志,这些日志又是如何起作用的?

归档日志-binlog

用过mysql的老铁,多多少少都听说过binlog,binlog的使用范围比较广泛,例如在mysql的主从结构中,从库从主库同步数据,主要就是依靠binlog,上文中提到mysql的数据恢复能力,也是利用binlog实现的。

binlog是mysql中server层的日志模块,与具体的存储引擎:Innodb、MyISAM没有关系。因为binlog是server层的日志,所以日志记录的主要是逻辑层面的内容,比如"给ID=1这一行中的a字段加1","将ID=2这一行数据删除"等,和被操作的数据存放的数据页,物理地址无关。

除此之外,binlog是一直追加写的,当日志文件大小达到一定阈值后,会进行切割,在一个新的文件中继续写。

基于数据库的备份情况以及binlog的保存时间,我们可以将数据库的状态恢复到允许时间范围内的任意时刻。具体来说,DBA会定时的将数据库进行整库备份,可以是一天一备,也可以是一周一备,这个主要取决于系统中数据的重要性,同时在此期间,binlog也会一直保存。

当我们需要将数据库恢复到指定的某一秒时,比如某天下午2点发现上午12点误删了表,需要找回被删除的数据,我们可以按照如下的步骤进行数据恢复:

1.找到距离该天上午12点最近的一次数据备份,并将这个备份恢复到临时库中。

2.从备份的时间点开始,将binlog日志取出进行回放,直到误删表的那一时刻。
此时临时库就恢复到了数据被删除前的状态。

在这里插入图片描述

重做日志-redo log

redo log又叫重做日志,可能有些老铁会比较好奇,为什么叫做重做日志呢?重做的内容又是什么呢?接下来我们一起看一下redo log的使用场景,以及它的工作机制。

redo log是存储层中的日志模块,而且是Innodb特有的,因为他是存储层的日志,日志主要记录 “某个数据页上做了什么修改” ,包含了具体的数据页地址,是一个物理层面日志,这是redo log和binlog最明显的差异。

除此之外,redo log可以看做是一个环形缓冲区,有大小的限制,当缓冲区写满后,会对之前写过的区域进行覆盖。和我们平常接触的内存缓冲区不同的是,redo log是有4个1GB大小的文件组成。

在这里插入图片描述

redo log使Innodb具备故障恢复的能力,下面我们举例解释一下,redo log是如何实现故障恢复的。

我们在mysql中进行写操作的流程大概如下,为了方便解释,我们以"对ID=2这一行中的C字段进行加1"为例。

1.执行器调用存储层读接口:获取ID=2这一行的数据。存储层负责找到该行数据并返回给执行器,存储层所做的事情具体如下:如果ID=2这一行数据所在的数据页已经存在于内存中了,那么直接从内存中取出,并返回。如果不在内存中,那么引擎直接通过聚簇索引搜索该行数据(此处以Innodb为例),然后将该行所在数据页加载到内存中,同时将该行数据返回给执行器。

2.执行器拿到该行数据后,将该行数据中的C字段进行加1操作,得到新的一行数据,然后调用存储引擎层的写接口,将新数据进行写入。

3.引擎层接收到新的数后,将新的数据更新到内存中,同时将更新操作记录到redo log中,日志内容为:将数据页P中的ID为2的数据行内容更新为N+1,然后整个更新操作就算完成了。

在上面描述的过程中,有几个问题需要说明一下:

1.在3中更新操作,只更新了内存和redo log并没有将最新数据更新到磁盘上的数据页中

此时ID=2这一行数据所在数据页,在内存中是最新的数据,而在磁盘中是旧数据,也就是该数据页在内存和磁盘中的状态是不一致的,此时,我们称内存中的数据页为脏页。

2.内存中脏页,何时更新到磁盘中的数据页?

这里的脏页所占用的内存空间被称为change buffer(有没有很熟悉,不熟悉的化,可以参考"面试官问:普通索引和唯一索引该怎么选择?"),当channge buffer内存压力比较大的时候,默认使用率超过75%,会启动刷脏页操作,其次当redo log空间写满时,也会启动刷脏页,然后更新环形缓冲区中的checkpoint位置(check point位置之前的空间可以使用,之后的位置不能被使用)。

3.以上数据更新过程中,如果没有redo log 好像也没有什么问题?

如果一切操作都是正常的话,写redo log这个操作的确可以省略。但是谁又能保证服务永远不出问题呢?我们先假设上面3中,没有写redo log步骤,数据的写操作只更新内存,我们都知道,内存这种存储介质存储的数据不够稳定,当系统掉电后,内存中的数据就会丢失,那么内存中脏页上的更新就丢失了,这个是不可被接受的。为了保证数据不丢失,只能在更新内存后,同时更新磁盘,这样可以保证每次更新操作都落盘,保证了较高的可用性,但是这样会牺牲写性能,因为每次写盘,需要找到要写的位置,然后再写,是一种随机写操作,性能较低,如果是机械磁盘,效率更低。

而使用redo log 可以很好的解决这个问题,虽然redo log也是写磁盘,但是采用的是顺序写的方式,相比随机写性能较高。写入到redo log后,即使系统掉电,脏页中的数据丢失,更新的数据也不会丢,因为在mysql重启后,会通过回放 redo log中的日志,将业务层面的更新 “重做” 一遍(到这里终于知道为啥redo log叫重做日志了吧),来保证数据的完整性。

到这里,相信大家对binlog 和 redo log的认识应该更深一些了吧,不过细心的老铁可能会有一个疑问:在一个写操作的过程中,如果binlog写成功redo log写失败,或者redo log写成功binlog 写失败的情况下,使用binlog同步数据的从库就和使用redo log的主库的数据就不一致了?

是的,但是mysql在设计的时候也想到了这个问题,关于这个问题的具体方案,以及undo log(回滚日志),我们放在下一篇文章中来做说明。

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

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

相关文章

Java8 Stream 的核心秘密

小伙伴们好呀,我是 4ye,今天来分享下 Java8 Stream 的源码 核心回顾 stream 是一次性的,不是数据结构,不存储数据,不改变源数据.。API 分为终端和中间操作,中间操作是惰性的,碰到终端才去执行。…

python自动化测试

测试软件:pycharm 解释器版本:3.10.7 测试浏览器:谷歌 或 edge 谷歌web驱动下载地址:chromedriver.storage.googleapis.com/index.html edgeweb驱动下载地址:Microsoft Edge WebDriver - Microsoft Edge Developer 第一…

免费查题接口系统后台

免费查题接口系统后台 本平台优点: 多题库查题、独立后台、响应速度快、全网平台可查、功能最全! 1.想要给自己的公众号获得查题接口,只需要两步! 2.题库: 查题校园题库:查题校园题库后台(点…

零基础自学javase黑马课程第十三天

零基础自学javase黑马课程第十三天 ✨欢迎关注🖱点赞🎀收藏⭐留言✒ 🔮本文由京与旧铺原创,csdn首发! 😘系列专栏:java学习 💻首发时间:🎞2022年11月7日&…

springboot视图渲染技术

目录 一、Freemarker简介及入门 二、Freemarker语法 1、取值 1.1默认值 1.2 对null值进行判断 2、条件 3、循环 4、include 5、 局部变量(assign)/全局变量(global) 一、Freemarker简介及入门 学习网址:什么是 FreeMarker? - FreeMarker 中文官方参考手册 …

2022强网拟态pwn-webheap

2022强网拟态pwn-webheap 这题的逻辑是一开始笔者硬逆给逆出来了,但是后面在Ex师傅的点播下成功的在github上找到了这个的原生项目 https://github.com/google/libnop 在审计的过程中发现了至关重要的信息,发现和逆向的格式一样的东西,就是…

BCN-PEG2-Mal,BCN-OH,endo-BCN-PEG2-BiotinBCN几种衍生物的特点

BCN-PEG 是一类具有双环[6.1.0]壬炔的 PEG 接头。它用于叠氮化物反应性无铜点击化学。BCN在没有催化剂的情况下很容易与叠氮官能化化合物或生物分子反应形成稳定的三唑键,PEG间隔物增加了所得化合物的水溶性。今天这一章西安凯新生物科技有限公司​主要为大家分享BC…

多段曲线控温从Simulink仿真到PLC控制实现

多段曲线温度控制,专栏有系列文章和完整源代码,大家可以自行搜索。链接如下: 博途PLC 1200/1500PLC多段曲线控温FB(支持40段控温曲线、段曲线搜索、暂停、跳段等功能)_RXXW_Dor的博客-CSDN博客多段控温曲线之前专栏的其它文章也有所讲解,大家可以参看下面这篇专栏博途1200…

Get CLI - 强大的项目管理 GetX 工具

Get CLI - 强大的项目管理 GetX 工具 https://shirsh94.medium.com/get-cli-powerful-getx-tool-for-project-management-bdf54572d91f 前言 一个来自 Getx 的工具可以帮助你快速的建立项目,页面和视图。 大家好,在本文中,我将讨论 get CLI 工…

PTA题目 奇偶分家

给定N个正整数,请统计奇数和偶数各有多少个? 输入格式: 输入第一行给出一个正整N(≤1000);第2行给出N个非负整数,以空格分隔。 输出格式: 在一行中先后输出奇数的个数、偶数的个…

深度学习中常见概念(收敛、优化器、学习率等)

收敛 打个简单的比方,训练网络模型,就好比解方程,为了得到这个方程的极值点,训练的过程就好比是找准一个方向,不断的朝这个方向靠近,使得方程的值不断减小,最终达到极值点,而不收敛&#xff0c…

微型计算机基础(常用术语,总线,系统组成)

目录 微型计算机常用术语 计算机系统 基本组成图​编辑 Cache(内存和CPU之间) 虚存(内存和外存之间 ) CPU是微机的核心部件,具有运算和控制功能 总线 数据中线DB(Data Bus) &#xff0…

kubernetes集群配置默认存储类(nfs)

文章目录概述安装nfs服务端node节点上安装启动nfs配置StorageClass创建Deployment创建ServiceAccount创建StorageClass对象创建资源对象常见问题参考文档概述 StorageClass 为管理员提供了描述存储 “类” 的方法。 不同的类型可能会映射到不同的服务质量等级或备份策略&#x…

钙通道阻滞剂/拮抗剂的应用 | MedChemExpress

我们都知道钙、钾、钠离子对于维持个体内环境的重要性,离子通道一直是个有趣而复杂的话题。它们就像为某种物质专属定制的“门”或 VIP 通道,不仅分类繁多,还有着严密的“门控”机制。每个细胞都像一个电池,正常状态下&#xff0c…

SpringBoot SpringBoot 开发实用篇 5 整合第三方技术 5.10 jetcache 本地缓存方案

SpringBoot 【黑马程序员SpringBoot2全套视频教程,springboot零基础到项目实战(spring boot2完整版)】 SpringBoot 开发实用篇 文章目录SpringBootSpringBoot 开发实用篇5 整合第三方技术5.10 jetcache 本地缓存方案5.10.1 使用 jetcache 实…

【Java高级】一篇文章带你学会什么是注解

目录 注解概述 | Java内置的三个注解 Deprecated Override SuppressWarnings | 元注解 Target Retention(注解生命周期) Documented Inherited Repeatable(JDK1.8) | 自定义注解 自定义注解的概述 自定义注解的步骤…

货币政策传导与货币政策调控-中国视角下的宏观经济

货币政策传导与货币政策调控-潘登同学的宏观经济学笔记 文章目录货币政策传导与货币政策调控-潘登同学的宏观经济学笔记货币传导路径货币是银行的负债——货币的“形而下”定义贷款创造存款货币乘数货币就是记忆(money is memory)——货币的“形而上”定…

libevent库

libevent介绍 1 事件驱动, 高性能, 轻量级, 专注于网络 2 源代码精炼, 易读 3 跨平台 4 支持多种I/O多路复用技术, 如epoll select poll等 5 支持I/O和信号等事件 libevent的核心实现: 在linux上, 其实质就是epoll反应堆. libevent是事件驱动, epoll反应堆也是事件驱动, 当要…

硬件基础 -- D/A数字模拟信号

D/A 需要数位模拟开关 如果开关打卡,则此位电压参与运算 如果开关关闭,则此位电压0V参与运算 转换过程中需要将数字数字量锁存 转换过程 模拟量转数字量需要比较器 数字量转模拟量需要运放 #mermaid-svg-wJVhc3DQ619gtYuZ {font-family:"trebuchet …

【计算机毕业设计】6.超市仓库管理系统+vue

一、系统截图(需要演示视频可以私聊) 基于B/S的超市进销存管理系统的设计与实现 摘 要:开发本超市进销存管理系统的主要目标是方便企业对商品、客户和员工信息的实时掌控,提高企业的工作效率。本系统是采用java开发的一个基于B/S…