MySql-Undo及Redo详解

数据库恢复技术(事物、三种更新策略以及恢复策略) 数据库恢复技术(事物、三种更新策略以及恢复策略)数据库恢复所要达到的目标数据库为了达到目标的恢复策略 数据库恢复所要达到的目标 1、希望尽可能的减少发生故障的次数。       作为数据库来说,我肯定是想尽可能的减少犯病的次数,最好就没有嘛。 2、在出现故障的时候,能够通过一些方式进行故障恢复。       比如说当我数据库正在访问的时候,突然停电了,这就可能导致数据库的内容不一致了。这 阅读详情

转自https://blog.youkuaiyun.com/alexdamiao/article/details/51872477和https://mp.weixin.qq.com/s/H8MyUKXXKL-eqLLatgMbag

redo log是为了持久化数据,在数据还没从内存刷新到磁盘时,如果发生故障,可读取该日志持久化到磁盘。

binlog 是为了复制和恢复数据的,即Mysql从服务器可以读取主服务器的binlog复制数据,数据库数据丢失,也可以读取binlog恢复

undo log是为了保证原子性的。

 

Undo Log 是为了实现事务的原子性,在MySQL数据库InnoDB存储引擎中,还用Undo Log来实现多版本并发控制(简称:MVCC)。

在数据修改的时候,不仅记录了redo log,还记录undo log,如果因为某些原因导致事务失败或回滚了,可以用undo log进行回滚

undo log主要存储的也是逻辑日志,比如我们要insert一条数据了,那undo log会记录的一条对应的delete日志。我们要update一条记录时,它会记录一条对应相反的update记录。

这也应该容易理解,毕竟回滚嘛,跟需要修改的操作相反就好,这样就能达到回滚的目的。因为支持回滚操作,所以我们就能保证:“一个事务包含多个操作,这些操作要么全部执行,要么全都不执行”

 

- 事务的原子性(Atomicity)
事务中的所有操作,要么全部完成,要么不做任何操作,不能只做部分操作。如果在执行的过程中发生了错误,要回滚(Rollback)到事务开始前的状态,就像这个事务从来没有执行过。

- 原理
Undo Log的原理很简单,为了满足事务的原子性,在操作任何数据之前,首先将数据备份到一个地方(这个存储数据备份的地方称为Undo Log)。然后进行数据的修改。如果出现了错误或者用户执行了ROLLBACK语句,系统可以利用Undo Log中的备份将数据恢复到事务开始之前的状态。
除了可以保证事务的原子性,Undo Log也可以用来辅助完成事务的持久化。

- 事务的持久性(Durability)
事务一旦完成,该事务对数据库所做的所有修改都会持久的保存到数据库中。为了保证持久性,数据库系统会将修改后的数据完全的记录到持久的存储上。

- 用Undo Log实现原子性和持久化的事务的简化过程
假设有A、B两个数据,值分别为1,2。
A.事务开始.
B.记录A=1到undo log.
C.修改A=3.
D.记录B=2到undo log.
E.修改B=4.
F.将undo log写到磁盘。
G.将数据写到磁盘。
H.事务提交
这里有一个隐含的前提条件:‘数据都是先读到内存中,然后修改内存中的数据,最后将数据写回磁盘’。

之所以能同时保证原子性和持久化,是因为以下特点:
A. 更新数据前记录Undo log。
B. 为了保证持久性,必须将数据在事务提交前写到磁盘。只要事务成功提交,数据必然已经持久化。
C. Undo log必须先于数据持久化到磁盘。如果在G,H之间系统崩溃,undo log是完整的,可以用来回滚事务。

D. 如果在A-F之间系统崩溃,因为数据没有持久化到磁盘。所以磁盘上的数据还是保持在事务开始前的状态。

 

缺陷:每个事务提交前将数据和Undo Log写入磁盘,这样会导致大量的磁盘IO,因此性能很低。


如果能够将数据缓存一段时间,就能减少IO提高性能。但是这样就会丧失事务的持久性。因此引入了另外一
种机制来实现持久化,即Redo Log.

