java八股文面试[数据库]——写失效(双写缓冲区)

news2025/1/13 10:15:18

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

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

image.png

双写缓冲区 Doublewrite Buffer

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

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

默认情况下启用双写缓冲区,如果要禁用Doublewrite 缓冲区,可以将 innodb_doublewrite设置为0。

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

数据双写流程

image.png

  • 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后,再将脏页写入实际的各个表空间文件,这时写入就是离散的了.

doublewrite缓冲区是一个存储区,在该存储区中,InnoDB将页面写入InnoDB数据文件中的适当位置之前,先从缓冲池中刷新页面 。如果在页面写入过程中存在操作系统,存储子系统或意外的mysqld进程退出,则InnoDB可以在崩溃恢复期间从doublewrite缓冲区中找到页面的良好副本。注意:系统恢复后,MySQL 可以根据redolog 进行恢复,而mysql在恢复的过程中是检查page的checksum,checksum就是pgae的最后事务号,发生partial page write 问题时,page已经损坏,找不到该page中的事务号,就无法恢复。

    为什么需要双写?个人理解宏观上还是与InnoDB需要支持事务(ACID)特性有关,而底层的原因是为了解决Partial Write Page问题。

InnoDB的页大小默认为16K,可以使用参数innodb_page_size设置, 可设置的值有: 64KB,32KB,16KB(默认),8KB和4KB。并且在数据校验时也针对页进行计算,即他们是一个整个对待,包括把数据持久化到磁盘的操作。而计算机的硬件和操作系统在极端情况下(比如断电、系统崩溃)时,刚写入了4K或8K数据,那么就不能保证该操作的原子性,称为部分页面写问题(Partial Write Page)。

    此时就引入了双写缓存区的机制,当发生极端情况时,可以从系统表空间的Double Write Buffer【磁盘上】进行恢复,下面是InnoDB的架构图、双写和恢复流程图。为了方便对比,将组件放在了相同的位置:

  这样在极端情况下也能解决 Partial Write page问题了,但是如果我自己的系统本身数据要求没有那么高(比如日志数据库),这样的话毕竟双写是有一定的性能开销的。可以通过参数innodb_doublewrite = 0进行关闭,设置为1表示开启。

官方认为,尽管需要写入两次数据,但是写缓冲区不需要两次的 io开销或操作,因为只需要调用一次操作系统的fsync() 就可以将批量数据顺序写入磁盘 -> 系统表空间的Double Write Buffer(如上图),这里是顺序写而不是随机写(性能可以保证),当然前提是配置刷盘策略参数innodb_flush_method为默认的O_DIRECT

其实还有一点就是真正提交的时候会使用组提交,我们可以用参数控制:binlog_group_commit_sync_delay:组提交执行fsync() 延迟的微妙数,延迟时间越长批量数据越多,磁盘io越少性能越高。

binlog_group_commit_sync_no_delay_count:组提交执行fsync的批个数。

知识来源:马士兵教育

Mysql - InnoDB三大特性之双写缓冲区(Double Write Buffer)_it_lihongmin的博客-CSDN博客

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

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

相关文章

移植STM32官方加密库STM32Cryptographic

感谢这位博主,文章具有很高的参考价值: STM32F1做RSA,AES数据加解密,MD5信息摘要处理_我以为我爱了的博客-CSDN博客 概述 ST官方在很多年前就推出了自己的加密库,配合ST芯片用起来非常方便,支持ST的所有…

Pixillion Pro for Mac:将您的图像转换为艺术佳作

Pixillion for Mac有着非常强大的图像转换功能和简单的使用方法,帮助你快速完成大批量图像转换的工作,支持一键转换jpeg、jpg、bmp、png、gif、raf、heic等各种格式的图像文件,同时pixillion mac激活版还提供了图像旋转、添加水印、调整图像大…

多年没有这么花时间解决一个问题了

Ruby 和 PgSQL 并不是我非常熟悉的领域。 多年没有花这么多的时间解决一个问题了,从数据的 Dump 到数据导入,到容器的 SQL 执行。 当你想放弃的时候,发现你有的是一种热爱,喜欢体验到问题被解决的感觉,人还是有需要有…

[管理与领导-74]:IT基层管理者 - 辅助技能 - 4- 职业发展规划 - 构建自己的个人品牌

前言: 一、什么是信任账户 在职场中受到信任是建立良好声誉和专业形象的基础。以下是一些可以帮助职场人受到信任的方法: 诚实守信:始终保持诚实和可靠的行为。遵守诺言,履行承诺,不轻易背信弃义。 专业素养&#xf…

Excel VSTO开发10 -自定义任务面板

版权声明:本文为博主原创文章,转载请在显著位置标明本文出处以及作者网名,未经作者允许不得用于商业目的。 10 自定义任务面板 自定义任务面板(有些地方称为侧边面板)即CustomTaskPane,这个类在Microsoft…

GitHubGiteeGitlab极狐(JihuLab)配置SSH公私钥详细过程

GitHub-微软-github.com Gitee-开源中国- gitee.com Gitlab-乌克兰GitLab 公司-gitlab.com 极狐(JihuLab)-中国代理商运营的Gitlab -gitlab.cn或者jihulab.com 一、生成SSH公钥和私钥 1.1 取消全局设置 $ git config --global user.name "你的名字" $ git confi…

【技术】视频汇聚/视频云存储/视频监控管理平台EasyCVR安全检查相关问题及解决方法2.0

开源EasyDarwin视频监控TSINGSEE青犀视频平台EasyCVR能在复杂的网络环境中,将分散的各类视频资源进行统一汇聚、整合、集中管理,在视频监控播放上,TSINGSEE青犀视频安防监控汇聚平台可支持1、4、9、16个画面窗口播放,可同时播放多…

