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

理解 InnoDB 如何处理崩溃恢复

在数据库领域,数据的一致性与可靠性至关重要。InnoDB 存储引擎的崩溃恢复机制是保障数据安全的核心,其中 Doublewrite Buffer 和 Redo Log 发挥着关键作用。下面,我们将详细探讨 InnoDB 从写入到崩溃恢复的全过程。

一、写入流程

  1. 修改页面:当事务对数据库页面进行修改时,首先在内存中的 Buffer Pool 完成操作。此时,被修改的页面成为 “脏页(Dirty Page)” ,就像刚画完画还未整理的画布,数据已变更但尚未持久化到磁盘。
  2. 记录重做日志(Redo Log):每次页面修改,InnoDB 会立即将操作记录到 Redo Log 中,并且同步写入磁盘。这就好比给每次修改都留了备份,即便系统突发崩溃,也能依据 Redo Log 将修改重新应用,确保数据不丢失。
  3. 准备刷新脏页:随着时间推移,Buffer Pool 中的脏页逐渐增多,如同堆满杂物的房间需要清理。InnoDB 会挑选一批脏页,准备将其刷新到磁盘,释放缓存空间,维持数据一致性。
  4. 写入 Doublewrite Buffer:在将选定的脏页写回数据文件前,InnoDB 会先将页面副本写入数据文件中的 Doublewrite Buffer 区域。此写入操作虽为异步,但必须成功完成后才会继续下一步,类似出门前确认门窗是否锁好。
  5. 写入最终位置:页面成功写入 Doublewrite Buffer 后,InnoDB 会尝试将其直接写入实际的数据文件位置。该写入也是异步的,并且能与写入 Doublewrite Buffer 的操作并行执行,就像同时进行烧水和准备泡茶材料,提高了效率。
  6. 确认写入完成:若两个写入操作都成功,页面可从 Buffer Pool 移除或标记为干净页面(Clean Page)。同时,Doublewrite Buffer 中对应的槽位标记为可用,供后续写操作使用,类似洗净用过的杯子以便下次再用。

二、崩溃恢复流程

若在写入过程中发生崩溃,InnoDB 重启后会执行以下恢复步骤:

  1. 分析 Redo Log:系统启动时,InnoDB 读取 Redo Log,确定哪些事务需要回滚或重做,如同经验丰富的侦探梳理线索,确保未完成的事务得到妥善处理,维护数据一致性。
  2. 检查 Doublewrite Buffer:InnoDB 检查 Doublewrite Buffer 中的页面,对比其与对应数据文件中的页面,查找是否存在因崩溃未完全写入的数据页,就像仔细核对两份文件是否一致。
  3. 修复部分写入的页面:对于部分写入的数据页,InnoDB 用 Doublewrite Buffer 中的完整副本来覆盖有问题的数据文件页面,如同用正确拼图块替换错误的,保证页面的一致性和完整性。
  4. 完成恢复:经过上述步骤,因崩溃导致的问题基本解决,数据库恢复正常运行。未提交的事务回滚,未持久化的已提交事务依据 Redo Log 重做。

三、极端情况下的应对策略

当 Doublewrite Buffer 也出现部分写入或损坏时,InnoDB 采取以下策略:

  1. 依赖 Redo Log:若 Doublewrite Buffer 中的页面不可用或损坏,InnoDB 完全依赖 Redo Log 进行恢复。Redo Log 记录了所有数据库页的修改,即便没有 Doublewrite Buffer 的协助,也能通过重放日志条目重建数据一致性。
  2. 页面修复:对于无法从 Doublewrite Buffer 获取完整副本的页面,InnoDB 根据 Redo Log 中的信息修复,可能需应用一系列日志记录,直至页面恢复到崩溃前状态。
  3. 回滚未提交事务:所有未提交的事务回滚,确保数据库处于一致状态。已提交的事务则根据 Redo Log 重做,保证其效果持久化。
  4. 标记问题页面:若某些页面因严重硬件故障等确实无法修复,InnoDB 标记这些页面为损坏,并排除在后续操作之外。数据库管理员可通过备份或其他手段恢复这部分数据。
  5. 重启后的进一步检查:在恢复正常服务前,InnoDB 执行额外的健康检查,如表空间一致性检查等,确保整个数据库系统的稳定性和可靠性。

