MySQL大事务的Recovery优化

你有没有碰到过mysqld进程启动了很长时间也起不来的情况?这时候我们可以用perf top命令查看一下MySQL进程主要在干什么事情。如果你查看到的信息如下图所示,启动过程中MySQL的主线程(mysqld_main函数开始的线程)绝大多数的时间都花在了回滚事务上。那么很可能是遇到了大事务回滚。

这种情况最常见的一个场景是一个大事务在写Binlog时把磁盘空间占满了,导致了实例的宕机重启。我曾经遇到的最大的Binlog文件超过了114GB。由于Binlog Cache的临时文件在写完Binlog后才被清理,所以这个事务总共占用了228GB的空间。MySQL的参数binlog_error_action用来控制写Binlog文件失败的行为,默认的配置是ABORT_SERVER,就是关闭进程。用户也可以配置这个参数为IGNORE_ERROR,意思是当写Binlog失败时关闭Binlog文件,后续的事务不再产生Binlog。这种情况显然会导致主备的数据不一致,因此除非不得以不要这样设置。

根因分析

为什么在MySQL进程启动时,主线程要做事务回滚的操作呢?这源自于Binlog的Crashsafe机制,详细的原理可以参考《MySQL的CrashSafe和Binlog的关系》,这里只做一个概括的介绍。事务的DML执行时会产生Binlog Events,当事务提交时这些Binlog Events会被写入到Binlog文件并持久化。为了保证MySQL宕机重启后数据和Binlog的一致性,MySQL设计了一个Crashsafe的机制。该机制对普通事务采用了两阶段提交(2PC),也称为内部 XA(Internal XA)。

如上图所示,在内部 XA 机制下一个事务的提交过程分为三个步骤:

  1. 存储引擎Prepare事务。事务状态由ACTIVE变为PREPARED,并将事务的状态和XID持久化到Redo中。
  2. 事务会产生一个Xid_event,同DML的Binlog Events一同写入到binlog文件中,并持久化。
  3. 提交事务。

当异常宕机时,事务可能处于以下几种状态之一:

  • Active:在两阶段提交里,此类事务从未被写入 Binlog。
  • Prepared 但未写入 Binlog(或仅部分写入):事务已处于 Prepared 状态,但其 XID 未出现在 Binlog 文件中。
  • Prepared 且已写入 Binlog:事务已处于 Prepared 状态,且其 XID 已出现在 Binlog 文件中。
  • Committed:事务已经写入Binlog并且提交。

对于Committed的事务,设计上已经保证了它的Binlog Events一定写入了Binlog文件。因此Binlog和数据是一致的,启动时无需任何操作。对于Active的事务,Binlog Events肯定没有写入Binlog文件,InnoDB有一个后台回滚线程会自动将其回滚Prepared的事务则需根据最后一个Binlog 文件中的XID信息进行处理。如果该事务的XID出现在了Binlog文件中,则需要提交该事务来保证Binlog和数据的一致性;反之则回滚该事务。处理Prepared事务的过程称为Binlog Recovery必须在MySQL向用户提供服务之前完成。事务提交通常很快,但回滚往往耗时与其执行时间相当。如果一个事务执行用了1小时,回滚很可能也需要 1小时,MySQL在此期间将不可用。

为什么必须要在提供服务前回滚所有事务呢?这和XID的实现有关系。XID是用MySQL前缀加上query_id构成的,query_id是一个全局的计数器,系统重启后会重新从1开始计数。如果在启动后,不对之前的Prepared事务进行提交或者回滚,那么就可能出现两个Prepared的事务有相同XID的情况。在恢复时,就无法区分哪个事务该提交,哪个事务该回滚。

异步回滚Prepared事务

在AliSQL中,我们设计了一套异步回滚的机制来解决这个问题。

如上图所示,这个设计中将Prepared的事务回滚分为两个部分:

  1. 主线程将事务状态设为Active并持久化该状态。
  2. 利用InnoDB的后台回滚线程异步回滚事务的所有操作。

Binlog Recovery在完成第一部分后即可立即对外提供服务。由于第一步的执行非常快,Binlog Recovery可以在很短的时间内完成。

在宕机重启时,Active的事务会被InnoDB通过后台线程直接回滚掉,不需要XID来辅助决策。所以恢复时,只要将要回滚的事务的状态从Prepared改成Active就能避免两个Prepared事务有相同XID的问题。这里关键是要对Active的状态做持久化,保证在宕机重启后事务的状态仍然是Active,这样InnoDB就会自动将这个事务回滚掉。