01 – Redo Log
- 原理
和Undo Log相反,Redo Log记录的是新数据的备份。在事务提交前,只要将Redo Log持久化即可,
不需要将数据持久化。当系统崩溃时,虽然数据没有持久化,但是Redo Log已经持久化。系统可以根据Redo Log的内容,将所有数据恢复到最新的状态。

- Undo + Redo事务的简化过程
假设有A、B两个数据,值分别为1,2.
A.事务开始.
B.记录A=1到undo log.
C.修改A=3.
D.记录A=3到redo log.
E.记录B=2到undo log.
F.修改B=4.
G.记录B=4到redo log.
H.将redo log写入磁盘。
I.事务提交

- Undo + Redo事务的特点
A. 为了保证持久性,必须在事务提交前将Redo Log持久化。
B. 数据不需要在事务提交前写入磁盘,而是缓存在内存中。
C. Redo Log保证事务的持久性。
D. Undo Log保证事务的原子性。
E. 有一个隐含的特点,数据必须要晚于redo log写入持久存储。

- IO性能

 

Undo + Redo的设计主要考虑的是提升IO性能。虽说通过缓存数据,减少了写数据的IO. 但是却引入了新的IO,即写Redo Log的IO。如果Redo Log的IO性能不好,就不能起到提高性能的目的。

 

 

为了保证Redo Log能够有比较好的IO性能,InnoDB 的 Redo Log的设计有以下几个特点:

A. 尽量保持Redo Log存储在一段连续的空间上。因此在系统第一次启动时就会将日志文件的空间完全分配。以顺序追加的方式记录Redo Log,通过顺序IO来改善性能。
B. 批量写入日志。日志并不是直接写入文件,而是先写入redo log buffer.当需要将日志刷新到磁盘时 (如事务提交),将许多日志一起写入磁盘.
C. 并发的事务共享Redo Log的存储空间,它们的Redo Log按语句的执行顺序,依次交替的记录在一起,以减少日志占用的空间。例如,Redo Log中的记录内容可能是这样的:
记录1: <trx1, insert …>
记录2: <trx2, update …>
记录3: <trx1, delete …>
记录4: <trx3, update …>
记录5: <trx2, insert …>
D. 因为C的原因,当一个事务将Redo Log写入磁盘时,也会将其他未提交的事务的日志写入磁盘。
E. Redo Log上只进行顺序追加的操作,当一个事务需要回滚时,它的Redo Log记录也不会从Redo Log中删除掉。

02 – 恢复(Recovery)
- 恢复策略
前面说到未提交的事务和回滚了的事务也会记录Redo Log,因此在进行恢复时,这些事务要进行特殊的的处理.有2中不同的恢复策略:
A. 进行恢复时,只重做已经提交了的事务。
B. 进行恢复时,重做所有事务包括未提交的事务和回滚了的事务。然后通过Undo Log回滚那些未提交的事务。

- InnoDB存储引擎的恢复机制
MySQL数据库InnoDB存储引擎使用了B策略, InnoDB存储引擎中的恢复机制有几个特点:
A. 在重做Redo Log时,并不关心事务性。 恢复时,没有BEGIN,也没有COMMIT,ROLLBACK的行为。也不关心每个日志是哪个事务的。尽管事务ID等事务相关的内容会记入Redo Log,这些内容只是被当作要操作的数据的一部分。
B. 使用B策略就必须要将Undo Log持久化,而且必须要在写Redo Log之前将对应的Undo Log写入磁盘。
Undo和Redo Log的这种关联,使得持久化变得复杂起来。为了降低复杂度,InnoDB将Undo Log看作数据,因此记录Undo Log的操作也会记录到redo log中。这样undo log就可以象数据一样缓存起来, 而不用在redo log之前写入磁盘了。
包含Undo Log操作的Redo Log,看起来是这样的
记录1: <trx1, Undo log insert <undo_insert …>>
记录2: <trx1, insert …>
记录3: <trx2, Undo log insert <undo_update …>>
记录4: <trx2, update …>
记录5: <trx3, Undo log insert <undo_delete …>>
记录6: <trx3, delete …>
C. 到这里,还有一个问题没有弄清楚。既然Redo没有事务性,那岂不是会重新执行被回滚了的事务?
确实是这样。同时Innodb也会将事务回滚时的操作也记录到redo log中。回滚操作本质上也是对数据进行修改,因此回滚时对数据的操作也会记录到Redo Log中。
一个回滚了的事务的Redo Log,看起来是这样的:
记录1: <trx1, Undo log insert <undo_insert …>>
记录2: <trx1, insert A…>
记录3: <trx1, Undo log insert <undo_update …>>
记录4: <trx1, update B…>
记录5: <trx1, Undo log insert <undo_delete …>>
记录6: <trx1, delete C…>
记录7: <trx1, insert C>
记录8: <trx1, update B to old value>
记录9: <trx1, delete A>
一个被回滚了的事务在恢复时的操作就是先redo再undo,因此不会破坏数据的一致性.

