当前位置: 首页 > 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) …...

终极免费Switch模拟器yuzu:解决电脑玩任天堂游戏的5大痛点

终极免费Switch模拟器yuzu&#xff1a;解决电脑玩任天堂游戏的5大痛点 【免费下载链接】yuzu 任天堂 Switch 模拟器 项目地址: https://gitcode.com/GitHub_Trending/yu/yuzu 想在电脑上畅玩Switch游戏却总是遇到各种问题&#xff1f;yuzu模拟器作为全球最受欢迎的开源任…...

如何快速掌握阴阳师自动化脚本:OAS解放双手的完整教程

如何快速掌握阴阳师自动化脚本&#xff1a;OAS解放双手的完整教程 【免费下载链接】OnmyojiAutoScript Onmyoji Auto Script | 阴阳师脚本 项目地址: https://gitcode.com/gh_mirrors/on/OnmyojiAutoScript 阴阳师自动化脚本&#xff08;Onmyoji Auto Script&#xff0c…...

基于 Next.js 的无头电商架构实战:从 Vercel Commerce 看现代全栈开发

1. 项目概述&#xff1a;一个面向未来的全栈电商起点如果你最近在琢磨着用 Next.js 搞一个电商网站&#xff0c;或者想找一个现代、开箱即用的全栈电商模板来启动项目&#xff0c;那你大概率已经听说过vercel/commerce这个仓库了。它不是某个具体的电商平台&#xff0c;而是一个…...

保姆级教程:INCA 7.2.3 从新建工程到观测标定的完整流程(附A2L文件处理技巧)

INCA 7.2.3 全流程实战指南&#xff1a;从工程搭建到参数标定的深度解析 在汽车电子开发领域&#xff0c;标定工具链的掌握程度直接影响开发效率。作为行业标准的INCA软件&#xff0c;其7.2.3版本在工程管理、实时观测和参数标定方面提供了更完善的解决方案。本文将采用"操…...

Wedecode:全平台微信小程序源代码反编译与安全审计终极指南

Wedecode&#xff1a;全平台微信小程序源代码反编译与安全审计终极指南 【免费下载链接】wedecode 全自动化&#xff0c;微信小程序 wxapkg 包 源代码还原工具, 线上代码安全审计&#xff0c;支持 Windows, Macos, Linux 项目地址: https://gitcode.com/gh_mirrors/we/wedeco…...

深度学习表示学习:特征学习与迁移学习

深度学习表示学习&#xff1a;特征学习与迁移学习 1. 技术分析 1.1 表示学习概述 表示学习是自动学习数据特征的过程&#xff1a; 表示学习层次原始数据 → 低级特征 → 中级特征 → 高级特征 → 任务预测关键:层次特征提取端到端学习迁移能力1.2 表示学习方法 方法特点监督程度…...

AI智能体工具搜索系统:从MCP协议到语义检索的工程实践

1. 项目概述&#xff1a;从“工具搜索”到“智能体工具箱”的进化 最近在折腾AI智能体&#xff08;Agent&#xff09;开发的朋友&#xff0c;估计都绕不开一个核心问题&#xff1a;如何让智能体高效、准确地调用外部工具&#xff1f;无论是让它帮你查天气、发邮件&#xff0c;还…...

基于ChatGPT与飞书开放平台构建企业级智能聊天机器人实践指南

1. 项目概述&#xff1a;当ChatGPT遇上飞书&#xff0c;打造你的专属智能工作伙伴 最近在折腾一个挺有意思的项目&#xff0c;叫“chatgpt-for-chatbot-feishu”。简单来说&#xff0c;这就是一个桥梁&#xff0c;一个能让OpenAI的ChatGPT模型&#xff0c;直接接入到飞书&…...

AI 测试用例审核 Skill:把用例评审从“凭经验”变成“可评分”

导读测试用例写完以后&#xff0c;最怕的不是数量不够&#xff0c;而是评审会上被连续追问&#xff1a;“这个前置条件是什么&#xff1f;” “这里为什么直接跳到下一步&#xff1f;” “预期结果怎么算出来的&#xff1f;” “边界值有没有覆盖&#xff1f;” “PRD 里这个互…...

书成紫微动,律定凤凰驯:海棠山铁哥的道,从来不是嘴上说的,是写在作品里的

文坛从不缺大道理&#xff0c;也不缺高谈阔论的传道者&#xff0c;历来最缺的&#xff0c;是知行合一、落地成真的真大道。一、乱象&#xff1a;言道者多&#xff0c;行道者少口头标榜实际行径文脉传承随波逐流初心坚守妥协功利拒绝流量收割热度敬畏真诚唯数据论 语言可以伪装人…...