四、双写过程

  1. 第一次写入(写入到 Doublewrite Buffer):准备将一个或多个脏页刷新到磁盘前,InnoDB 首先将页面副本写入数据文件中的 Doublewrite Buffer 区域。该区域位于共享表空间(如 ibdata1),是一段专门预留的连续空间,划分为两个 chunk,每个 chunk 可容纳 64 个页面(约 128MB,由 128 个 extent 组成,每个 extent 为 1MB) 。
  2. 第二次写入(写入到目标位置):页面成功写入 Doublewrite Buffer 后,InnoDB 尝试将其直接写入实际的数据文件位置。采用异步 I/O 操作,写入 Doublewrite Buffer 和写入最终位置的操作可在一定程度上并行执行。

InnoDB 凭借这套复杂精妙的机制,有效保护数据免受部分更新问题的影响,确保在极端情况下也能自动修复问题,维持数据的一致性和可靠性。这种设计使 InnoDB 在崩溃恢复时自动修正数据损坏,无需依赖额外备份或复杂过程。

相关文章:

理解 InnoDB 如何处理崩溃恢复

在数据库领域,数据的一致性与可靠性至关重要。InnoDB 存储引擎的崩溃恢复机制是保障数据安全的核心,其中 Doublewrite Buffer 和 Redo Log 发挥着关键作用。下面,我们将详细探讨 InnoDB 从写入到崩溃恢复的全过程。 一、写入流程 修改页面&…...

UE5 蓝图学习计划 - Day 8:触发器与交互事件

在游戏开发中,触发器(Trigger) 和 交互事件(Interaction Events) 是实现游戏动态交互的关键。例如,当角色接近一扇门时,它可以自动打开,或者当玩家进入特定区域时,游戏触…...

根据接口规范封装网络请求和全局状态管理

封装通用页面接口网络请求 axios (request)封装见:https://blog.csdn.net/XiugongHao/article/details/143449863 /*** 封装通用页面的增删改查接口*/ export function postPageListData(pageName: string, queryInfo: any) {return request.…...

Unet 改进:在encoder和decoder间加入TransformerBlock

目录 1. TransformerBlock 2. Unet 改进 3. 完整代码 Tips:融入模块后的网络经过测试,可以直接使用,设置好输入和输出的图片维度即可 1. TransformerBlock TransformerBlock是Transformer模型架构的基本组件,广泛应用于机器翻译、文本摘要和情感分析等自然语言处理任务…...

work-stealing算法 ForkJoinPool

专栏系列文章地址:https://blog.csdn.net/qq_26437925/article/details/145290162 本文目标: 重点是通过例子程序理解work-stealing算法原理 目录 work-stealing算法算法原理和优缺点介绍使用场景work-stealing例子代码 ForkJoinPoolnew ForkJoinPool(…...

DeepSeek Janus-Pro:多模态AI模型的突破与创新

