数据库存放数据的文件,本文称其为data file。
数据库的内容在内存里是有缓存的,这里命名为db buffer。某次操作,我们取了数据库某表格中的数据,这个数据会在内存中缓存一些时间。对这个数据的修改在开始时候也只是修改在内存中的内容。当db buffer已满或者遇到其他的情况,这些数据会写入data file。

undo,redo

日志在内存里也是有缓存的,这里将其叫做log buffer。磁盘上的日志文件称为log file。log file一般是追加内容,可以认为是顺序写,顺序写的磁盘IO开销要小于随机写。

Undo日志记录某数据被修改前的值,可以用来在事务失败时进行rollback;Redo日志记录某数据块被修改后的值,可以用来恢复未写入data file的已成功事务更新的数据。下面的示例来自于杨传辉《大数据分布式存储系统 原理解析与架构实践》,略作改动。

例如某一事务的事务序号为T1,其对数据X进行修改,设X的原值是5,修改后的值为15,那么Undo日志为<T1, X, 5>,Redo日志为<T1, X, 15>

也有把undo和redo结合起来的做法,叫做Undo/Redo日志,在这个例子中Undo/Redo日志为<T1, X, 5, 15>

当用户生成一个数据库事务时,undo log buffer会记录被修改的数据的原始值,redo会记录被修改的数据的更新后的值。

redo日志应首先持久化在磁盘上,然后事务的操作结果才写入db buffer,(此时,内存中的数据和data file对应的数据不同,我们认为内存中的数据是脏数据),db buffer再选择合适的时机将数据持久化到data file中。这种顺序可以保证在需要故障恢复时恢复最后的修改操作。先持久化日志的策略叫做Write Ahead Log,即预写日志。

在很多系统中,undo日志并非存到日志文件中,而是存放在数据库内部的一个特殊段中。本文中就把这些存储行为都泛化为undo日志存储到undo log file中。

对于某事务T,在log file的记录中必须开始于事务开始标记(比如“start T”),结束于事务结束标记(比如“end T”、”commit T”)。在系统恢复时,如果在log file中某个事务没有事务结束标记,那么需要对这个事务进行undo操作,如果有事务结束标记,则redo。

在db buffer中的内容写入磁盘数据库文件之前,应当把log buffer的内容写入磁盘日志文件。

有一个问题,redo log buffer和undo log buffer存储的事务数量是多少,是按照什么规则将日志写入log file?如果存储的事务数量都是1个,也就意味着是将日志立即刷入磁盘,那么数据的一致性很好保证。在执行事T时,突然断电,如果未对磁盘上的redo log file发生追加操作,可以把这个事务T看做未成功。如果redo log file被修改,则认为事务是成功了,重启数据库使用redo log恢复数据到db buffer和 data file即可。

如果存储多个的话,其实也挺好解释的。就是db buffer写入data file之前,先把日志写入log file。这种方式可以减少磁盘IO,增加吞吐量。不过,这种方式适用于一致性要求不高的场合。因为如果出现断电等系统故障,log buffer、db buffer中的完成的事务会丢失。以转账为例,如果用户的转账事务在这种情况下丢失了,这意味着在系统恢复后用户需要重新转账。

检查点checkpoint

checkpoint是为了定期将db buffer的内容刷新到data file。当遇到内存不足、db buffer已满等情况时,需要将db buffer中的内容/部分内容(特别是脏数据)转储到data file中。在转储时,会记录checkpoint发生的”时刻“。在故障回复时候,只需要redo/undo最近的一次checkpoint之后的操作。

幂等性问题

在日志文件中的操作记录应该具有幂等性。幂等性,就是说同一个操作执行多次和执行一次,结果是一样的。例如,5*1 = 5*1*1*1,所以对5的乘1操作具有幂等性。日志文件在故障恢复中,可能会回放多次(比如第一次回放到一半时系统断电了,不得不再重新回放),如果操作记录不满足幂等性,会造成数据错误。

-------------------------------------------------------------------------------------------------------------------------------------------------------------------------

1、Redo log、Undo log存放位置

     首先,我们先要知道InnoDB redo log、undo log存放位置。InnoDB的事务日志是指Redo log,简称log,存放在日志文件ib_logfile*里面。而Undo log则是存放在共享表空间文件里面(ibdata*)。