- InnoDB存储引擎中相关的函数
Redo: recv_recovery_from_checkpoint_start()
Undo: recv_recovery_rollback_active()
Undo Log的Redo Log: trx_undof_page_add_undo_rec_log()

 

 

 

MySQL事务日志:InnoDB的Redo与Undo详解 InnoDB的Redo和Undo日志是保障数据库稳定性和性能的关键组件。通过深入了解它们的工作原理和配置选项,我们可以更有效地管理和优化数据库系统。本文详细介绍了Redo和Undo日志的功能、配置方法以及故障排查技巧,并通过实际案例展示了具体的优化过程。希望这些内容能够帮助你更好地理解和应用InnoDB的日志技术,构建高效、可靠的数据库环境!以上内容涵盖了InnoDB Redo和Undo日志的基本概念、配置方法、实际案例分析以及最佳实践。如果你对某个具体部分感兴趣,欢迎进一步提问! 阅读详情

相关推荐

高效IT运维报告编写指南:实战经验与模板分享

本文提供了一份全面的IT运维报告编写指南,涵盖实战经验与实用模板分享。文章详细解析了高效运维报告的核心要素,包括结构设计、数据收集自动化和可视化技巧,并提供了月度报告和故障分析报告模板。通过自动化工具和写作技巧,帮助团队提升报告质量,支持决策和问题追踪。

u5v6w7的博客 926

数据库重启恢复概述

参考资料 《数据库系统设计》第二版,第6章 系统故障对策,P188~P200 WAL WAL(write ahead log)是基于重做日志恢复的一个先决条件。意思是,只有当相关日志落盘后,对应的数据才能落盘。比如,下面这条insert语句: begin; insert into test(id) values(1); commit; 只有当insert对应的日志<T1,1,insert>落盘之后,这条insert的元组才能落盘。这是为什么?如果,insert元组先于日志落盘,假设在commi

obvious__的博客 2108

如何处理MIGO取消物料凭证报错:“只是可能对有相同的价格控制进行倒记账(本月S,前月V)” & “仅在 QM 中修改物料质量检验库存”

记录一次处理MM模块的报错。这次连续处理了两个错误,“只是可能对有相同的价格控制进行倒记账(本月S,前月V)” & “仅在 QM 中修改物料质量检验库存”。把过程和操作步骤记录下一。方便日后回头查找。

IT小职员 6232

数据库的UNDO和REDO

2020年的第一篇博客,哈哈哈 Undo日志记录某数据被修改前的值,可以用来在事务失败时进行rollback(回滚); Redo日志记录某数据块被修改后的值,可以用来恢复未写入data file的已成功事务更新的数据。 通过Undo/Redo操作,可实现界面操作过程的撤销和恢复。 Undo是将用户上一步做的操作对程序造成的改动恢复到改动之前,而Redo操作是指重新实现这种改动。 Undo...

KK_2018的技术博客_程序员不止是程序员 2096

vasp计算练习1-Si