社区版的InnoDB原本对Prepared事务的回滚就是先设置成Active状态,然后再根据Undo记录进行回滚。Active的状态会记录到Redo中,只是没有对Redo做持久化。然而InnoDB默认每秒会做一次Redo的持久化,所以在改成Active后,很快就会被持久化。因此当碰到了大事务回滚造成实例无法启动的情况时,即使是在社区版本,我们只要强制重启MySQL进程,大事务就会转变成后台回滚,不再阻塞实例的启动

这个功能的源码贡献给了MariaDB,已经合并到MariaDB-11.7中,详情参考MDEV-33853[1]。

结论

通过异步回滚的设计,在Binlog Recovery阶段只需要将Prepared的事务的状态设置为Active,真正耗时的事务回滚则由InnoDB的后台回滚线程异步的执行。通过这个优化,原本需要几十分钟甚至几个小时的启动过程,被缩短到秒级完成。

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

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

相关文章

智慧校园一站式解决方案 | 创新教育前沿平台

✅作者简介:合肥自友科技 📌核心产品:智慧校园平台(包括教工管理、学工管理、教务管理、考务管理、后勤管理、德育管理、资产管理、公寓管理、实习管理、就业管理、离校管理、科研平台、档案管理、学生平台等26个子平台) 。公司所有人员均有多…

智慧校园软件平台:实现校园管理的统一入口与数据融合

✅作者简介:合肥自友科技 📌核心产品:智慧校园平台(包括教工管理、学工管理、教务管理、考务管理、后勤管理、德育管理、资产管理、公寓管理、实习管理、就业管理、离校管理、科研平台、档案管理、学生平台等26个子平台) 。公司所有人员均有多…

日常渗透测试怎么玩?通杀漏洞挖掘的实现方法看这里

如何在日常渗透中实现通杀漏洞挖掘? 你是不是天天遇到了edu刷屏? 看到了某些漏洞平台,某些人交了一千个公益漏洞? 是不是觉得很牛逼?其实不然,都不难,其实如果我要是想刷这玩意,可…

基于CODESYS开发的多轴运动控制程序框架将逻辑和运动控制分开,通过封装单轴控制功能块来操作...

基于CODESYS开发的多轴运动控制程序框架将逻辑和运动控制分开,通过封装单轴控制功能块来操作该功能块,包括归零、点动、相对定位、绝对定位、设置当前位置、伺服模式切换等功能。程序框架由主程序按照状态调用,包括归零模式、手动模式、自动模…

瀚高数据库中 java代码类型与bit对应

文章目录环境症状问题原因解决方案环境 系统平台:Microsoft Windows (64-bit) 10 版本:4.7.6 症状 问题原因 MySQL中bit类型迁移至瀚高数据库bit类型,然后程序中适配报Booleanbit错误,java类型与数据库对应关系如下 标准SQL数…

可靠性测试

我们认为软件可靠性始终是重要的,但它对于任务关键型、安全关键型和高使用率系统是必不可少的。如您所料,可靠性测试可用于降低可靠性问题的风险。可靠性故障背后的常见问题包括内存泄漏、磁盘碎片和耗尽、间歇性基础设施问题以及超时值低于可行值。 可…

用Spring的ApplicationEventPublisher进行事件发布和监听

概述 有时候,我们只是想发布一些本地的事件,并不需要引入MQ的,可以直接使用Spring的ApplicationEventPublisher来完成简单事件的发布和监听的。 比如像下面的场景,ApplicationEventPublisher就够用了。 模块间的逻辑解耦&#…

nacos服务安装并启动

nacos服务安装并启动1、介绍2、下载nacos3、下载jdk4、修改配置文件5、修改启动程序文件6、启动nacos服务1、介绍 Nacos是一款集服务发现、配置管理与服务管理于一体的云原生平台,旨在帮助开发者更敏捷地构建和管理微服务架构。 2、下载nacos 下载地址&#xff1…

方法类的倒推过程结束 七

完全同意,而且这是让“方法体系”不发散的关键约束:方法里的所有东西都只能引用你世界树里已经存在的节点类型与载体,不允许发明一套“方法专用数据结构宇宙”。 下面我把“条件是什么、动作是什么、结果是什么”用你现有的对象(存在/场景/特征类型/特征值节点等)重新落一…

