【MySQL从入门到放弃】InnoDB磁盘结构(二)

前言

        前面我们解析了InnoDB磁盘结构中的表空间、数据字典、双写缓冲区。

本文我们继续探究磁盘结构中剩余的几个核心组件:重做日志(redo log)、撤销日志(undo log)、二进制日志(binlog)

一、重做日志 ( redo log )

  • WALWrite-Ahead Logging)机制
        WAL 的全称是 Write-Ahead Logging ,中文称预写式日志 ( 日志先行 ) ,是一种数据安全写入机制。 就是先写日志,然后再写入磁盘,这样既能提高性能又可以保证数据的安全性。 Mysql 中的 redo log 就是采用 WAL 机制。
        为什么使用WAL ?
        磁盘的写操作是随机IO ,比较耗性能,所以如果把每一次的更新操作都先写入 log 中,那么就成了 顺序写操作,实际更新操作由后台线程再根据 log 异步写入。这样对于 client 端,延迟就降低了。并 且,由于顺序写入大概率是在一个磁盘块内,这样产生的 io 次数也大大降低。所以 WAL 的核心在于 将随机写转变为了顺序写 ,降低了客户端的延迟,提升了吞吐量 .
  •  redo log基本概念
        InnoDB引擎对数据的更新,是先将更新记录写入 redo log 日志,然后会在系统空闲的时候或者是 按照设定的更新策略再将日志中的内容更新到磁盘之中。这就是所谓的预写式技术( Write Ahead logging )。这种技术可以大大减少 IO 操作的频率,提升数据刷新的效率。
        redo log:被称作重做日志 , 包括两部分:一个是内存中的日志缓冲: redo log buffer ,另一
个是磁盘上的日志文件: redo log file
        mysql 每执行一条 DML 语句,先将记录写入 redo log buffer ( redo 日志记录的是事务对数据库做 了哪些修改 ) 。后续某个时间点再一次性将多个操作记录写到 redo log file 。当故障发生致使内存 数据丢失后, InnoDB 会在重启时,经过重放 redo ,将 Page 恢复到崩溃之前的状态 通过 Redo log 可以实现事务的持久性 。
  • Redo log数据落盘流程

        将内存中的数据页持久化到磁盘,需要下面的两个流程来完成 : 

  1. 脏页落盘机制
            脏页是指修改了Buffer Pool 中的数据页后 , 导致了内存中的数据页和磁盘中的数据页不一致 , 这时就出现 了脏页
            当进行数据页的修改操作时: 首先修改在缓冲池中的页,然后再以一定的频率刷新到磁盘上。页从缓冲 池刷新回磁盘的操作并不是在每次页发生更新时触发,而是通过一种称为 CheckPoint 的机制刷新回磁盘。
            checkpoint机制
            思考一下这个场景:如果重做日志可以无限地增大,同时缓冲池也足够大,那么是不需要将缓冲池中页的新版本刷新回磁盘。因为当发生宕机时,完全可以通过重做日志来恢复整个数据库系统中的数据到宕 机发生的时刻。
    Checkpoint( 检查点 ) 技术主要解决以下几个问题:
            1. 缩短数据库的恢复时间
            2. 缓冲池不够用时,将脏页刷新到磁盘
            3. 重做日志不可用时,刷新脏页。
    脏页落盘的时机 采用CheckPoint检查点机制 以下机制都可通过参数控制
  2. redo log 持久化
        缓冲区数据一般情况下是无法直接写入磁盘的,中间必须经过操作系统缓冲区( OS Buffer ) 。因此 redo log buffer 写入 redo logfile 实际上是先写入 OS Cache ,然后再通过系统调用 fsync() 将其刷到 redo log file.
        Redo Buffer 持久化到 redo log 的策略,可通过 Innodb_flush_log_at_trx_commit 设置:

         一般建议选择取值2,因为 MySQL 挂了数据没有损失,整个服务器挂了才会损失1秒的事务提交数据

  •  redo log日志格式
        物理日志VS 逻辑日志
  1. 物理日志: 记录的是每一个page页中具体存储的值是多少,在这个数据页上做了什么修改. : 某个事物将系统表空间中的第100个页面中偏移量为1000处的那个字节的值1改为2.
  2. 逻辑日志: 记录的是每一个page页面中具体数据是怎么变动的,它会记录一个变动的过程或 SQL语句的逻辑, 比如: 把一个page页中的一个数据从1改为2,再从2改为3,逻辑日志就会记录1->2,2->3这个数据变化的过程.