si的vasp训练流程

qq_41074165的博客 3295

微信公众号网页H5跳转小程序实战指南(开放标签wx-open-launch-weapp)微信H5跳转小程序、wx-open-launch-weapp、小程序跳转按钮、微信开放标签、H5打开小程序

跳转小程序(wx-open-launch-weapp)唤起App显示支付按钮等等……而我们这次要用的,就是跳转小程序的标签。场景是否支持服务号网页✅ 支持小程序静态网页托管✅ 支持订阅号❌ 不支持微信外部浏览器❌ 不支持这个“开放标签”功能其实很强大,除了跳转小程序,还有唤起APP、跳支付、调用客服等能力。但可惜资料零散,很多坑等着你亲自踩一遍。这篇文章我整理的流程基本涵盖了从“能不能跳”到“怎么跳”的完整路径,希望你能像我一样省下几个小时的踩坑时间。

代码简单说 Vue、JAVA、PHP、Node.js 熟练运用,接口、架构、性能全搞定。 1163

数据库原理 恢复策略

三种不同的数据库故障,其恢复数据库的策略也是不同的 事务故障的恢复 系统故障的恢复 介质故障的恢复 1、事务故障的恢复 事务故障:事务运行至正常终点前被终止 恢复方法:利用日志文件撤销此事务对数据库进行的修改 恢复步骤 反向扫描日志文件,查找该事务的更新操作 对该事务的更新操作执行逆操作:即是将更新前的值写入数据库 特点:事务故障的恢复由系统自动完成,不需要用户进行干预 2、系...

yky__xukai的博客 3143

RandLA-Net Tensorrt 推理 c++

RandLA-Net 实现 Tensorrt 部署.

J。 1109

MySQL事务日志:redo log和undo log详解

REDO LOG 称为`重做日志`,提供再写入操作,恢复提交事务修改的页操作(我们对数据进行修改,数据会报存在内存中,此时还没有保存在磁盘当中,如果此时由于不可抗因素如宕机,事务将不能保证持久性。而`redo log`就阔以保证了,我们在修改完数据之后,将相关的数据保存到redo log中,就算出现宕机我们也可以把更新过的数据从`redo log`中进行恢复刷新到磁盘中),用来保证事务的持久性。 - UNDO LOG 称为`回滚日志`,回滚行记录到某个特定版本,用来保证事务的原子性、一致性。

weixin_51261234的博客 7610

使用 ABAP Development Tool 登录 SAP BTP ABAP 环境时,遇到弹出框应该怎么办?

但在实际环境里,隐私模式、第三方 Cookie 禁止、跨站追踪限制、缓存代理误命中、混合内容拦截等因素,都可能让这条跳转链路被打断。等),浏览器会弹出系统原生登录框,请求用户输入账号和口令或做集成认证。只要它们在响应头里出现,浏览器就会理直气壮地弹框,这是协议层的强约定。,最终弹出原生登录框。前端与网关领域有个通用的经验规则:如果你看到了原生登录框,而期望的是带样式的。环境里的登录方式表述为基于浏览器的前端认证,也就是这类重定向式的交互。环境的具体落地,拆出几类常见诱因与排障路径,并穿插真实世界的案例。

2007 年 ~ 2025 年,深耕 SAP 技术 18 年 369

RK3588+YT9215快速拓展以太网口

YT9215支持7个端口的非阻塞数据传输,确保高效的数据流处理;在开发过程中,最重要的一点就是YT9215与RK3588的GMAC连接和配置部分,下面是gmac1对应dtsi文件的修改,包括注释掉rgmii_phy1对应的mdio1,以及gmac1对应的phy-handle部分,同时将gmac1修改成1000Mbps全双工模式。这就是最简单,最快速的RK3588拓展网口的方法了,如果需要用到交换芯片的其他功能,那就不可以直接使用原厂提供的bin,而是需要对YT9215进行另外的驱动开发。

带着耳朵取流浪的博客 2790

详解MySQL 的 binlog,redo log,undo log

