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

news2024/12/24 3:02:30

前言

        MySQL 5.5版本开始默认 使用InnoDB作为引擎,它擅长处理事务,具有自动崩溃恢复的特性,在日常开发中使用非常广泛。

下面是官方的InnoDB引擎架构图,主要分为内存结构磁盘结构两大部分。

上一篇文章,我们解析了一下InnoDB的内存结构,接下来我们解析一下更为复杂的磁盘结构。

一、InnoDB磁盘结构

        InnoDB磁盘主要包含 Tablespaces InnoDB Data Dictionary Doublewrite Buffer redo log Undo Logs
  • Tablespaces: 表空间分为系统表空间(ibdata1文件)、临时表空间、常规表空间、Undo表空间以及file-per-table表空间。系统表空间又包括双写缓冲区(Doublewrite Buffer)、Change Buffer
  • Doublewrite bufferinnodb 将数据页写到文件之前存放的位置。8.0.20版本之前,doublewrite buffer存放在InnoDB系统表空间中,8.0.20版本后存放在doublewrite
  • Redo log:存储的是log buffer刷到磁盘的数据
  • Undo log:存在于global临时表空间中,用于事务的回滚
1. 表空间 ( Tablespaces )
        表空间(Tablespaces) : 用于存储表结构和数据 , InnoDB 表空间类型包括系统表空间、 File-Per-Table 空间,常规表空间, Undo 表空间,临时表空间等。
  • 系统(共享)表空间(The System Tablespace
  1. 共享表空间: 包含InnoDB数据字典,Doublewrite BufferChange BufferUndo Logs的存 储区域。系统表空间也默认包含任何用户在系统表空间创建的表数据和索引数据。
  2. 物理文件查看
  3. 系统表空间是一个共享的表空间因为它是被多个表共享的。该空间的数据文件通过参数innodb_data_file_path 控制,默认值是 ibdata1:12M:autoextend (文件名为ibdata112MB、自动扩展)。

  •  独立表空间(File-Per-Table Tablespaces
  1. 默认开启,独立表空间是一个单表表空间,该表创建于自己的数据文件中,而非创建于系统 表空间中。当 innodb_file_per_table 选项开启时,表将被创建于表空间中。否则, innodb将被创建于系统表空间中。
  2. 每个表文件表空间由一个.ibd数据文件代表,该文件默认被创建于数据库目录中。
  • 两种表空间的优缺点  
  1. 共享表空间
    优点:可以将表空间分成多个文件存放到各个磁盘上(表空间文件大小不受表大小的限
    制,如一个表可以分布在不同的文件上)。数据和文件放在一起方便管理。
    缺点:所有的数据和索引存放到一个文件中,虽然可以把一个大文件分成多个小文件,
    但是多个表及索引在表空间中混合存储,这样对于一个表做了大量删除操作后表空间中
    将会有大量的空隙,特别是对于统计分析,日值系统这类应用最不适合用共享表空间。
  2. 独立表空间
    优点: 每个表都有自已独立的表空间 , 每个表的数据和索引都会存在自已的表空间中。
    可以实现单表在不同的数据库中移动 ( 复制 File-per-table 表空间的对应表的数据文件到
    其他 mysql 数据库实例的表空间下,实现表的导入迁移 ) 。空间可以回收(在独立表空间下,删除或者清空表后,存储空间会立刻返回给操作系统。而在共享表空间下,表空间数据文件的大小不会缩小);
    缺点: 单表增加过大,如超过 100 G
  • 通用表空间(General Tablespaces 
  1. MySQL 5.7开始支持通用表空间管理功能,类似于系统表空间,也是共享表空间,可以存储多 个表的数据。
  2. 通用表空间为通过create tablespace语法创建的共享表空间。通用表空间可以创建于mysql 数据目录外的其他表空间(自定义存储路径),其可以容纳多张表,且其支持所有的行格式。
  3. 相比File-per-table表空间,通用表空间由于多表共享表空间,消耗的内存会更少一点,具有 潜在的内存优势。(占用的磁盘空间会更小) 。
  • 撤销表空间(Undo Tablespaces 
  1. 撤销表空间,用来保存回滚日志,即undo logs, undo Log 的数据默认在系统表空间ibdata1 文件中;
  2. 可以通过 innodb_undo_directory 属性 查看回滚表空间的位置。默认路径是mysql的数据存储路径;
  3. InnoDB使用的undo表空间由 innodb_undo_tablespaces 配置选项控制,设置undo独立
    表空间个数,范围为 0-128 , 默认为 0 0 表示不开启独立 undo 表空间 , undo 日志存储在
    ibdata1 文件中。
  4. undo 日志使用共享表空间存在的问题
           因为共享表空间不会自动收缩 , 即使事务关闭 ,undo log 也会一直占用空间 , 所以可能会出现因 为大事物而导致 ibdata1 文件过大的问题 .MySQL5.7 中引入了一个新的参数 innodb_undo_log_truncate 表示是否开启自动收缩 undolog 的表空间的操作。如果配置为 ON ,并且配置了 2 个或 2 个以上的 undolog 表空间数据文件,当某一个日志文件大小超过设置的最大值之后,就会自动的收 缩表空间数据文件。
  5. 8.0 对于undo log存储的进一步优化

        从MySQL8.0版本开始,MySQL默认对undo进行了分离操作,也就是说,不需要在初始化手动配置参数,默认会在datadir目录下生成两个undo表空间文件undo_001 undo002 且可以在线的增加和删除undo表空间文件, 进行动态扩容和收缩.

        查询undo log信息
  • 临时表空间(Temporary Tablespaces
  1. 用户创建的临时表和磁盘内部临时表创建于共享临时表空间中。MySQL 5.7起,开始采用独 立的临时表空间,命名ibtmp1文件,初始化12M,且默认无上限。
  2. 全局临时表空间默认是数据目录的 ibtmp1 文件,所有临时表共享 , 可以通过
    innodb_temp_data_file_path 属性指定临时表空间的位置。
    需要注意的是 : 临时表空间最好是设置最大增长限制 , 否则可能会导致 ibtmp1 文件过大 , 占用过
    多的磁盘空间
  • tmp_table_size 参数配置内部内存临时表的大小。  
  • 如何监控临时表与临时表空间使用情况
    建议 Created_tmp_disk_tables / Created_tmp_tables 不要超过 25% 。如果
    Created_tmp_disk_tables 数量很大,查看是否有很多慢 sql ,是否有很多使用临时表的语
    句。加大 tmp_table_size的值。
    还可以选择择机重启实例,释放 ibtmp1 文件,和 ibdata1 不同, ibtmp1 重启时会被重新初
    始化而 ibdata1 则不可以
2. 数据字典 ( Data Dictionary )  
  • 数据字典(InnoDB Data Dictionary 
        MySQL中,数据字典包括了 : 表结构、数据库名或表名、字段的数据类型、视图、索引、表字段信 息、 MySQL 版本信息、存储过程、触发器等内容 . InnoDB 数据字典由内部系统表组成,这些表包含用于查找表、索引和表字段等对象的元数据。元 数据物理上位于 InnoDB 系统表空间中。在 MySQL8.0 之前 由于历史原因,数据字典元数据在一定 程度上与 InnoDB 表元数据文件(.frm文件)中存储的信息重叠。
3. 双写缓冲区 ( Doublewrite Buffer Files)  
  •  什么是写失效 ( 部分页失效 )
        InnoDB的页和操作系统的页大小不一致, InnoDB 页大小一般为 16K ,操作系统页大小为 4K
InnoDB 的页写入到磁盘时,一个页需要分 4 次写。
        如果存储引擎正在写入页的数据到磁盘时发生了宕机,可能出现页只写了一部分的情况,比如只写 4K ,就宕机了,这种情况叫做部分写失效(partial page write),可能会导致数据丢失。
  •  双写缓冲区 Doublewrite Buffer
        为了解决写失效问题,InnoDB 实现了 double write buffer Files, 它位于系统表空间,是一个存储 区域。
        在BufferPool page 页刷新到磁盘真正的位置前,会先将数据存在 Doublewrite 缓冲区。这样在 宕机重启时,如果出现数据页损坏,那么在应用 redo log之前,需要通过该页的副本来还原该页,然后再进行 redo log 重做, double write 实现了 InnoDB 引擎数据页的可靠性 .
        默认情况下启用双写缓冲区,如果要禁用Doublewrite 缓冲区,可以将 innodb_doublewrite 设置为0
  1. 数据双写流程 
    step1 :当进行缓冲池中的脏页刷新到磁盘的操作时 , 并不会直接写磁盘 , 每次脏页刷新必须要
    先写 double write .
    step2 :通过 memcpy 函数将脏页复制到内存中的 double write buffer .
    step3 : double write buffer 再分两次、每次 1MB, 顺序写入共享表空间的物理磁盘上 , 第一次
    .
    step4 : 在完成 double write 页的写入后,再将 double wirite buffer 中的页写入各个表的 独立
    表空间 文件中 ( 数据文件 .ibd), 第二次写
  2. 为什么写两次 ?
    可能有的同学会有疑问,为啥写两次,刷一次数据文件保存数据不就可以了,为什么还要写共享表空间 ? 其实是因为共享表空间是在 ibdbata 文件中划出 2M 连续的空间,专门给 double write 刷脏页 用的 , 由于在这个过程中, double write 页的存储是连续的,因此写入磁盘为顺序写,性能很高 完成 double write 后,再将脏页写入实际的各个表空间文件,这时写入就是离散的了 .
  3. Change Buffer
    系统表空间中的 change buffer 是内存缓冲池中 change buffer 的备份,也就是说被持久化到了系统表空间中。在崩溃恢复的时候会从系统表空间的 change buffer 中读取信息到 buffer pool

总结

        篇幅原因,本文只解析了InnoDB磁盘结构中的表空间、数据字典、双写缓冲区,对他们的功能、分类等做了细致分析,并对数据的双写流程做了解析。下一篇我们继续把剩下的重做日志、撤销日志、二进制日志做一个全面解析。

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

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

相关文章

C哈的刷题计划之输出数字螺旋矩阵(1)

1、盲听C哈说 都说数据结构与算法是编程的核心,它们两个是内功与心法😀,其它编程工具只是招式,学会了内功与心法,学习新事物(这里特指层出不穷的IT技术)就没有那么难了,实际上&#…

cv::RotatedRect::points误差较大

最后发现不是point的精度问题,float不至于产生这么大误差,是自己代码里缓存了顶点坐标,后面由手动修改了旋转矩形的角度,导致不匹配! 下文可以忽略了-_-! 发现一个天坑,通过高宽和角度构造了一个旋转矩形 …

ThinkServer SR658H V2服务器BMC做raid与装系统

目录 前提准备 一. 给磁盘做raid 二. 安装系统 前提准备 磁盘和系统BMC地址都已经准备好,可正常使用。 例: 设备BMC地址:10.99.240.196 一. 给磁盘做raid 要求: 1. 将两个894G的磁盘做成raid1 2. 将两块14902G的磁盘各自做…

7天用Go从零实现分布式缓存GeeCache(学习)(2)

参考:https://geektutu.com/post/geecache-day2.html // Cache 是一个 LRU 缓存(最近最少使用缓存),它不是并发安全的。 type Cache struct { maxBytes int64 // 缓存的最大字节数 nbytes int64 …

Ajax 与 Vue 框架应用点——随笔谈

老式 在老式的技术中,一个网页通常由前端工程师直接使用 HTML、CSS、JavaScript 编写而成 这种方式的优点很明显:简单粗暴,方便工程师以简单的思维完成工作 当然,缺点也很明显,包括但不限于: 直接原生开发…

鸿蒙动画开发06——打断动画

1、前 言 UI界面除了运行动画之外,还承载着与用户进行实时交互的功能。当用户行为根据意图变化发生改变时,UI界面应做到即时响应。 例如用户在应用启动过程中,上滑退出,那么启动动画应该立即过渡到退出动画,而不应该…

vue2和vue3的区别详解

vue2 VS vue3 对比vue2vue3配置脚手架cmd命令行可视化方式创建脚⼿架组件通信props、$emit、provide、$arrts、EventBus等props、$emit、provide、inject、arrts等数据监听watch,computedwatch,watchEffect,computed双向绑定Object.definePropertyProxyAPI⽣命周期四个阶段befo…

Spring Cloud Eureka 服务注册与发现

Spring Cloud Eureka 服务注册与发现 一、Eureka基础知识概述1.Eureka两个核心组件2.Eureka 服务注册与发现 二、Eureka单机搭建三、Eureka集群搭建四、心跳续约五、Eureka自我保护机制 一、Eureka基础知识概述 1.Eureka两个核心组件 Eureka Server :服务注册中心…

用MVVM设计模式提升WPF开发体验:分层架构与绑定实例解析

MVVM(Model-View-ViewModel)是一种架构模式,广泛应用于现代前端开发,尤其是在微软的WPF(Windows Presentation Foundation)应用程序中。它旨在通过将视图(UI)与业务逻辑(…

飞牛云fnOS本地部署WordPress个人网站并一键发布公网远程访问

文章目录 前言1. Docker下载源设置2. Docker下载WordPress3. Docker部署Mysql数据库4. WordPress 参数设置5. 飞牛云安装Cpolar工具6. 固定Cpolar公网地址7. 修改WordPress配置文件8. 公网域名访问WordPress 前言 本文旨在详细介绍如何在飞牛云NAS上利用Docker部署WordPress&a…

论文笔记 SuDORMRF:EFFICIENT NETWORKS FOR UNIVERSAL AUDIO SOURCE SEPARATION

SUDORMRF: EFFICIENT NETWORKS FOR UNIVERSAL AUDIO SOURCE SEPARATION 人的精神寄托可以是音乐,可以是书籍,可以是运动,可以是工作,可以是山川湖海,唯独不可以是人。 Depthwise Separable Convolution 深度分离卷积&a…

【HarmonyOS】鸿蒙系统在租房项目中的项目实战(一)

从今天开始,博主将开设一门新的专栏用来讲解市面上比较热门的技术 “鸿蒙开发”,对于刚接触这项技术的小伙伴在学习鸿蒙开发之前,有必要先了解一下鸿蒙,从你的角度来讲,你认为什么是鸿蒙呢?它出现的意义又是…

/// ts中的三斜线指令 | 前端

第一次看到注意到这行代码,不知道的还以为是注释呢,查了资料才知道这是typescript中的三斜线指令,那有什么作用呢? 1. 这行代码是TypeScript中的一个三斜线指令(Triple-Slash Directive),用于…

学习日记_20241110_聚类方法(K-Means)

前言 提醒: 文章内容为方便作者自己后日复习与查阅而进行的书写与发布,其中引用内容都会使用链接表明出处(如有侵权问题,请及时联系)。 其中内容多为一次书写,缺少检查与订正,如有问题或其他拓展…

SMA-BP基于黏菌算法优化BP神经网络时间序列预测

项目源码获取方式见文章末尾! 600多个深度学习项目资料,快来加入社群一起学习吧。 《------往期经典推荐------》 项目名称 1.【基于CNN-RNN的影像报告生成】 2.【卫星图像道路检测DeepLabV3Plus模型】 3.【GAN模型实现二次元头像生成】 4.【CNN模型实现…

ssm103宠物领养系统+vue(论文+源码)_kaic

毕业设计(论文) 宠物领养系统的设计与实现 学生姓名: 二级学院: 班级名称: 指导教师: 年 月 日 录 摘 …

Elasticsearch如果集群出现节点故障,我应该如何快速定位问题?

当 Elasticsearch (ES) 集群发生故障时,快速定位问题源头非常重要。Elasticsearch 是一个分布式系统,故障可能由多种原因引起,涉及到硬件、配置、网络、集群本身的健康状况等多个层面。以下是一些定位问题的步骤和工具: 检查集群…

k8s-service、endpoints、pod之间是怎么进行网络互通的

k8s-service、endpoints、pod之间是怎么进行网络互通的 1、service2、endpoints3、service、endpoints、pod通信图4、不同服务pod内部间访问 1、service 在K8S中,Service是一种抽象,定义了一组Pod的逻辑集合和访问这些Pod的策略。首先,我们需…

dbeaver 连接日常是数据库工具类似navicat

官网下载安装包 DBeaver Community | Free Universal Database Tool 登录mysql为例 字体调整 sql 美化,关键字大写 快捷键 执行 ctrlenter 单个语句执行 alt x 执行sql脚本 事务提交,默认自动,可以改成手动 创建数据库 新建表 添加主键 …

Chromium 中chrome.webRequest扩展接口定义c++

一、chrome.webRequest 注意 :从 Manifest V3 开始,"webRequestBlocking" 权限不再适用于大多数扩展程序。以 "declarativeNetRequest" 为例,它允许使用 declarativeNetRequest API。除了 "webRequestBlocking&quo…