MySQL的redo log与undo log

 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就不能用于重做数据了。



转载自:http://blog.sina.com.cn/s/blog_a1e9c7910102uzk3.html

你可能感兴趣的:(log,redo,log和undo)