Redo Log工作原理

  1. 数据库如何持久化数据?

数据库一般都需要硬盘来进行数据持久化 ,数据库在持续提供对外服务的过程会不断的进行写入操作(增、删、改),为了保证每次成功的写入都能落盘,就需要每次进行写入操作都调用fsync操作进行磁盘写入。操作系统的fsync将在硬盘写入成功后返回,确保数据落盘成功。
以上方式在修改成功落盘之后再提交事务,就可以确保一次提交成功事务的持久化。但是这种方式往往受硬盘IO性能的影响,况且很多情况下修改的数据都需要进行随机IO,性能更差。
内存的写入与读取性能远远高于磁盘,于是MySQL引入了各种Buffer,减少硬盘IO次数。引入Buffer后用户的查询和写入操作都可以直接操作Buffer,性能大幅度提升。但是Buffer中的数据会在系统重启后丢失,所以也需要进行落盘。又回到了前边提到的落盘受IO性能影响导致吞吐量下降。
在此基础上引入异步分批写入可以保证数据库的高性能,但是异步存在一个致命问题是事务已经提交了,后续的异步落盘写入失败,就违背了ACID中的持久性特性。
于是MySQL使用了一种折中的方式预写入(WAL),通过及时落盘保证持久性,通过顺序写精简日志保证写入效率。其中包括redo logundo logbinlog

  1. Redo Log是什么?

Redo Log一种物理日志,记录对数据页的修改内容,用于保证事务的持久性和数据库或操作系统崩溃后的故障恢复。内部记录了需要修改的数据页页中数据的偏移量修改的字段修改的值

  1. Redo Log 的写入

MySQL在事务提交之前,本次事务修改的Redo log会被写入到硬盘,并且只有在写入成功后,事务才能提交成功。这样就确保了成功提交的事务被持久化到了硬盘中。
不过Redo Log的写入是先写入Redo Log Buffer,然后根据具体的Redo Log刷盘策略,写入磁盘。可以通过更改innodb_flush_log_at_trx_commit参数控制刷盘策略:

  1. 设置为0,每秒将Redo log buffer写入到操作系统的page cache中,并执行fsync刷盘,极端情况本规下丢失一秒的数据;
  2. 默认为1,每次事务提交将Redo log buffer写入到操作系统的Page Cache中,并执行fsync输盘,性能稍差,但是不会丢失已提交数据;
  3. 设置为2,每次事务提交将Redo log buffer写入到操作系统的Page Cache中,然后每秒执行刷盘策略,极端情况下丢失一秒的数据。

对于02中的设置,并不是严格的一秒一次,会受到其他操作的影响提前触发,例如执行DDL语句。

  1. Redo Log的故障恢复

当系统或数据库崩溃时,InnoDB会使用Redo Log中的记录进行数据恢复。根据Redo log记录的页号偏移量修改内容修改数据页的内容,并根据每个redo log中的全局唯一增量日志序列号lsn避免日志被重复执行。

因为Redo log是基于页的修改,在InnoDB中每个页默认16K,操作系统每次写入文件的大小为4K,这4K可以保证原子性,但是无法确保16K分4次写入的原子性16K写入不完整时就会出现页损坏Redo Log无法恢复损坏的页,需要先通过Dobule Write Buffer文件恢复完整的数据页,再执行Redo logRedo Log在事务执行修改的过程中,会进行写入,而Doubule Write在事务提交之前,将产生的脏页写入Double Write中,然后再将脏页落盘。

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

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

相关文章

汽车服务门店小程序模板制作指南

在数字化时代,一个小程序的力量不可忽视。它不仅是展示品牌形象和提供用户服务的重要工具,更是扩大客户群体和提高营收的关键手段。对于汽车服务门店来说,拥有一个精美且功能齐全的小程序,更将成为你在竞争激烈的市场中的重要武器…

Docker中容器的随机命名方式

使用 docker 创建容器时,如果没有用 --name 指定,docker 会为用户选择一个名称, 格式是两个带有下划线的单词,如xxx_yyyy 其相关的实现在此处 pkg/namesgenerator/names-generator.go[1] 源码中有两个数组,第一个是一个…

MySql Delete 使用及优化

