`
m635674608
  • 浏览: 4931502 次
  • 性别: 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

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

    MySQL的redo log、undo log、binlog

    1、用途 redo log undo log binlog2-2、存储内容、格式 redo log undo log binlog2-3、日志生成 redo log undo log binlog2-4、删除策略 redo log undo log binlog2-5、redo log 与 binlog 的区别三、两...

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

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

    mysql-4.pdf

    理解RedoLog与UndoLog的关系 理解UndoLog的作用 掌握数据和回滚日志的逻辑存储结构 掌握原子性、一致性和持久性的实现机制 理解MVCC的概念 分辨当前读和快照读 理解一致性非锁定读课堂目标 理解MySQL中行锁相关的...

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

    前面文章讲述了 MySQL 系统中常见的几种日志,其实还有事务相关日志 redo log 和 undo log 没有介绍。相对于其他几种日志而言, redo log 和 undo log 是更加神秘,难以观测的。本篇文章将主要介绍这两类事务日志的...

    mysql进阶资料,包含mysql在linux上安装

    mysql进阶篇,包含存储引擎,索引,sql优化,视图,存储过程,锁,MVCC,undo log,redo log,innoDb引擎讲解,mysql管理等

    mysql终极8问(包含)

    该资源主要针对后端程序员,由在大厂工作7年的Java程序员经验,血泪整理,由面试题带你深入理解mysql。 内容概要: 从mysql 的事务,崩溃恢复,索引等...3、mysql通过undo log和redo log进行数据的恢复 4、mysql的索引

    MySQL经典面试题(含答案).zip

    bin log/redo log/undo log是什么? bin log和redo log有什么区别? 说一下数据库的三大范式? 什么是存储过程?有哪些优缺点? 主键使用自增ID还是UUID? 超大分页怎么处理? 一个6亿的表a,一个3亿的表b,通过外间...

    MySQL InnoDB如何保证事务特性示例详解

    undo log+redo log保证事务的一致性 锁(共享、排他)用来保证事务的隔离性 重做日志 redo log 重做日志 redo log 分为两部分:一部分是内存中的重做日志缓冲(redo log buffer),是易丢失的;二部分是重做日志...

    sql2000 Log Explorer4.2(含注册码)+汉化

    Log Explorer主要用于对MSSQLServer的事物分析和数据恢复。你可以浏览日志、导出数据、恢复被修改或者删除的数据(包括执行过update,delete,drop和truncate语句的表格)。一旦由于系统故障或者人为因素导致数据丢失,...

    Log Explorer for SQL Server v4.22 含注册机

    Log Explorer主要用于对MSSQLServer的事物分析和数据恢复。你可以浏览日志、导出数据、恢复被修改或者删除的数据(包括执行过update,delete,drop和truncate语句的表格)。一旦由于系统故障或者人为因素导致数据丢失,...

    Log Explorer for SQL Server v4.22

    Log Explorer主要用于对MSSQLServer的事物分析和数据恢复。你可以浏览日志、导出数据、恢复被修改或者删除的数据(包括执行过update,delete,drop和truncate语句的表格)。一旦由于系统故障或者人为因素导致数据丢失,...

    Log Explorer4.2帮助文档

    Log Explorer主要用于对MSSQLServer的事物分析和数据恢复。你可以浏览日志、导出数据、恢复被修改或者删除的数据(包括执行过update,delete,drop和truncate语句的表格)。一旦由于系统故障或者人为因素导致数据丢失,...

    MySQL经典面试题40问

    1、什么是数据库事务?...o「持久性」:使用 redo log 来实现,只要redo log日志持久化了,当系统崩溃,即可通过redo log把数据恢复。 o「隔离性」:通过锁以及 MVCC,使事务相互隔离开。 「一致

    MySQL中RR级别下的MVCC

    众所周知MySQL中InnoDB的... 以update举例: undolog->修改内存中数据页->redolog prepare->binlog-> commit; 修改数据时 undo log记录原始数据。用于以后或许会发生的回滚操作。  2、表中的的隐藏列 data_trx_id,data

    详述MySQL事务的实现原理

    可靠性:数据库要保证当insert或update操作时抛异常或者数据库crash的时候需要保障数据的操作前后的一致,想要做到这个,我需要知道我修改之前和修改之后的状态,所以就有了undolog和redolog。并发处理:也就是说当...

    MySQL中MTR的概念

     MTR主要是被用在写undo log和redo log的场景下的。例如,我们要向一个B+树索引中插入一条记录,此时要么插入成功,要么插入失败,这个过程就可以称为一个MTR过程,这个过程中会产生一组redo log日志,这组日志在做...

Global site tag (gtag.js) - Google Analytics