Innodb之Doublewrite Buffer

Innodb 事件流程

在这里插入图片描述

Doublewrite Buffer

InnoDB 存储引擎的 Doublewrite Buffer(双写缓冲区)是一种用于数据完整性和恢复的关键机制。它是为了在数据库发生崩溃时保护数据不受损坏设计的。下面将详细介绍 Doublewrite Buffer 的工作原理、目的以及其对性能的影响。

前置知识

# 查看操作系统一页的大小 4096=4KB
getconf PAGESIZE  
# 查看MySQL一页的大小 16384=16KB
show variables like '%page_zise%'

工作原理

​ Doublewrite Buffer 的主要目的是防止因部分写入(partial page writes)造成的数据页损坏。在某些情况下,当数据库系统正在写入一个数据页到磁盘的过程中发生崩溃,可能会导致该页只写入了一部分,从而损坏了页的内容。为了解决这个问题,InnoDB 实现了双写技术:

  1. 写入前备份:在数据页被写入磁盘之前,InnoDB 首先将其复制到 Doublewrite Buffer 中,这个缓冲区位于共享表空间(通常是 ibdata 文件)中。
  2. 安全写入:从 Doublewrite Buffer 中,数据页将被写入到其最终位置的两个步骤中。首先是写入到 Doublewrite Buffer,确保如果发生崩溃,至少有一个完整的副本可以恢复。
  3. 完成写入:确认数据已经安全写入到 Doublewrite Buffer 后,InnoDB 接着将这些页从 Doublewrite Buffer 写入到最终的数据文件中。

目的和优势

  • 数据完整性:通过确保数据页的至少一份完整副本在任何时候都被保存,Doublewrite Buffer 机制大大降低了数据因崩溃而损坏的风险。
  • 恢复能力:在发生崩溃后,InnoDB 可以使用 Doublewrite Buffer 中的页来恢复那些在崩溃过程中可能已损坏的页。

性能影响

虽然 Doublewrite Buffer 提高了数据的安全性,但它也带来了一些性能开销:

  • 写入延迟:因为每个数据页需要写入两次(一次到 Doublewrite Buffer,一次到最终位置),这增加了 I/O 操作的数量,从而可能影响数据库的写入性能。
  • 空间使用:Doublewrite Buffer 占用了额外的磁盘空间,尽管这通常不是主要问题,但在空间非常有限的环境中可能需要考虑。

配置

​ 在 MySQL 中,可以通过 innodb_doublewrite 参数启用或禁用 Doublewrite Buffer。默认情况下,这个选项是启用的,因为其对于保护数据完整性非常重要。只有在特定情况下,当写入性能比数据完整性更为重要时,才考虑禁用它。

为什么不能仅依靠Redo Log

因为崩溃导致的数据页的部分写损坏,而需要双写缓冲区(Doublewrite Buffer)这个问题的核心在于理解重做日志和数据页写入过程的不同目的和机制。

1. 重做日志的功能限制

重做日志的主要功能是记录事务对数据库所作的修改,确保这些修改可以在数据库崩溃后被重新应用(重放)以保持数据的一致性和完整性。重做日志记录的是逻辑变更,如“将列 X 的值从 A 改为 B”。

  • 逻辑操作记录:重做日志记录的是数据的变更操作,而不是整个数据页的完整内容。因此,它主要用于事务的逻辑恢复,而不是物理数据完整性的恢复。
  • 部分写问题:当一个数据页正在写入磁盘时发生崩溃,可能导致这个数据页只有部分内容被成功写入。这种情况下,页的内容可能变得不完整或损坏,即使重做日志有完整的修改记录,也无法仅凭这些逻辑操作修复一个物理上损坏的页。

2. 双写缓冲区的必要性

双写缓冲区提供了一个中间层,确保每个数据页在写入其最终位置之前,在一个单独的位置(即双写缓冲区)有一个完整的副本。这样,即使在数据页写入过程中发生崩溃,也可以从这个副本恢复完整的页。

  • 物理完整性保护:双写缓冲区保证了即使发生部分写损坏,也有一个完好无损的页副本可用于恢复。
  • 简化恢复过程:在恢复时,如果检测到数据页损坏,InnoDB 可以直接从双写缓冲区复制一个完整的页到数据文件,而不需要逐一解析重做日志来重建页。