PaperNex领衔9款AI论文工具实操指南:半天3万字+真实参考文献

前言:为什么你需要这篇AI论文工具实操指南 面对毕业论文、课题申报、期刊投稿,大学生、研究生、科研人员常陷入时间紧、资料杂、写作难的三重困境。AI写作工具的出现,正在把“写作门槛”降到地板级——但要挑对工具、用对方法,才…

人工智能之数字生命-场景类的功能

场景是世界树的“空间承载体”。存在和特征像贴在场景上的标签,而场景本身负责把空间织成一张可走、可查、可拼接的地图。 我按你这段描述,把“场景类应该关心的三类关系”梳理成一个很稳定的结构:内关系、横关系、上关系。对应世界树里也自然形成“场景占多数层”的形态。…

50个域渗透手法全覆盖 万字长文 适合收藏!从零基础入门到精通,收藏这一篇就够了!

50个域渗透手法全覆盖 万字长文 适合收藏! 在大型企业网络攻防演练与真实攻防对抗中,攻击者一旦突破边界进入内网,Active Directory (AD) 域环境便成为核心目标。掌握域渗透的完整路径和多样化手法,既是攻击方扩大战果的关键&…

收藏必备!情境工程:大模型时代企业知识管理系统的革命性变革

文章探讨了情境工程如何重塑企业知识管理系统,从传统"文档存储检索"模式转变为"主动赋能"。通过场景感知、动态连接和人机协同进化,构建企业"智能认知中枢",实现决策质量跃升、组织能力沉淀和创新加速。系统五…

一文搞懂大模型智能体工作原理:从PEAS模型到TAO循环,小白也能轻松入门!

本文拆解了大模型智能体(Agent)的工作原理,通过PEAS模型介绍智能体的四要素(性能指标、环境、执行器、传感器),分析其面对的不完整、不稳定等环境特点,详细解释了"感知→思考→行动→再次感知"的循环过程,以及Thought-A…

智慧校园系统-打造数字化、智能化的教育管理平台

✅作者简介:合肥自友科技 📌核心产品:智慧校园平台(包括教工管理、学工管理、教务管理、考务管理、后勤管理、德育管理、资产管理、公寓管理、实习管理、就业管理、离校管理、科研平台、档案管理、学生平台等26个子平台) 。公司所有人员均有多…

django-flask基于python的车辆挡泥板机器人工厂管理系统

目录基于Python的车辆挡泥板机器人工厂管理系统摘要关于博主开发技术路线相关技术介绍核心代码参考示例结论源码lw获取/同行可拿货,招校园代理 :文章底部获取博主联系方式!基于Python的车辆挡泥板机器人工厂管理系统摘要 该系统采用Django和Flask框架开…

程序员转型大模型产品经理必看:收藏这份详细学习路线_大模型产品经理学习路线详述

本文为有志成为大模型产品的人提供了完整的学习路线,从基础知识到深化理解再到实战演练,系统性地规划了成长路径。文章详细介绍了所需的技术知识、产品管理理论和实战经验,并提供了丰富的学习资源,帮助读者系统掌握大模型产品经理…

django-flask基于python的超市库存管理系统的设计与实现

目录摘要关于博主开发技术路线相关技术介绍核心代码参考示例结论源码lw获取/同行可拿货,招校园代理 :文章底部获取博主联系方式!摘要 随着零售行业的快速发展,超市库存管理系统的需求日益增长。传统的库存管理方式依赖人工记录和纸质单据&am…

ARP欺骗攻击的7种解决方案,你知道几种?

ARP欺骗攻击的7种解决方案,你知道几种? 一、ARP 表项固化 如图 1 所示, Attacker 仿冒 UserA 向 Gateway 发送伪造的 ARP报文,导致Gateway的ARP表中记录了错误的UserA地址映射关系,造成 UserA 接收不到正常的数据报文…

深度测评10个AI论文网站,本科生轻松搞定毕业论文!

深度测评10个AI论文网站,本科生轻松搞定毕业论文! AI 工具助力学术写作,让论文不再难 对于许多本科生来说,撰写毕业论文是大学生活中最具挑战性的任务之一。从选题到资料收集,再到大纲搭建和初稿撰写,每一…