近年来,人工智能领域取得了显著的进展,尤其是在多模态模型(Multimodal Models)方面。多模态模型能够同时处理和理解文本、图像等多种类型的数据,极大地扩展了AI的应用场景。DeepSeek(DeepSeek-V3 深度剖析:…...

STM32-时钟树

STM32-时钟树 时钟 时钟...

hot100_21. 合并两个有序链表

将两个升序链表合并为一个新的 升序 链表并返回。新链表是通过拼接给定的两个链表的所有节点组成的。 示例 1: 输入:l1 [1,2,4], l2 [1,3,4] 输出:[1,1,2,3,4,4] 示例 2: 输入:l1 [], l2 [] 输出:[…...

代码讲解系列-CV(一)——CV基础框架

文章目录 一、环境配置IDE选择一套完整复现安装自定义cuda算子 二、Linux基础文件和目录操作查看显卡状态压缩和解压 三、常用工具和pipeline远程文件工具版本管理代码辅助工具 随手记录下一个晚课 一、环境配置 pytorch是AI框架用的很多,或者 其他是国内的框架 an…...

C++ Primer 标准库类型string

欢迎阅读我的 【CPrimer】专栏 专栏简介:本专栏主要面向C初学者,解释C的一些基本概念和基础语言特性,涉及C标准库的用法,面向对象特性,泛型特性高级用法。通过使用标准库中定义的抽象设施,使你更加适应高级…...

计算机网络安全与运维的关键 —— 常用端口全解析

目录 前言 常见端口分类及用途 20 端口(FTP 数据传输) 21 端口(FTP 消息控制) 22 端口(SSH) 23 端口(Telnet) 25 端口(SMTP) 53 端口(DNS&…...

Vue.js 的介绍与组件开发初步

Vue.js 的介绍与组件开发初步 Vue.js 的介绍与组件开发初步引言第一部分:Vue.js 基础入门1.1 什么是 Vue.js?1.2 搭建 Vue.js 开发环境安装 Node.js 和 npm安装 Vue CLI创建新项目运行示例 1.3 第一个 Vue.js 示例 第二部分:Vue.js 组件开发基…...

【仿12306项目】通过加“锁”,解决高并发抢票的超卖问题

文章目录 一. 测试工具二. 超卖现象演示三. 原因分析四. 解决办法方法一:加synchronized锁1. 单个服务节点情况2. 增加服务器节点,分布式环境synchronized失效演示 方法二:使用Redis分布式锁锁解决超卖问题1. 添加Redis分布式锁2. 结果 方法三…...

wow-agent---task4 MetaGPT初体验

先说坑: 1.使用git clone模式安装metagpt 2.模型尽量使用在线模型或本地高参数模型。 这里使用python3.10.11调试成功 一,安装 安装 | MetaGPT,参考这里的以开发模型进行安装 git clone https://github.com/geekan/MetaGPT.git cd /you…...

MVANet——小范围内捕捉高分辨率细节而在大范围内不损失精度的强大的背景消除模型

一、概述 前景提取(背景去除)是现代计算机视觉的关键挑战之一,在各种应用中的重要性与日俱增。在图像编辑和视频制作中有效地去除背景不仅能提高美学价值,还能提高工作流程的效率。在要求精确度的领域,如医学图像分析…...

94,【2】buuctf web [安洵杯 2019]easy_serialize_php

进入靶场 可以查看源代码 <?php // 从 GET 请求中获取名为 f 的参数值&#xff0c;并赋值给变量 $function // 符号用于抑制可能出现的错误信息 $function $_GET[f];// 定义一个名为 filter 的函数&#xff0c;用于过滤字符串中的敏感词汇 function filter($img) {// 定义…...

LabVIEW如何有效地进行数据采集?

数据采集&#xff08;DAQ&#xff09;是许多工程项目中的核心环节&#xff0c;无论是测试、监控还是控制系统&#xff0c;准确、高效的数据采集都是至关重要的。LabVIEW作为一个图形化编程环境&#xff0c;提供了丰富的功能来实现数据采集&#xff0c;确保数据的实时性与可靠性…...

6 [新一代Github投毒针对网络安全人员钓鱼]

0x01 前言 在Github上APT组织“海莲花”发布存在后门的提权BOF&#xff0c;通过该项目针对网络安全从业人员进行钓鱼。不过其实早在几年前就已经有人对Visual Studio项目恶意利用进行过研究&#xff0c;所以投毒的手法也不算是新的技术。但这次国内有大量的安全从业者转发该钓…...

《Origin画百图》之脊线图

1.数据准备&#xff1a;将数据设置为y 2.选择绘图>统计图>脊线图 3.生成基础图形&#xff0c;并不好看&#xff0c;接下来对图形属性进行设置 4.双击图形>选择图案>颜色选择按点>Y值 5.这里发现颜色有色阶&#xff0c;过度并不平滑&#xff0c;需要对色阶进行更…...

linux 函数 sem_init () 信号量、sem_destroy()

&#xff08;1&#xff09; &#xff08;2&#xff09; 代码举例&#xff1a; #include <stdio.h> #include <stdlib.h> #include <pthread.h> #include <semaphore.h> #include <unistd.h>sem_t semaphore;void* thread_function(void* arg) …...

超短脉冲激光自聚焦效应

前言与目录 强激光引起自聚焦效应机理 超短脉冲激光在脆性材料内部加工时引起的自聚焦效应&#xff0c;这是一种非线性光学现象&#xff0c;主要涉及光学克尔效应和材料的非线性光学特性。 自聚焦效应可以产生局部的强光场&#xff0c;对材料产生非线性响应&#xff0c;可能…...

Leetcode 3576. Transform Array to All Equal Elements

Leetcode 3576. Transform Array to All Equal Elements 1. 解题思路2. 代码实现 题目链接&#xff1a;3576. Transform Array to All Equal Elements 1. 解题思路 这一题思路上就是分别考察一下是否能将其转化为全1或者全-1数组即可。 至于每一种情况是否可以达到&#xf…...

关于 WASM:1. WASM 基础原理

一、WASM 简介 1.1 WebAssembly 是什么&#xff1f; WebAssembly&#xff08;WASM&#xff09; 是一种能在现代浏览器中高效运行的二进制指令格式&#xff0c;它不是传统的编程语言&#xff0c;而是一种 低级字节码格式&#xff0c;可由高级语言&#xff08;如 C、C、Rust&am…...

【电力电子】基于STM32F103C8T6单片机双极性SPWM逆变(硬件篇)

本项目是基于 STM32F103C8T6 微控制器的 SPWM(正弦脉宽调制)电源模块,能够生成可调频率和幅值的正弦波交流电源输出。该项目适用于逆变器、UPS电源、变频器等应用场景。 供电电源 输入电压采集 上图为本设计的电源电路,图中 D1 为二极管, 其目的是防止正负极电源反接, …...

RabbitMQ入门4.1.0版本(基于java、SpringBoot操作)

RabbitMQ 一、RabbitMQ概述 RabbitMQ RabbitMQ最初由LShift和CohesiveFT于2007年开发&#xff0c;后来由Pivotal Software Inc.&#xff08;现为VMware子公司&#xff09;接管。RabbitMQ 是一个开源的消息代理和队列服务器&#xff0c;用 Erlang 语言编写。广泛应用于各种分布…...

JavaScript 数据类型详解

JavaScript 数据类型详解 JavaScript 数据类型分为 原始类型&#xff08;Primitive&#xff09; 和 对象类型&#xff08;Object&#xff09; 两大类&#xff0c;共 8 种&#xff08;ES11&#xff09;&#xff1a; 一、原始类型&#xff08;7种&#xff09; 1. undefined 定…...

MinIO Docker 部署:仅开放一个端口

MinIO Docker 部署:仅开放一个端口 在实际的服务器部署中,出于安全和管理的考虑,我们可能只能开放一个端口。MinIO 是一个高性能的对象存储服务,支持 Docker 部署,但默认情况下它需要两个端口:一个是 API 端口(用于存储和访问数据),另一个是控制台端口(用于管理界面…...

渗透实战PortSwigger靶场:lab13存储型DOM XSS详解

进来是需要留言的&#xff0c;先用做简单的 html 标签测试 发现面的</h1>不见了 数据包中找到了一个loadCommentsWithVulnerableEscapeHtml.js 他是把用户输入的<>进行 html 编码&#xff0c;输入的<>当成字符串处理回显到页面中&#xff0c;看来只是把用户输…...

论文阅读:Matting by Generation

今天介绍一篇关于 matting 抠图的文章&#xff0c;抠图也算是计算机视觉里面非常经典的一个任务了。从早期的经典算法到如今的深度学习算法&#xff0c;已经有很多的工作和这个任务相关。这两年 diffusion 模型很火&#xff0c;大家又开始用 diffusion 模型做各种 CV 任务了&am…...

算术操作符与类型转换:从基础到精通

目录 前言&#xff1a;从基础到实践——探索运算符与类型转换的奥秘 算术操作符超级详解 算术操作符&#xff1a;、-、*、/、% 赋值操作符&#xff1a;和复合赋值 单⽬操作符&#xff1a;、--、、- 前言&#xff1a;从基础到实践——探索运算符与类型转换的奥秘 在先前的文…...