通过两阶段提交(2PC)保证 binlog 和 redo log 的一致性,避免主从不一致或数据丢失。三者协同工作,保障了 MySQL 的事务 ACID 特性、高可用性和数据一致性。是数据库事务处理与数据一致性的核心组件,各自承担不同的职责。

大户影视的博客 1201

Jetson系列目标检测及推流

使用硬件编码,gstreamer推rtsp流至平台

xiao__run的博客 2710

MySQL事务日志——REDO日志、UNDO日志详解

本文将详细介绍MySQL数据库中的REDO日志的作用、实现了什么功能、具体机制和优缺点。需要具有一定的数据库基础、熟悉事务的ACID的前提下可以更好地阅读~

qurious7的博客 1593

华为的C语言编程规范.pdf

华为技术有限公司内部技术规范。本规范制定了编写C语言程序的基本原则、规则和建议。从代码的清晰、简洁、可测试、安全、程序效率、可移植各个方面对C语言编程作出了具体指导。

计算机控制技术及应用

《计算机控制技术及应用》通过总结作者的科研成果和吸收国内外的先进理论、方法和技术,以计算机控制系统的网络化、开放化、智能化和集成化发展趋势为主线索,主要介绍计算机控制系统的基本概念和计算机控制系统的典型形式,计算机控制系统的数学描述与基本分析方法,以及数字PID控制器、最少拍控制系统、达林算法、状态变量设计法等设计方法及其各种改进算法。重点突出计算机控制系统输入输出通道接口的设计方法和典型控制系统的设计案例与实现方法等。

Mysql Innodb日志(redo,undo)详解

大家都知道mysql是日志优先的数据库,日志先于数据写入磁盘,先使用顺序IO写入然后,再根据一定的频率将脏页刷新回磁盘。实现了数据库崩溃后的数据恢复等。本文主要是介绍 redo log(重做日志) 和 undo log(回滚日志),他们的作用,实现原理,以及 联系与区别。 什么是redo log? redo log (重做日志),是在修改数据缓冲页时候记录页修改的日志,是一种基于页的物理日志。记录...

约定明天 1652

怀旧版电脑GBC模拟器

再现原版GBC掌机的界面,电脑运行连游戏界面都一样大小,很怀旧,很真实,(英文版)强烈推荐,很小的文件,很难才找到的。

MySQL事务日志--redo, undo详解

事务有4种特性:原子性、一致性、隔离性和持久性。那么事务的四种特性到底是基于什么机制实现呢?事务的隔离性由锁机制实现。而事务的原子性、一致性和持久性由事务的 redo日志和undo日志来保证。REDO LOG称为重做日志,提供再写入操作,恢复提交事务修改的页操作,用来保证事务的持久性。UNDO LOG称为回滚日志,回滚行记录到某个特定版本,用来保证事务的原子性、一致性。有的DBA或许会认为UNDO是REDO的逆过程,其实不然。

weixin_47786582的博客 4296

廖雪峰Python教程[完整版]

廖雪峰的python教程整理的,已经排好版了,而且还是完整的,适合小白

mysql redo undo 简书_redo undo 详解

redo log称为重做日志,用来保证事务的原子性和持久性。undo log用来保证事务的一致性。redo恢复提交事务修改的页操作,而undo回滚行记录到某个特定版本。因此两者记录的内容不同,redo通常是物理日志,记录的是页的物理修改操作。undo是逻辑日志,根据每行记录进行记录。ib_logfile0、ib_logfile1innodb_log_file_size ...

weixin_34315803的博客 251

MySQL Undo/Redo Log详解

本文系统分析了MySQL中RedoLog和UndoLog的核心机制与应用。RedoLog通过物理日志保证事务持久性,采用顺序写入和两阶段提交机制;UndoLog通过逻辑日志实现事务回滚和MVCC,构建数据版本链。文章详细阐述了两者的存储结构、写入流程及恢复机制,并针对银行转账、长事务、批量处理等典型场景提供优化方案,包括RedoLog大小配置、Undo空间管理、高并发写入优化等。最后给出监控脚本与最佳实践,强调合理配置、避免长事务、定期备份等原则,为数据库性能优化和故障恢复提供实用指导。