2、事务的原子性
      我们知道,InnoDB存储引擎是事务型存储引擎,其具有ACID特性,即:原子性、一致性、隔离性、持久性。Undo log就是为了实现事务的原子性。何为原子性呢?事务的原子性:事务中的所有操作,要么全部完成,要么不作任何操作,不能只做部分操作。如果在执行事务的过程中发生了错误,就要回滚到事务开始前的状态,就好像这个事务从来没执行过一样。

3、Undo log原理
      Undo log的原理其实很简单,Undo log是为了满足事务的原子性,当你在数据库中操作任何数据之前,比如你要修改某条记录的数据,InnoDB首先会将数据备份到一个地方(这个存储数据备份的地方就是Undo log)。然后进行数据的修改。如果在执行事务的过程中出现了错误或者用户执行了ROLLBACK(回滚)语句,系统可以利用Undo log中的备份将数据恢复到事务开始前的状态。
      Undo log除了可以保证事务的原子性之外,还可以用来辅助完成事务的持久化。

4、事务的持久化
      事务一旦完成,该事务对数据库所做的修改都会持久保存到数据库中。为了保证数据的持久性,MySQL会将修改过的数据完全记录到持久的存储设备上(比如硬盘咯~~)

5、用Undo log实现原子性和持久性的事务的简化过程
现在假设我们有两个数据,A=1、B=2
1)事务开始(start transaction  or  set autocommit=0)
2)假设现在我们要修改A记录,那么记录A=1到Undo log
3)现在修改A=3
4)假设现在我们还要修改B记录,那么记录B=2到Undo log
5)现在修改B=4
6)将Undo log日志记录写到磁盘
7)将修改后的数据A=3、B=4写到磁盘
8)提交事务
      这里有一个隐含的前提条件:“因为InnoDB存储引擎把数据和索引都缓存在InnoDB_buffer_pool_size设定的内存缓冲区中,所以当我们修改InnoDB表数据时,会先修改buffer pool中的数据,最后将buffer pool中的数据写入到磁盘。”
      Undo log之所以可以保证事务的原子性和持久性,是因为在上述的简化事务过程中有以下的特点:
a、在更新任何数据前,先把数据的原始状态记录到Undo log;
b、为了保证数据的持久性,必须在提交事务之前先把数据写到磁盘上,只要事务一提交,数据必然持久化到存储设备上;
c、Undo log先于数据持久化到磁盘。如果在上述事务简化过程的 7)~ 8)过程中系统崩溃了,那么Undo log还是完整的,可以用来回滚事务以恢复到事务开始前的状态;
d、如果在上述事务简化过程的 1)~ 6)过程中系统崩溃了,由于修改后的数据并没有持久化到磁盘,所以这并不影响数据库中的数据,数据还是保持在事务开始前的状态。

上述事务简化过程中存在一个缺陷:每个事务提交前都要将数据和Undo log写入磁盘,这样会导致大量的磁盘IO,造成性能低下。
解决办法:如果能够将修改的数据缓存一段时间,就能减少磁盘IO以提高性能。但是这样会丧失事务的持久性。因此就有了另外的一种机制来实现数据的持久化,这就是InnoDB的Redo log。

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

7、引入了Redo log之后,现在InnoDB存储引擎是Undo log和Redo log协同合作,它们的事务简化过程为:
     假设有A、B两个数据,A=1、B=2
1)事务开始;
2)记录A=1到undo log;
3)修改A=3;
4)记录A=3到redo log;
5)记录B=2到undo log;
6)修改B=4;
7)记录B=4到redo log;
8)将redo log写入磁盘;
9)提交事务。

8、Undo log  +  Redo log事务的特点
1)、为了保证数据的持久性,必须在事务提交前将Redo log持久化到存储设备上;
2)、数据不需要在事务提交前写入磁盘,而是缓存在内存中;
3)、Redo log写入到了磁盘,故可以保证事务的持久性;
4)、Undo log用于错误回滚、保证事务的原子性;
5)、这里有一个隐含的点,就是数据是在事务提交后才写入持久存储设备上的,它是晚于Redo log写入存储设备的。如果数据早于Redo log写入存储设备,那么如果在数据写入存储的过程中发生了错误,Redo log就不能用于重做数据了。

