`
m635674608
  • 浏览: 5005182 次
  • 性别: Icon_minigender_1
  • 来自: 南京
社区版块
存档分类
最新评论

undo log与redo log原理分析

 
阅读更多

数据库通常借助日志来实现事务,常见的有undo log、redo log,undo/redo log都能保证事务特性,这里主要是原子性和持久性,即事务相关的操作,要么全做,要么不做,并且修改的数据能得到持久化。

假设数据库在操作时,按如下约定记录日志:

1. 事务开始时,记录START T
2. 事务修改时,记录(T,x,v),说明事务T操作对象x,x的值为v 
3. 事务结束时,记录COMMIT T 

undo log原理

undo log是把所有没有COMMIT的事务回滚到事务开始前的状态,系统崩溃时,可能有些事务还没有COMMIT,在系统恢复时,这些没有COMMIT的事务就需要借助undo log来进行回滚。

使用undo log时,要求:

1. 记录修改日志时(redo log),(T,x,v)中v为x修改前的值,这样才能借助这条日志来回滚;
2. 事务提交后,必须在事务的所有修改(包括记录的修改日志)都持久化后才能写COMMIT T日志;这样才能保证,宕机恢复时,已经COMMIT的事务的所有修改都已经持久化,不需要回滚。 

使用undo log时事务执行顺序

1. 记录START T 
2. 记录需要修改的记录的旧值(要求持久化)
3. 根据事务的需要更新数据库(要求持久化)
4. 记录COMMIT T 

使用undo log进行宕机回滚

1. 扫描日志,找出所有已经START,还没有COMMIT的事务。
2. 针对所有未COMMIT的日志,根据redo log来进行回滚。 

如果数据库访问很多,日志量也会很大,宕机恢复时,回滚的工作量也就很大,为了加快回滚,可以通过checkpoint机制来加速回滚,

  1. 在日志中记录checkpoint_start (T1,T2…Tn) (Tx代表做checkpoint时,正在进行还未COMMIT的事务)
  2. 等待所有正在进行的事务(T1~Tn)COMMIT
  3. 在日志中记录checkpoint_end

借助checkpoint来进行回滚

从后往前,扫描undo log
1,如果先遇到checkpoint_start, 则将checkpoint_start之后的所有未提交的事务进行回滚;
2. 如果先遇到checkpoint_end, 则将前一个checkpoint_start之后所有未提交的事务进行回滚;(在checkpoint的过程中,可能有很多新的事务START或者COMMIT)。 

使用undo log,在写COMMIT日志时,要求redo log以及事务的所有修改都必须已经持久化,这种做法通常很影响性能。

redo log原理

redo log是指在回放日志的时候把已经COMMIT的事务重做一遍,对于没有commit的事务按照abort处理,不进行任何操作。

使用redo log时,要求:

1. 记录redo log时,(T,x,v)中的v必须是x修改后的值,否则不能通过redo log来恢复已经COMMIT的事务。
2. 写COMMIT T日志之前,事务的修改不能进行持久化,否则恢复时,对于未COMMIT的操作,可能有数据已经修改,但重放redo log不会对该事务做任何处理,从而不能保证事务的原子性。 

使用redo log时事务执行顺序

1. 记录START T
2. 记录事务需要修改记录的新值(要求持久化)
3. 记录COMMIT T(要求持久化)
4. 将事务相关的修改写入数据库 

使用redo log重做事务

1. 扫描日志,找到所有已经COMMIT的事务;
2. 对于已经COMMIT的事务,根据redo log重做事务; 

在日志中使用checkpoint

1. 在日志中记录checkpoint_start (T1,T2...Tn) (Tx代表做checkpoint时,正在进行还未COMMIT的日志)
2. 将所有已提交的事务的更改进行持久化;
3. 在日志中记录checkpoint_end 

根据checkpoint来加速恢复

从后往前,扫描redo log
1,如果先遇到checkpoint_start, 则把T1~Tn以及checkpoint_start之后的所有已经COMMIT的事务进行重做;
2. 如果先遇到checkpoint_end, 则T1~Tn以及前一个checkpoint_start之后所有已经COMMIT的事务进行重做; 

与undo log类似,在使用时对持久化以及事务操作顺序的要求都比较高,可以将两者结合起来使用,在恢复时,对于已经COMMIT的事务使用redo log进行重做,对于没有COMMIT的事务,使用undo log进行回滚。redo/undo log结合起来使用时,要求同时记录操作修改前和修改后的值,如(T,x,v,w),v为x修改前的值,w为x修改后的值,具体操作顺序为:

1. 记录START T
2. 记录修改日志(T,x,v,w)(要求持久化,其中v用于undo,w用于redo)
3. 更新数据库
4. 记录 COMMIT T 

4和3的操作顺序没有严格要求,并且都不要求持久化;因为如果宕机时4已经持久化,则恢复时可通过redo log来重做;如果宕机时4未持久化,则恢复时可通过undo log来回滚;在处理checkpoint时,可采用与redo log相同的处理方式。

 

http://blog.chinaunix.net/uid-20196318-id-3812190.html

分享到:
评论

相关推荐

    MySQL数据库之undo log和redo log工作原理.png

    MySQL数据库之undo log和redo log工作原理.png,这是一份图例,画图表示undo log和redo log的工作原理

    2 万字 + 30 张图 | 细聊 MySQL undo log、redo log、binlog 有什么用?.doc

    在本文中,我们讨论了 MySQL 事务日志机制的原理和实现,包括 undo log、redo log 和 binlog 三种日志机制的作用和原理。我们还讨论了 MySQL 事务日志机制的应用场景,包括数据备份、主从复制和事务回滚等。

    3000帧动画图解MySQL为什么需要binlog、redo log和undo log.doc

    MySQL为什么需要binlog、redo log和undo log的知识点总结 MySQL数据库管理系统需要binlog、redo log和undo log三个重要的日志系统,以确保数据的一致性和持久性。下面是对这些日志系统的详细解释: 为什么需要分层...

    InnoDB存储引擎Log详解收集.pdf

    Undo Log与Redo Log结合使用的过程如下: 1. 事务开始,记录当前数据到Undo Log。 2. 修改数据,并将新值记录到Redo Log。 3. 事务提交前,确保Redo Log已持久化。 4. 数据最终写入磁盘,但无需在事务提交前完成。 ...

    InnoDB存储引擎Log详解.pdf

    MySQL数据库的InnoDB存储引擎是关系型数据库管理系统的基石,其强大的事务处理能力和高可用性在很大程度上得益于其内部的Log机制,主要包括Undo Log和Redo Log。这两者是实现事务ACID特性的关键,同时也是优化数据库...

    InnoDB-undo-log与MVCC1

    当对数据库中的数据进行增、删、改操作时,InnoDB不仅会生成redo log来确保事务的持久性,还会生成undo log。对于INSERT操作,回滚时对应的是一条DELETE操作;对于DELETE操作,回滚时则是一条INSERT操作;而UPDATE...

    innodb log漫游 @何登成1

    【InnoDB日志系统详解——Undo Log与Redo Log】 InnoDB存储引擎是MySQL数据库中广泛使用的事务型存储引擎,其强大的事务处理能力和高可用性离不开日志系统的支持。日志系统主要包括两种类型:Undo Log和Redo Log,...

    undo&redo;.docx

    在Oracle数据库系统中,撤销(Undo)和重做(Redo)是两个至关重要的概念,它们主要用于事务管理和数据恢复。撤销操作允许用户撤销对数据库的最近更改,而重做操作则用于在系统崩溃或错误发生时恢复数据。 撤销日志...

    详解MySQL 重做日志(redo log)与回滚日志(undo logo)

    MySQL数据库中的重做日志(redo log)和回滚日志(undo log)是事务处理的关键组成部分,它们确保了数据库的持久性和原子性。理解这两类日志对于优化MySQL性能和保证数据一致性至关重要。 1. 重做日志(redo log) ...

    41 在Buffer Pool执行完增删改之后,写入日志文件的redo log长什么样.pdf

    当然,除了redo log之外,数据库还使用其他类型的日志来记录操作,例如undo log,它用于回滚事务,以及binary log,用于复制和备份。每种日志都有其特定的格式和用途,在数据库中扮演着重要的角色。而文章结尾提到的...

    redo与undo_a.pdf11

    "redo与undo"是数据库管理中的关键概念,尤其在事务处理和数据恢复中扮演着核心角色。本文将深入探讨redo与undo机制,以及它们在数据库操作中的应用。 redo,全称重做日志(Redo Log),是数据库系统用来记录事务对...

    RAC下的REDO和UNDO管理

    与REDO日志类似,每个RAC实例都有自己的UNDO段,可以通过`undo_tablespace`参数指定。UNDO数据存储在共享存储中,确保在一致性读取和恢复过程中,即使某个节点出现故障,其他节点仍然可以访问所需的UNDO信息。这保证...

    mysql三种日志文件的介绍

    undo log与redo log都是用于恢复数据的,但它们的作用域不同。redo log是恢复在内存更新后,还没来得及刷到磁盘的数据,而undo log是恢复事务回滚前的状态。 MySQL中的三种日志文件各有其作用域和使用场景。binlog...

    45 如果事务执行到一半要回滚怎么办?再探undo log回滚日志原理!l.pdf

    为了处理事务中可能出现的失败和错误,引入了两种日志机制:重做日志(redo log)和回滚日志(undo log)。在事务执行过程中,如果遇到需要回滚的情况,回滚日志就显得尤为重要。本文将详细探讨回滚日志的原理及其在...

    INNODB关键技术原理以及MYSQL常用规范

    * Redo Log:记录事务提交后的数据变化, redo log也会产生undo log,因为undo log也需要持久化。 事务机制的执行过程包括执行前、执行中和执行后三个阶段。在执行前,MYSQL会先检查事务是否可以执行,如果可以执行...

    oracle undo详解

    Undo信息与重做日志(Redo Log)有所不同,Redo Log记录了如何重新生成更改,用于数据库的向前滚动恢复,而Undo则记录如何还原更改,用于回退和读取一致性。 管理Undo数据主要包括监控Undo表空间的空闲空间,防止...

    Oracle日志介绍

    #### 六、redo log与undo log的区别 - **redo log**:记录数据的修改操作,用于前滚恢复,即当数据库重启时,通过redo log可以重放已提交事务的修改,确保数据的一致性。 - **undo log**:记录数据的更改前状态,...

Global site tag (gtag.js) - Google Analytics