简明SQL条件查询指南:掌握WHERE实现数据筛选

条件查询是用于从数据库中根据特定条件筛选数据行的一种方式&#xff0c;它避免了检索整个表中的数据。通常&#xff0c;使用 WHERE 子句来定义过滤条件&#xff0c;只有符合这些条件的数据行才会被返回。 SQL中的运算符有&#xff1a;、!、<、> 等&#xff0c;用于进行…

Python数据分析实战-使用装饰器为函数增加异常处理功能(附源码和实现效果)

实现功能 使用装饰器增加异常处理功能 实现代码 # 假设我有一个函数&#xff08;原函数&#xff09;&#xff0c;可以实现两个数相除 def divide(x, y):return x / yres divide(10, 2) print(res)# 定义一个装饰器&#xff0c;使得原函数能够有处理异常的功能 def handle_e…

【算法】快速排序 详解

快速排序 详解 快速排序1. 挖坑法2. 左右指针法 &#xff08;Hoare 法&#xff09;3. 前后指针法4. 快排非递归 代码优化 排序&#xff1a; 排序&#xff0c;就是使一串记录&#xff0c;按照其中的某个或某些关键字的大小&#xff0c;递增或递减的排列起来的操作。 稳定性&…

链接服务器导致SQL Server停止响应

概要 如果多个实例中同时存在数据源为对方实例的链接服务器&#xff0c;并且开启了“分发服务器”的属性&#xff0c;您可能会遇到这种情况。 现象 14:31时&#xff0c;在SSMS中检查HIS实例是否有复制订阅时&#xff0c;点击了”发布服务器属性“后&#xff0c;SSMS一直无法响…

(二十四)大数据实战——Flume数据流监控之Ganglia的安装与部署

前言 本节内容我们主要介绍一下Flume数据流的监控工具Ganglia。Ganglia是一个开源的分布式系统性能监控工具。它被设计用于监视大规模的计算机群集&#xff08;包括集群、网格和云环境&#xff09;&#xff0c;以便收集和展示系统和应用程序的性能数据。Ganglia 可以轻松地扩展…

Tugraph图学习技术详解

文章目录 TuGraph图学习目录图学习典型工作流程整体学习架构加速稀疏计算GPC编译加速 编译加速编译加速流水线GPCSPMM和SDDMM优化SPMM DSL代码生成SDMM DSL代码生成AutoTune-Cost Model 加速效果一键加速 TuGraph图学习实践目录TuGraph采样TuGraph采样算子全图训练采样算子介绍…

启动hadoop并测试问题合集

首先hadoop和jdk都已经装好了的&#xff0c;如下&#xff1a; 然后相应的这五个配置文件也配好了&#xff1a; 然后格式化了&#xff1a; cd /opt/hadoop/bin/ sudo ./hdfs namenode -format &#xff08;显示这个就为成功&#xff0c;很长的&#xff0c;慢慢找&#xff09; …

[当人工智能遇上安全] 8.基于API序列和机器学习的恶意家族分类实例详解

您或许知道&#xff0c;作者后续分享网络安全的文章会越来越少。但如果您想学习人工智能和安全结合的应用&#xff0c;您就有福利了&#xff0c;作者将重新打造一个《当人工智能遇上安全》系列博客&#xff0c;详细介绍人工智能与安全相关的论文、实践&#xff0c;并分享各种案…

如何实现软件的快速交付与部署?

一、低代码开发 微服务、平台化、云计算作为当前的IT技术热点&#xff0c;主要强调共享重用&#xff0c;它们促进了软件快速交付和部署。 但现实的痛点却是&#xff0c;大多数软件即使采用了微服务技术或者平台化思路&#xff0c;也难以做到通过软件共享重用来快速满足业务需求…

MSTP + Eth-Trunk配置实验 华为实验手册

1.1 实验介绍 1.1.1 关于本实验 以太网是当今现有局域网LAN&#xff08;Local Area Network&#xff09;采用的最通用的通信协议标准&#xff0c;以太网作为一种原理简单、便于实现同时又价格低廉的局域网技术已经成为业界的主流。 本实验主要介绍了LAN网络中的Eth-Trunk技术…

比亚迪海豹:特斯拉强劲对手,瑞银拆解成本比同级车型低15%~35%

瑞银证券日前对中国电动车产品比亚迪海豹进行了拆解&#xff0c;发现海豹具有强大的成本优势&#xff0c;而这个优势主要来自于中国本土生产和国内完善的电动车供应链以及比亚迪的垂直整合体系和零部件高度集成性。比亚迪的整车成本比同级别竞争车型分别低15%至35%。 瑞银预测&…

获取街道、乡镇级的地图geoJson数据,使用echarts绘制地图

在此以泰州靖江市为例为例&#xff0c;记录一下实现过程 1、整体完成后实现的效果如下 2、获取数据 &#xff08;1&#xff09;DataV.GeoAtlas 第一个能想到的获取数据的网站就是它&#xff0c; 是阿里推出的一个用于获取全国、各省、各市以及个县级市详细地图信息的json文…

Vue框架学习记录之环境安装与第一个Vue项目

Node.js的安装与配置 首先是Node.js的安装&#xff0c;安装十分简单&#xff0c;只需要去官网下载安装包后&#xff0c;一路next即可。 Node.js是一个开源的、跨平台的 JavaScript 运行时环境 下载地址&#xff0c;有两个版本&#xff0c;一个是推荐的&#xff0c;一个是最新…