3. 性能和安全的平衡

虽然双写增加了一些I/O开销(因为每个页被写了两次),但这种机制在维护数据完整性方面提供了极大的保障,特别是在面对硬件故障、操作系统崩溃或电力故障等情况时。

总结

Doublewrite Buffer 是 InnoDB 存储引擎提供的一个重要功能,它通过牺牲一定的写入性能,为数据库提供了更高级别的数据完整性保护。这种机制特别在系统发生崩溃时显示其价值,可以有效地防止数据损坏,确保数据库的稳定和可靠。在大多数生产环境中,推荐保持这一功能启用状态,除非有充分的测试和评估证明在特定环境中禁用它是安全的。

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

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

相关文章

echarts柱形图实现2.5D

思路:使用markpoint option {title: {text: Rainfall vs Evaporation,subtext: Fake Data},tooltip: {trigger: axis},legend: {data: [Rainfall, Evaporation]},toolbox: {show: true,feature: {dataView: { show: true, readOnly: false },magicType: { show: t…

一文了解什么是私有化部署

在当今数据驱动的商业环境中,企业对于数据的处理和传输需求日益增长,这使得私有化部署成为了一种受到青睐的数据管理策略。私有化部署不仅能够提供更高的数据安全性和隐私保护,还能让企业根据自身需求定制解决方案,从而更有效地控…

你们项目日志是如何处理的???

ELK日志采集系统 1.什么是ELK ELK 是一套流行的数据搜索、分析和可视化解决方案,由三个开源项目组成,每个项目的首字母合起来形成了“ELK”这一术语: Elasticsearch (ES): Elasticsearch 是一个基于 Apache Lucene 构建的分布式、实时搜索与…

RAG开山之作:结合参数化与非参数化记忆的知识密集型NLP任务新解法

20年RAG刚提出时的论文:Retrieval-Augmented Generation for Knowledge-Intensive NLP Tasks,也算是RAG的开山之作之一了。 摘要:检索增强生成(RAG)方法结合了预训练语言模型与基于检索的非参数化记忆,通过…

布局香港之零售小店篇 | 香港一人小企与连锁超市的竞争

近年来,内地品牌入驻香港市场开拓业务已成大势所趋。香港特区政府早前公布的「2023年有香港境外母公司的驻港公司按年统计调查」显示,2023年母公司在海外及内地的驻港公司数量高达9039家。内地品牌在香港的成功落地,不仅为香港市民带来了丰富…

rosdep一键修复

External Player - 哔哩哔哩嵌入式外链播放器 rosdep失败原因 通常在执行rosdep init操作时就会报错,问题的核心在于rosdep会访问raw.githubusercontent.com这个网址下的资源,例如https://raw.githubusercontent.com/ros/rosdistro/master/rosdep/sour…

Leetcode 119 杨辉三角 II

目录 一、问题描述二、示例及约束三、代码方法一:递推方法二:线性递推 四、总结 一、问题描述 给定一个非负索引 rowIndex,返回「杨辉三角」的第 rowIndex 行。   在「杨辉三角」中,每个数是它左上方和右上方的数的和。   自我…

运行Java或Python的时候,Git是必要的吗?

在运行Java或Python代码时,Git并不是必需的,但它可以成为一个非常有用的工具,特别是在团队协作、版本控制和代码管理方面。 Git的作用和优势 版本控制: Git是一个分布式版本控制系统,可以跟踪文件的更改历史&#xff…

CodeGemma初探

什么是 CodeGemma CodeGemma是一系列强大而轻量级的模型的集合,可以执行各种编码任务,包括填充中间代码补全、代码生成、自然语言理解、数学推理和指令跟随。 版本: instruct:7B, 这个版本专门针对自然语言到代码聊天和指令跟随…

租房管理|基于SprinBoot+vue的租房管理系统(源码+数据库+文档)

租房管理目录 基于SprinBootvue的租房管理系统 一、前言 二、系统设计 三、系统功能设计 前台 后台 管理员 订单信息管理 屋主申诉管理 屋主权限 房源信息管理 订单信息管理 四、数据库设计 五、核心代码 六、论文参考 七、最新计算机毕设选题推荐 八、源码获…

阿里云mysql8.0 this is incompatible withsql mode=only full group by

阿里云RDS中mysql5.6升级为8.0后,出现如下问题: ### Error querying database. Cause:java.sql.SQLSyntaxErrorException: Expression #1 of SELECT listis not in GROUP BY clause and contains nonaggregatedcolumn temp.product_id which is not fun…

陪诊小程序开发:守护健康,温暖陪伴每一步

在繁忙的都市生活中,每个人都可能面临就医的困扰。面对陌生的医院环境、复杂的就诊流程,很多人感到无助和迷茫。陪诊小程序的开发,旨在通过科技与服务的融合,为用户带来更加贴心、便捷的陪诊体验,守护健康,…

编译支持播放H265的cef控件

接着在上次编译的基础上增加h265支持编译支持视频播放的cef控件(h264) 测试页面,直接使用cef_enhancement,里边带着的那个html即可,h265视频去这个网站下载elecard,我修改的这个版本参考了里边的修改方式,不过我的这个…

web前端学习笔记1

前端学习笔记 1. 走进HTML 1.1 什么是HTML 超文本标记语言(英语:HyperText Markup Language,简称:HTML)是一种用于创建网页的标准标记语言。您可以使用 HTML 来建立自己的 WEB 站点,HTML 运行在浏览器上,由浏览器来解析。HTML文档的后缀名 .html.htm以上两种后缀名没有区别…

Mediasoup-demo 本地启动步骤(超详细)

Mediasoup-demo 本地启动步骤(超详细) 一.本人环境 系统:macos13.6.3 node: v16.20.2 npm:8.19.4 python: 3.9.6 二.下载代码 git 下载代码: git clone gitgithub.com:versatica/mediasoup-demo.git 三.代码介绍 下载下来…

第⑮讲:Ceph集群管理与监控操作指南

文章目录 1.查看集群的状态信息2.动态的查看集群的状态信息3.查看集群的利用率4.查看OSD的资源利用率5.查看OSD的列表6.查看各组件的状态7.查看集群的仲裁信息8.查看/修改集群组件sock的配置参数 1.查看集群的状态信息 通过集群状态信息可以看到集群的健康状态、各个组件的运行…

实时数仓选型

实时数仓选型 实时数仓选型第一版实时数仓选型第二版 实时数仓选型第一版 实时数仓分层: 计算框架:Flink;存储框架:消息队列(可以实时读取&可以实时写入)ODS:Kafka 使用场景:每过来一条数据,读取到并加工处理DIM: HBase 使用场景:事实表会根据主键获取一行维表数据(1.永…

【AI】如何让局域网PC能够访问langchain框架的AI服务

【背景】 在单位内部成功运行了langchain服务,但是发现本地可以用默认8000端口访问,但是局域网内其它机器却无法访问服务页面。 【分析】 首先查看项目文件夹中的server.py。由于这个server.py的存在,我一开始以为langchain整套框架的服务…

成都直播基地服务|企业入驻天府锋巢直播产业基地到底有什么优势?

天府锋巢直播产业基地,作为天府新区新兴的直播产业聚集地,吸引了众多企业的关注与入驻。那么,企业入驻天府锋巢直播产业基地到底有哪些优势呢?本文将从多个方面进行深入剖析。 一、基地链主无锋科技作为直播行业的领军企业&#x…

基于若依和flowable7.0.1的ruoyi-nbcio-plus流程管理系统正式发布

更多ruoyi-nbcio功能请看演示系统 gitee源代码地址 前后端代码: https://gitee.com/nbacheng/ruoyi-nbcio 演示地址:RuoYi-Nbcio后台管理系统 http://122.227.135.243:9666/ 更多nbcio-boot功能请看演示系统 gitee源代码地址 后端代码&#xff1a…