【MySQL 数据宝典】【磁盘结构】- 003 双写缓冲区

2024-04-19 11:28

本文主要是介绍【MySQL 数据宝典】【磁盘结构】- 003 双写缓冲区,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

一、双写缓冲区 ( Doublewrite Buffer Files)

1.1 背景介绍

写失效 (部分页失效)

  • InnoDB的页和操作系统的页大小不一致,InnoDB页大小一般为16K,操作系统页大小为4K,InnoDB的页写入到磁盘时,一个页需要分4次写。
  • 如果存储引擎正在写入页的数据到磁盘时发生了宕机,可能出现页只写了一部分的情况,比如只写了4K,就宕机了,这种情况叫做部分写失效(partial page write),可能会导致数据丢失。

19.jpg

1.2 双写缓冲区 Doublewrite Buffer

为了解决写失效问题,InnoDB实现了双写缓冲区,它位于系统表空间,是一个存储区域。
在BufferPool的页刷新到磁盘真正位置前,数据会先被存储在双写缓冲区
这样在宕机重启时,即使发生数据页损坏,可以通过该页的副本来还原该页,然后再进行redo log重做,确保了数据页的可靠性。

1.3 配置开关

默认情况下启用双写缓冲区,可以通过将 innodb_doublewrite 设置为0 来禁用。

mysql> show variables like '%innodb_doublewrite%';
+--------------------+-------+
| Variable_name      | Value |
+--------------------+-------+
| innodb_doublewrite | ON    |
+--------------------+-------+
1 row in set (0.01 sec)

1.4 数据双写流程

21.jpg

  • Step 1:脏页刷新到磁盘前,先写入双写缓冲区。
  • Step 2:使用 memcpy 函数将脏页复制到内存中的双写缓冲区。
  • Step 3:将双写缓冲区的数据分两次,每次1MB,顺序写入共享表空间的物理磁盘上。
  • Step 4:完成双写缓冲区的写入后,再将双写缓冲区中的页写入各个表的独立表空间文件中。

1.4.1 双写的原因

为啥写两次,刷一次数据文件保存数据不就可以了,为什么还要写共享表空间 ?

  • 性能提升: 共享表空间是在ibdata文件中划出的连续空间,专门用于存储双写缓冲区的数据。在这个过程中,双写缓冲区中的数据是连续存储的,因此写入磁盘时可以实现顺序写入。顺序写入通常比随机写入更快,因为它可以最大程度地减少磁盘头寻址的时间,从而提高了磁盘写入性能。
  • 数据可靠性: 完成共享表空间的写入后,再将数据写入到各个表的独立表空间文件中。这时,数据的写入变为离散的,因为每个表的独立表空间文件都是分散在磁盘上的。虽然这种写入方式可能比较慢,但它确保了数据的分散存储,提高了数据的可靠性。即使出现了硬件故障或其他意外情况,只影响到了某个表的数据文件,其他表的数据仍然是安全的。

双写缓冲区在写入过程中发生了宕机,数据页仍然有可能丢失。双写缓冲区的设计是为了减少写失效(partial page write)的风险,但并不能完全消除它

这篇关于【MySQL 数据宝典】【磁盘结构】- 003 双写缓冲区的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/917407

相关文章

MySQL 筛选条件放 ON后 vs 放 WHERE 后的区别解析

《MySQL筛选条件放ON后vs放WHERE后的区别解析》文章解释了在MySQL中,将筛选条件放在ON和WHERE中的区别,文章通过几个场景说明了ON和WHERE的区别,并总结了ON用于关... 今天我们来讲讲数据库筛选条件放 ON 后和放 WHERE 后的区别。ON 决定如何 "连接" 表,WHERE

mysql_mcp_server部署及应用实践案例

《mysql_mcp_server部署及应用实践案例》文章介绍了在CentOS7.5环境下部署MySQL_mcp_server的步骤,包括服务安装、配置和启动,还提供了一个基于Dify工作流的应用案例... 目录mysql_mcp_server部署及应用案例1. 服务安装1.1. 下载源码1.2. 创建独立

Mysql中RelayLog中继日志的使用

《Mysql中RelayLog中继日志的使用》MySQLRelayLog中继日志是主从复制架构中的核心组件,负责将从主库获取的Binlog事件暂存并应用到从库,本文就来详细的介绍一下RelayLog中... 目录一、什么是 Relay Log(中继日志)二、Relay Log 的工作流程三、Relay Lo

MySQL日志UndoLog的作用

《MySQL日志UndoLog的作用》UndoLog是InnoDB用于事务回滚和MVCC的重要机制,本文主要介绍了MySQL日志UndoLog的作用,文中介绍的非常详细,对大家的学习或者工作具有一定的... 目录一、Undo Log 的作用二、Undo Log 的分类三、Undo Log 的存储四、Undo

MySQL游标和触发器的操作流程

《MySQL游标和触发器的操作流程》本文介绍了MySQL中的游标和触发器的使用方法,游标可以对查询结果集进行逐行处理,而触发器则可以在数据表发生更改时自动执行预定义的操作,感兴趣的朋友跟随小编一起看看... 目录游标游标的操作流程1. 定义游标2.打开游标3.利用游标检索数据4.关闭游标例题触发器触发器的基

MySQL查看表的历史SQL的几种实现方法

《MySQL查看表的历史SQL的几种实现方法》:本文主要介绍多种查看MySQL表历史SQL的方法,包括通用查询日志、慢查询日志、performance_schema、binlog、第三方工具等,并... 目录mysql 查看某张表的历史SQL1.查看MySQL通用查询日志(需提前开启)2.查看慢查询日志3.

MySQL底层文件的查看和修改方法

《MySQL底层文件的查看和修改方法》MySQL底层文件分为文本类(可安全查看/修改)和二进制类(禁止手动操作),以下按「查看方法、修改方法、风险管控三部分详细说明,所有操作均以Linux环境为例,需... 目录引言一、mysql 底层文件的查看方法1. 先定位核心文件路径(基础前提)2. 文本类文件(可直

MySQL数据目录迁移的完整过程

《MySQL数据目录迁移的完整过程》文章详细介绍了将MySQL数据目录迁移到新硬盘的整个过程,包括新硬盘挂载、创建新的数据目录、迁移数据(推荐使用两遍rsync方案)、修改MySQL配置文件和重启验证... 目录1,新硬盘挂载(如果有的话)2,创建新的 mysql 数据目录3,迁移 MySQL 数据(推荐两

Python数据验证神器Pydantic库的使用和实践中的避坑指南

《Python数据验证神器Pydantic库的使用和实践中的避坑指南》Pydantic是一个用于数据验证和设置的库,可以显著简化API接口开发,文章通过一个实际案例,展示了Pydantic如何在生产环... 目录1️⃣ 崩溃时刻:当你的API接口又双叒崩了!2️⃣ 神兵天降:3行代码解决验证难题3️⃣ 深度

MySQL字符串转数值的方法全解析

《MySQL字符串转数值的方法全解析》在MySQL开发中,字符串与数值的转换是高频操作,本文从隐式转换原理、显式转换方法、典型场景案例、风险防控四个维度系统梳理,助您精准掌握这一核心技能,需要的朋友可... 目录一、隐式转换:自动但需警惕的&ld编程quo;双刃剑”二、显式转换:三大核心方法详解三、典型场景