广告
返回顶部
首页 > 资讯 > 数据库 >mysql中undo log 及 redo log是什么
  • 674
分享到

mysql中undo log 及 redo log是什么

2024-04-02 19:04:59 674人浏览 安东尼
摘要

这篇文章将为大家详细讲解有关Mysql中undo log 及 redo log是什么,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。00 – Undo LogUndo Lo

这篇文章将为大家详细讲解有关Mysql中undo log 及 redo log是什么,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。

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

- 事务的原子性(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中undo log 及 redo log是什么”这篇文章就分享到这里了,希望以上内容可以对大家有一定的帮助,使各位可以学到更多知识,如果觉得文章不错,请把它分享出去让更多的人看到。

您可能感兴趣的文档:

--结束END--

本文标题: mysql中undo log 及 redo log是什么

本文链接: https://www.lsjlt.com/news/63393.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • mysql中undo log 及 redo log是什么
    这篇文章将为大家详细讲解有关mysql中undo log 及 redo log是什么,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。00 – Undo LogUndo Lo...
    99+
    2022-10-18
  • MySQL中的redo log和undo log日志有什么用
    这篇文章主要介绍“MySQL中的redo log和undo log日志有什么用”,在日常操作中,相信很多人在MySQL中的redo log和undo log日志有什么用问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家...
    99+
    2023-06-20
  • MySQL中的redo log和undo log日志详解
    MySQL日志系统中最重要的日志为重做日志redo log和归档日志bin log,后者为MySQL Server层的日志,前者为InnoDB存储引擎层的日志。 1 重做日志redo log 1.1 什么是redo ...
    99+
    2022-05-13
    MySQL redo log mysql undo log
  • MySQL的binlog、redo log和undo log怎么使用
    这篇文章主要介绍“MySQL的binlog、redo log和undo log怎么使用”,在日常操作中,相信很多人在MySQL的binlog、redo log和undo log怎么使用问题上存在疑惑,小编查...
    99+
    2022-10-19
  • mysql日志文件undo log和redo log怎么设置
    本篇内容主要讲解“mysql日志文件undo log和redo log怎么设置”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“mysql日志文件undo log和re...
    99+
    2023-06-30
  • 什么是Redo log和Binlog
    本篇内容介绍了“什么是Redo log和Binlog”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!redo...
    99+
    2022-10-18
  • 什么是Redo log与Binlog
    这篇文章主要介绍“什么是Redo log与Binlog”,在日常操作中,相信很多人在什么是Redo log与Binlog问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”什么是R...
    99+
    2022-10-19
  • 怎么理解mysql中的redo log
    今天就跟大家聊聊有关怎么理解mysql中的redo log,可能很多人都不太了解,为了让大家更加了解,小编给大家总结了以下内容,希望大家根据这篇文章可以有所收获。重做日志(redo log)前言:之前一直弄不清楚 mysql 里面 bin ...
    99+
    2023-06-06
  • MySQL日志之redo log和binlog的区别是什么
    这篇文章主要介绍了MySQL日志之redo log和binlog的区别是什么,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了解一下。redo log和...
    99+
    2022-10-18
  • MySQL中怎么设置redo log的大小
    今天就跟大家聊聊有关MySQL中怎么设置redo log的大小,可能很多人都不太了解,为了让大家更加了解,小编给大家总结了以下内容,希望大家根据这篇文章可以有所收获。1、查看当前redo log大小mysq...
    99+
    2022-10-18
  • MySQL 8.0源码redo log的产生以及用法是怎样的
    MySQL 8.0源码redo log的产生以及用法是怎样的,很多新手对此不是很清楚,为了帮助大家解决这个难题,下面小编将为大家详细讲解,有这方面需求的人可以来学习下,希望你能有所收获。最开始了解mysql...
    99+
    2022-10-18
  • mysql .log是什么日志
    mysql .log是指二进制日志文件,它是MySQL数据库引擎记录所有数据库更改操作的日志文件,其作用有:1、数据恢复,可以将数据库还原到特定时间点之前的状态,从而实现数据恢复;2、主从复制,主服务器将生成并写入二进制日志文件,然后从服务...
    99+
    2023-07-25
  • MySql中Binary Log的流程是什么
    本文小编为大家详细介绍“MySql中Binary Log的流程是什么”,内容详细,步骤清晰,细节处理妥当,希望这篇“MySql中Binary Log的流程是什么”文章能帮助大家解决疑惑,下面跟着小编的思路慢...
    99+
    2022-10-19
  • mysql中relay log和binlog有什么用
    这篇文章主要为大家展示了“mysql中relay log和binlog有什么用”,内容简而易懂,条理清晰,希望能够帮助大家解决疑惑,下面让小编带领大家一起研究并学习一下“mysql中relay log和bi...
    99+
    2022-10-18
  • JVM Log技术原理及用法是什么
    本篇文章为大家展示了JVM Log技术原理及用法是什么,内容简明扼要并且容易理解,绝对能使你眼前一亮,通过这篇文章的详细介绍希望你能有所收获。介绍一下JVM Log的概念,初始化和释放,JVM Log各个class的实现除了很自然地运用了继...
    99+
    2023-06-17
  • SpringBoot log打印及输出方式是什么
    这篇文章主要介绍“SpringBoot log打印及输出方式是什么”,在日常操作中,相信很多人在SpringBoot log打印及输出方式是什么问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”SpringBoo...
    99+
    2023-06-25
  • MySQL中binlog和relay-log结构的作用是什么
    这篇文章给大家介绍MySQL中binlog和relay-log结构的作用是什么,内容非常详细,感兴趣的小伙伴们可以参考借鉴,希望对大家能有所帮助。binlog作用binlog的主要作用是记录数据库中表的更改...
    99+
    2022-10-18
  • javascript中log指的是什么意思
    这篇文章将为大家详细讲解有关javascript中log指的是什么意思,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。 JavaScript中l...
    99+
    2022-10-19
  • mysql中的事务隔离级别及可重复读读提交详细分析(mvcc多版本控制/undo log)
    一.事物隔离级别 读未提交(read uncommitted)是指,一个事务还没提交时,它做的变更就能被别的事务看到.通俗理解,别人改数据的事务尚未提交,我在我的事务中也能读到。 读提交(read committed)是指,一个...
    99+
    2015-03-04
    mysql中的事务隔离级别及可重复读读提交详细分析(mvcc多版本控制/undo log)
  • Python Log文件大小设置及备份的方法是什么
    本篇内容介绍了“Python Log文件大小设置及备份的方法是什么”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!一、配置文件大小及...
    99+
    2023-06-21
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作