当前位置: 首页 > news >正文

InnoDB 磁盘结构之数据字典和双写缓冲区

数据字典(InnoDB Data Dictionary)

MySQL中,数据字典包括了: 表结构、数据库名或表名、字段的数据类型、视图、索引、表字段信息、MySQL版本信息、存储过程、触发器等内容

InnoDB数据字典由内部系统表组成,这些表包含用于查找表、索引和表字段等对象的元数据。元数据物理上位于InnoDB系统表空间中。在MySQL8.0之前由于历史原因,数据字典元数据在一定
程度上与InnoDB表元数据文件(.frm文件)中存储的信息重叠

在这里插入图片描述
注: MySQL8.0版本以后 将所有原先存放于数据字典文件中的信息,全部存放到数据库系统表中,即将之前版本的 .frm,.opt等文件都移除了,不再通过文件的方式存储数据字典信息

双写缓冲区 ( Doublewrite Buffer Files)

  • 什么是写失效 ( 部分页失效 )

    InnoDB的页和操作系统的页大小不一致,InnoDB页大小一般为16K,操作系统页大小为4K,InnoDB的页写入到磁盘时,一个页需要分4次写

    如果存储引擎正在写入页的数据到磁盘时发生了宕机,可能出现页只写了一部分的情况,比如只写了4K,就宕机了,这种情况叫做部分写失效(partial page write),可能会导致数据丢失
    在这里插入图片描述

  • 双写缓冲区 Doublewrite Buffer

    为了解决写失效问题,InnoDB实现了double write buffer Files, 它位于系统表空间,是一个存储区域

    在Buffer Pool的page页刷新到磁盘真正的位置前,会先将数据存在Doublewrite 缓冲区。这样在宕机重启时,如果出现数据页损坏,那么在应用redo log之前,需要通过该页的副本来还原该页,然后再进行redo log重做,double write实现了InnoDB引擎数据页的可靠性

    默认情况下启用双写缓冲区,如果要禁用Doublewrite 缓冲区,可以将 innodb_doublewrite 设置为0
    在这里插入图片描述

  • 数据双写流程
    在这里插入图片描述

    • step1:当进行缓冲池中的脏页刷新到磁盘的操作时,并不会直接写磁盘,每次脏页刷新必须要先写double write
    • step2:通过memcpy函数将脏页复制到内存中的double write buffer
    • step3: double write buffer再分两次、每次1MB, 顺序写入共享表空间的物理磁盘上, 第一次写
    • step4: 在完成double write页的写入后,再将double wirite buffer中的页写入各个表的独立表空间文件中(数据文件 .ibd), 第二次写
  • 为什么写两次 ?

    为啥写两次,刷一次数据文件保存数据不就可以了,为什么还要写共享表空间? 其实是因为共享表空间是在ibdbata文件中划出2M连续的空间,专门给double write刷脏页用的, 由于在这个过程中,double write页的存储是连续的,因此写入磁盘为顺序写,性能很高;完成double write后,再将脏页写入实际的各个表空间文件,这时写入就是离散的了

  • Change Buffer

    系统表空间中的change buffer是内存缓冲池中change buffer的备份,也就是说被持久化到了系统表空间中。在崩溃恢复的时候会从系统表空间的change buffer中读取信息到buffer pool

http://www.lryc.cn/news/65257.html

相关文章:

  • Django模型层part two - 多表关系创建和多表操作
  • 智能优化算法:浣熊优化算法-附代码
  • 【51单片机】数码管显示(样例展示以及异常分析)
  • Android InputChannel事件发送接收系统分析
  • Java时间类(五)-- LocalDate()类
  • 用手机号码归属地 API 开发的应用推荐
  • 测试从业第 3 年,我看到了终点......
  • 结巴分词原理分析
  • JavaEE 第三-四周
  • Ububtu20.04 无法连接外屏(显卡驱动问题导致)
  • 配置JDK环境变量
  • 保护移动设备免受恶意软件侵害优秀方法
  • 一个人在家怎么赚钱?普通人如何通过网络实现在家就能赚钱
  • ChatGPT诞生的新岗位:提示工程师(Prompt Engineer)
  • 机器学习笔记 使用PPOCRLabel标注自己的OCR数据集
  • 【C++初阶】类和对象(二)
  • 深入探讨Java、Spring和Dubbo的SPI机制
  • 使用机器人为无线传感器网络提供服务(Matlab代码实现)
  • QT自制软键盘 最完美、最简单、跟自带虚拟键盘一样
  • 优思学院|8D和DMAIC两种方法应如何选择?
  • 回归预测 | MATLAB实现MLR多元线性回归预测(多指标评价)
  • PHP 二维数组相关函数:二维数组指定key排序,二维数组转一维数组,两个二维数组取差集,对象转数组,判断元素是否在多维数组中
  • 演出剧院门票售票预约小程序开发制作功能介绍
  • JUC之Java内置锁的核心原理
  • 【项目经理】论项目经理的自我修养
  • 知识图谱学习笔记03-知识图谱的作用
  • 刚进公司就负责项目,把老弟整蒙了!
  • 【Python基础入门学习】Python高级变量你了解多少?
  • 《LearnUE——基础指南:上篇—3》——GamePlay架构WorldContext,GameInstance,Engine之间的关系
  • 重大问题,Windows11出现重大BUG(开始菜单掉帧,卡顿)