一、概述 DELETE是一个DML语句,用于从表中删除行。 DELETE语句可以从with子句开始,以定义DELETE中可访问的公用表表达式。 单表语法 DELETE [LOW_PRIORITY] [QUICK] [IGNORE] FROM tbl_name [[AS] tbl_alias][PARTITION (partition_name [, partition…

【Git游戏】远程分支

origin/<branch> 远程分支在本地以 origin/<branch>格式存在&#xff0c;他指向上次和远程分支通过时的记录 git checkout origin/<branch> 会出现HEAD分离的情况 与远程通讯 git fetch —— 从远端获取数据&#xff08;实际上将本地仓库中的远程分支更新…

mysql 内置函数

目录 日期函数 current_date current_time current_timestamp date now date_add date_sub datediff 字符串函数 charset concat instr ucase lcase left length replace strcmp substring ltrim/rtrim/trim ltrim rtrim trim 数学函数 abs bin hex …

ES线程池设置

一文搞懂ES中的线程池 - 知乎 ES线程池设置-阿里云开发者社区 文章目录 一、简介 二、线程池类型 2.1、fixed 2.2、scaling 2.3、direct 2.4、fixed_auto_queue_size 三、处理器设置 四、查看线程池 4.1、cat thread pool 4.2、nodes info 4.3、nodes stats 4.4、no…

前端网络相关的面试题

get和post经过几次tcp连接? HTTP的GET和POST请求都是基于TCP协议的&#xff0c;因此在发送请求之前都需要建立TCP连接。TCP连接的建立通常被称为三次握手&#xff08;Three-way Handshake&#xff09;。 第一次握手&#xff1a;客户端发送一个SYN包&#xff08;同步序列编号…

【python爬虫】8.温故而知新

文章目录 前言回顾前路代码实现体验代码功能拆解获取数据解析提取数据存储数据 程序实现与总结 前言 Hello又见面了&#xff01;上一关我们学习了爬虫数据的存储&#xff0c;并成功将QQ音乐周杰伦歌曲信息的数据存储进了csv文件和excel文件。 学到这里&#xff0c;说明你已经…

nvm集合node版本,解决新版本jeecgboot3.5.3前端启动失败问题

jeecgboot前端3.5.3页面如下 使用之前的pnpm启动会报错&#xff0c;pnpm是node进行安装的&#xff0c;查询后发现&#xff0c;vue3版本的页面至少需要node16版本&#xff0c;我之前的版本只有15.5&#xff0c;适用于vue2 那么我将先前的node15.5版本删除&#xff0c;然后安装…

【Hadoop】DataNode 详解

&#x1f341; 博主 "开着拖拉机回家"带您 Go to New World.✨&#x1f341; &#x1f984; 个人主页——&#x1f390;开着拖拉机回家_Linux,Java基础学习,大数据运维-CSDN博客 &#x1f390;✨&#x1f341; &#x1fa81;&#x1f341; 希望本文能够给您带来一定的…

Redis——》实现分布式锁

推荐链接&#xff1a; 总结——》【Java】 总结——》【Mysql】 总结——》【Redis】 总结——》【Kafka】 总结——》【Spring】 总结——》【SpringBoot】 总结——》【MyBatis、MyBatis-Plus】 总结——》【Linux】 总结——》【MongoD…

【解决】idea启动spring MVC报错:一个或多个listeners启动失败Listener ClassNotFoundException

idea配置教程。tomcat调试报错Artifact :war exploded: Error during artifact deployment。 修改代码后&#xff0c;启动不生效&#xff0c;仍是旧代码。 根本原因是&#xff1a; Modules output path和Artifacts output directory不匹配 Modules output path一定要等于Ar…

网络编程 day 5

1、根据select TCP服务器流程图编写服务器 #include <myhead.h>#define ERR_MSG(msg) do{\fprintf(stderr, "__%d__:", __LINE__); \perror(msg);\ }while(0)#define PORT 8888 //端口号&#xff0c;范围1024~49151 #define IP "192.168.…

Uniapp中vuex的使用

vuex的学习笔记&#xff0c;很多地方还都不是很懂&#xff0c;先记下来再说&#xff0c;比小程序里自带的store复杂很多&#xff0c;看着头大&#xff0c;而且方法里面很多ES6的内容&#xff0c;头都看到爆炸 一、初始化vuex 新建store.js&#xff0c;挂载到main.js 1、在根…

Flink SQL你用了吗?

分析&回答 Flink 1.1.0&#xff1a;第一次引入 SQL 模块&#xff0c;并且提供 TableAPI&#xff0c;当然&#xff0c;这时候的功能还非常有限。Flink 1.3.0&#xff1a;在 Streaming SQL 上支持了 Retractions&#xff0c;显著提高了 Streaming SQL 的易用性&#xff0c;使…

前端性能优化

前言 性能优化这个问题&#xff0c;在面试的过程中问道的概率还挺大的&#xff0c;特别是对有前端开发经验的面试者来说&#xff0c;基本会被面试官问道关于性能优化的问题。但是在我们做项目的过程中&#xff0c;可能业务比较简单&#xff0c;并没有复杂到需要专门去优化的程…

c#接口(interface)

概述&#xff1a; 在C#中&#xff0c;接口是一种定义了一组相关方法、属性和事件的规范。接口可以被类或结构体实现&#xff0c;以提供一种方式来定义类之间的契约或协议。 接口定义了一组成员&#xff0c;这些成员没有具体的实现。实现接口的类必须提供这些成员的具体实现。…

linuxdeploy安装CentOS7搭建django服务

目录 一、busybox安装 二、linuxdeploy安装 三、linuxdeploy软件设置及安装 四、CentOS基础环境配置 五、CentOS7 上安装Python3.8.10 六、systemctl的替代品 七、CentOS7 上安装mysql5.2.27数据库 八、CentOS7 上安装Nginx服务 九、Django项目应用部署 参考文献: 一…

《Python入门到精通》webbrowser模块详解,Python webbrowser标准库,Python浏览器控制工具

「作者主页」&#xff1a;士别三日wyx 「作者简介」&#xff1a;CSDN top100、阿里云博客专家、华为云享专家、网络安全领域优质创作者 「推荐专栏」&#xff1a;小白零基础《Python入门到精通》 webbrowser模块详解 1、常用操作2、函数大全webbrowser.open() 打开浏览器webbro…

线程同步与互斥

目录 前言&#xff1a;基于多线程不安全并行抢票 一、线程互斥锁 mutex 1.1 加锁解锁处理多线程并发 1.2 如何看待锁 1.3 如何理解加锁解锁的本质 1.4 CRAII方格设计封装锁 前言&#xff1a;基于线程安全的不合理竞争资源 二、线程同步 1.1 线程同步处理抢票 1.2 如何…