理解数据库中的undo日志、redo日志、检查点相关推荐

  1. 关于undo和redo日志的区别

    一.undo和redo日志的区别 undo:撤销,也就是取消之前的操作 redo:重做,重新执行一遍之前的操作 二.什么是redo redo记录transaction logs,分为online和ar ...

  2. 认真学习MySQL的事务日志-Redo日志

    事务有4种特性:原子性.一致性.隔离性和持久性.那么事务的四种特性到底是基于什么机制实现呢? 事务的隔离性由锁机制执行. 事务的原子性.一致性和持久性由事务的redo日志和undo日志来保证. red ...

  3. 如何做CEdit中的Undo,Redo(和word类似的输入法输入一次为一个回退块)

    注:因为懒了,所以只将自己发的帖子的内容Copy出来了,没有整理(http://topic.csdn.net/u/20100816/15/6232364a-ebeb-4bf6-903c-1a3012c ...

  4. mysql 索引类型 bitmap_理解数据库中的常见索引类型

    在数据库中,索引能加快数据库的查询速度.下面就来理解一些常见的索引类型: B-Tree Bitmap Clustered Non-unique unique 索引有很多种类型,可以为不同的场景提供更好 ...

  5. 深入理解数据库中的各种连接

    按照我的理解,我将数据库中的连接分类为广义内连接和外连接,如下图,稍后我将解释我为什么这么分. 1 广义内连接(交叉连接) 所有的广义内连接的核心和共同点是完全基于笛卡尔积原理的,两个表进行笛卡尔积运 ...

  6. 理解数据库中候选码,主码,外码,主属性,非主属性!

    候选码:如果一个关系中,若某一个属性组的值能唯一标识一个元组,而该属性组的子集不能,则称该属性组为候选码. 主码:如果候选码只有一个,那么这个就是候选码就是主码.如果候选码是多个,那就任意选择一个候选 ...

  7. redo日志的刷盘策略

    转载自:儒猿技术窝的从零开始带你成为MySQL实战优化高手专栏 我们想要提交一个事务了,此时就会根据一定的策略把redo日志从redo log buffer里刷入到磁盘文件里去. 此时这个策略是通过 ...

  8. 数据库中case when condition then else end的理解

    数据库中case when condition then else end的理解 数据库中根据不同的条件求数量或者是总数 select count(case when status=0 then 'd ...

  9. MySQL系列: undo和redo工作原理

    ACID 首先来讨论事务的四大特性ACID 原子性(Atomicity):事务作为一个整体来执行,要不都执行,要不都不执行 一致性(Consistency):事务必须保证数据库从一个一致状态转移到另一 ...

  10. 【DB笔试面试682】在Oracle中,Undo段中区3种状态分别是什么(Undo表空间系列)?...

    ♣ 题目 部分 在Oracle中,Undo段中区3种状态分别是什么? ♣ 答案部分 Undo信息存储在Undo段中,Undo段又存储在Undo表空间中.Undo表空间仅用于Undo段(在Undo表空间 ...

最新文章

  1. 机器学习数据拆分_解释了关键的机器学习概念-数据集拆分和随机森林
  2. 怎么学python-新手如何自学python课程?
  3. sql server监控
  4. SQLAlchemy简单操作
  5. 组件面板 html 页面,Html - Bootstrap Panel面板
  6. java不同网址提示过期_使用history.back()出现警告: 网页已过期的解决办法
  7. PHPUNIT 单元测试
  8. 建立远程桌面连接计算机无密码,win7远程桌面空密码的步骤_win7系统如何设置让远程桌面登录无需密码-win7之家...
  9. c语言在函数中只执行一次,请问大家,为什么我调用我定义的函数俩次,但是程序只执行一次...
  10. JavaScript:利用StringBuffer类提升+=拼接字符串效率
  11. win java_Win搭建JAVA环境
  12. linux设备模型之tty驱动架构分析,linux设备模型之uart驱动架构分析
  13. 2万亿市值公司的网络运营技术解密
  14. Xcode 高级调试技巧
  15. C/C++[入门最后两题]
  16. ASAP光学设计软件
  17. luogu 5561 [Celeste-B]Mirror Magic 后缀数组+RMQ+multiset
  18. 线性模型(Linear Model)
  19. ISO7816协议中psam卡片的延时单元etu
  20. 计算机中f4的应用,电脑键盘中功能区的F2键F4键如何使用 电脑键盘中功能区的F2键F4键怎么使用...

热门文章

  1. 爬虫之User-Agent
  2. 创建一个MDK工程模板
  3. SQL中的5种常用的聚集函数
  4. Windows下安装postgresql_psycopg2时出现 Unabled to find vcvarsall.bat 的解决办法
  5. Silverlight 2.0 RTW 正式版发布(附下载地址)
  6. 发布一个平滑进度条控件
  7. 083 conllections模块
  8. UVa 10061 - How many zero's and how many digits ?
  9. MySQL学习十四创建和操纵表
  10. 新人如何在职场中生存