redo日志属于物理日志, 只是记录一下事务对数据库做了哪些修改。 

  •  redo log日志类型
        redo log根据在页面中写入数据的多少 , redo 日志划分为几种不同的类型 (MySQL5.7 中有 53 种类 )
  1. MLOG_1BYTE (type=1) : 表示在页面的某个偏移量处写入1字节redo日志类型。
  2. MLOG_2BYTE (type=2) : 表示在页面的某个偏移量处写入2字节redo日志类型。
  3. MLOG_4BYTE (type=4) : 表示在页面的某个偏移量处写入 4字节 redo日志类型。
  4. MLOG_8BYTE (type=8) : 表示在页面的某个偏移量处写入8字节redo日志类型。 
  5. MLOG_WRITE_STRING

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

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

相关文章

Python 绘图工具详解:使用 Matplotlib、Seaborn 和 Pyecharts 绘制散点图

目录 数据可视化1.使用 matplotlib 库matplotlib 库 2 .使用 seaborn 库seaborn 库 3 .使用 pyecharts库pyecharts库 注意1. 确保安装了所有必要的库2. 检查Jupyter Notebook的版本3. 使用render()方法保存为HTML文件4. 使用IFrame在Notebook中显示HTML文件5. 检查是否有其他输…

用vscode编写verilog时,如何有信号定义提示、信号定义跳转(go to definition)、模块跳转这些功能

(一)安装插件SystemVerilog - Language Support 安装一个vscode插件即可,插件叫SystemVerilog - Language Support。虽然说另一个插件“Verilog-HDL/SystemVerilog/Bluespec SystemVerilog”也有信号提示及定义跳转功能,但它只能提…

LLM RAG系列:一文详解RAG,看完这篇你必会(文末福利)

RAG系列 本文介绍了RAG以及RAG pipeline的整个流程,包括请求转换、路由和请求构造、索引和检索、生成和评估等,其中引用了大量有价值的论文。 参考Advanced RAG Series: Generation and Evaluation中的5篇文章,并丰富了相关内容。 请求转换…

服务器硬件介绍

计算机介绍 现在的人们几乎无时无刻都在使用电脑!而且已经离不开电脑了。像桌上的台式电脑(桌机)、笔记本电脑(笔电)、平板电脑、智能手机等等,这些东西都算是电脑。 台式机电脑介绍 计算机又被称为电脑。台式机电脑主要分为主机和显示器两个部分&…

docker启动mysql数据库镜像,开启大小写不敏感,开启不区分大小写,挂载数据库日志文件,挂载数据库文件

docker启动mysql数据库镜像,开启大小写不敏感,开启不区分大小写,挂载数据库日志文件,挂载数据库文件 查询数据库是否区分大小写 SHOW VARIABLES LIKE lower_case_table_names;查询数据库是否支持大小写lower_case_table_names 被设置为 1,即表名不区分大小写。如果值为 1…

SpringBoot 打造图片阅后即焚功能

阅后即焚”(Snapchat-like feature)是指一种社交媒体或信息传递功能,用户在阅读某条信息或查看某张图片后,该信息或图片会自动销毁,无法再次查看。这种功能的主要目的是保护用户的隐私和信息安全,防止敏感信…

年轻人应该读毛选(一到五卷)!!!

在线网址:中文马克思主义文库毛泽东 (marxists.org) 书籍的现实意义,往往是在读后很久才能有所体会的。 推荐《毛泽东选集》——智慧与实践的经典之作 今天想给大家推荐一本充满智慧和深刻洞见的书——《毛泽东选集》。这不仅是一本书,更是…

Java期末复习暨学校第六次上机课作业

Java期末复习暨学校第六次上机课作业: 第一题: 通过new关键字实例化了一个Students类对象s,并调用set方法分别赋值,最后调用study和introduce方法。 输出结果: 第二题: 给出了一个无参构造方法和有参构造…