萧曳丶 523

mysql undo_详解MySQL的Redo日志与Undo日志

本文概要本文分两部分,第一部分概念介绍,重在理解。第二部分通过MySQL Innodb中的具体实现,加深相关知识的印象。本文的原意是一篇个人学习笔记,为了避免成为草草记录一下的流水账,尝试从给人介绍的角度开写。但在整理的过程中,越来越感觉力不从心,一是细节太多了,原以为足够了解的一个小知识点下可能隐藏了很多细节;二是内容与范围的取舍,既想有点技术性避免空谈,又不想陷入枯燥冗长的小细节描述。几番折腾...

weixin_39949673的博客 414

【数据库】MySQL中bin log、redo log、undo log详解

MySQL中,查询一条数据,会将该数据相关页的所有数据一次性加载出来,放入 中,后续都是从中进行查找;对数据做修改时,如果数据在中存在,则直接更新里面数据,然后将更新操作记录到 中,等待合适时间刷新到redo log 文件中。redo log的日志文件是以日志文件组的形式出现的,每个redo日志文件大小都是一样的,采用环形数组的形式,从头开始写,写到结尾继续从头开始写。日志文件组中有两个重要的属性当redo log记录到日志文件组中,向后推移MySQL从日志文件组中恢复数据时,会清空加载过得redo log

此木博客 1494

MySQL总结(四)——UNDO LOG REDO LOG 详解

本节我们介绍下实现mysql可靠性的两个重要log undo redo log。还是先抛几个问题大家思考思考 一、问题 1.事务回滚怎么实现? 2.RC RR级别可见性是怎么实现的? 3.undo redo log 在哪里保存?空间多大? 4.redo log在容灾时起到什么作用? 二、undo log 2.1 先举栗 select * from t1 where id = ...

waj89757的专栏 1530

MySQL——Redo日志和Undo日志详解

MySQL事务日志机制解析:Redo日志确保事务持久性,记录数据修改操作并支持崩溃恢复,通过参数控制刷盘策略平衡性能与安全性;Undo日志实现事务原子性和MVCC,记录数据旧值用于回滚和多版本并发控制,通过Purge线程清理过期日志。优化建议包括调整Redo刷盘策略和文件大小,监控Undo清理效率,避免长事务影响系统性能。两种日志共同保障了数据库的事务特性和高并发能力。

1加1等于的博客 490

MySQL 三大日志:redo log、undo log、binlog 详解

MySQL的三大日志系统(redo log、undo log、binlog)共同保障了数据库的事务安全和可靠性。redo log作为InnoDB特有的物理日志,通过预写日志机制确保数据持久性;undo log记录数据修改前的状态,支持事务回滚和MVCC机制;binlog是服务器层逻辑日志,用于主从复制和时间点恢复。三者协同工作,通过两阶段提交等机制确保数据一致性。理解这些日志的工作原理和差异,对于数据库性能优化和故障恢复至关重要,需根据业务需求合理配置相关参数以平衡安全性和性能。

呜呼哈 1451

MySQL日志undo log、redo log和binlog详解

MySQL日志undo log、redo log和binlog详解

热爱C++和golang的学生 1278

MySQL日志文件:redo log、undo log和binlog详解

MySQL 日志 主要包括错误日志、查询日志、慢查询日志、事务日志、二进制日志几大类。其中,比较重要的还要属二进制日志 binlog(归档日志)和事务日志 redo log(重做日志)和 undo log(回滚日志)。1、重做日志(redo log)2、回滚日志(undo log)3、归档日志(binlog)4、错误日志(errorlog)5、慢查询日志(slow query log)6、一般查询日志(general log)7、中继日志(relay log)

qq_36176028的博客 4351
上一篇: Redis分布式锁
下一篇: Kafka介绍
AAA821
博客等级 码龄14年 19粉丝 58原创
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值