【操作系统】守护进程

一、守护进程的概念 守护进程是一个在后台运行并且不受任何终端控制的进程 二、自己实现守护进程 1.预备知识 (1)/dev/null /dev/null是一个特殊的设备文件,往这个文件里写不进去任何数据,也读不出来任何数据 因此&#xff0…

MySQL数据库常用命令大全(完整版——表格形式)

✅作者简介:2022年博客新星 第八。热爱国学的Java后端开发者,修心和技术同步精进。 🍎个人主页:Java Fans的博客 🍊个人信条:不迁怒,不贰过。小知识,大智慧。 ✨特色专栏&#xff1a…

TCP滑动窗口

TCP滑动窗口(Sliding Window) 什么是滑动窗口? TCP滑动窗口是TCP协议中的一种流量控制机制,用于调节发送方和接收方之间的数据传输速率,以避免网络拥塞和提高传输效率。 滑动窗口机制允许发送方在不等待确认应答的情…

main中的int argc, char* argv[],命令行调用函数时输入参数用的

int argc:表示命令行参数的数量。argc 至少为1,因为第一个参数总是程序的名称。char* argv[]:是一个字符指针数组,用于存储每个命令行参数的字符串。argv[0] 是程序的名称,argv[1] 是第一个参数,依此类推。…

Vue 批量注册组件实现动态组件技巧

介绍 Vue 动态组件的应用场景很多,可应用于动态页签,动态路由等场景,其核心原理是批量注册。在Vue2和Vue3中实现原理相同,只是语法略有差异。 Vue2 实现 基于 webpack require.context() 是webpack提供的一个自动导入的API 参数1:加载的文件目录 参数2&#xff…

仓储管理系统-综合管理(源码+文档+部署+讲解)

本文将深入解析“仓储管理系统-综合管理”的项目,探究其架构、功能以及技术栈,并分享获取完整源码的途径。 系统概述 仓储管理系统-综合管理是一个全面的仓库管理解决方案,旨在通过集成多种功能模块来优化仓库操作和管理流程。该系统提供了…

xxl-job 是如何注册、注销、维持存活态

我们通过源码发现,xxl-job主要是由客户端发起的注册和存活上报(心跳检测)的; 主要是执行器在启动时,会初始化一个线程,每隔30秒请求调度中心接口,维护存活状态; 注册接口/上报接口:/api/regis…

Ps:OpenColorIO 设置

Ps菜单:编辑/OpenColorIO 设置 Edit/OpenColorIO Settings 在专业的图像编辑和色彩管理工作流程中,准确的色彩呈现和转换至关重要。OpenColorIO(OCIO) 是一种开源的色彩管理框架,广泛应用于影视、动画和视觉特效行业。…

如何抓取某大学网站专业录取分数

当我们在浏览器中浏览网页时,网页上显示的数据实际上已经被加载到浏览器内存中,只是以一种可视化的方式呈现出来。那么是否有一种简便的方法可以将这些数据从网页中提取出来,并保存为表格格式呢? 这是某大学的专业分数录取情况数…

举例理解LSM-Tree,LSM-Tree和B+Tree的比较

写操作 write1:WAL 把操作同步到磁盘中WAL做备份(追加写、性能极高) write2:Memtable 完成WAL后将(k,v)数据写入内存中的Memtable,Memtable的数据结构一般是跳表或者红黑树 内存内采用这种数据结构一方面支持内存…

JAVA开源项目 微服务在线教育系统 计算机毕业设计

博主说明:本文项目编号 T 060 ,文末自助获取源码 \color{red}{T060,文末自助获取源码} T060,文末自助获取源码 目录 一、系统介绍二、演示录屏三、启动教程四、功能截图五、文案资料5.1 选题背景5.2 国内外研究现状5.3 可行性分析…

深入浅出《钉钉AI》产品体验报告

1. 引言 随着人工智能技术的迅猛发展,企业协同办公领域迎来了新的变革。钉钉作为阿里巴巴集团旗下的企业级通讯与协同办公平台,推出了钉钉AI助理,旨在提高工作效率,优化用户体验。本报告将对钉钉AI助理进行全面的产品体验分析&am…