write-ahead log

重做日志:每当有操作执行前,将数据真正更改时,先前相关操作写入重做日志。这样当断电,或者一些意外,导致后续任务无法完成时,系统恢复后,可以继续完成这些更改
撤消日志:当一些更改在执行一半时,发生意外,而无法完成,则可以根据撤消日志恢复到更改之前的壮态

有两个概念:前滚与回退  
比如某一时刻数据库DOWN机了,有两个事务,一个事务已经提交,另一个事务正在处理。数据库重启的时候就要根据日志进行前滚及回退,把已提交事务的更改写到数据文件,未提交事务的更改恢复到事务开始前的状态。 

redo和undo
redo->记录所有操作,用于恢复(redo records all the database transaction used for recovery)   
undo->记录所有的前印象,用于回滚(undo is used to store uncommited data infor used for rollback)  
redo->已递交的事务,实例恢复时要写到数据文件去的
undo->未递交的事务 
redo的原因是:每次commit时,将数据的修改立即写到online redo中,但是并不一定同时将该数据的修改写到数据文件中。因为该数据已经提交,但是只存在联机日志文件中,所以在恢复时需要将数据从联机日志文件中找出来,重新应用一下,使已经更改数据在数据文件中也改过来。
undo的原因是:在oracle正常运行时,为了提高效率,假如用户还没有commit,但是空闲内存不多时,会由DBWR进程将脏块写入到数据文件中,以便腾出宝贵的内存供其它进程使用。这就是需要UNDO的原因。因为还没有发出commit语句,但是oracle的dbwr进程已经将没有提交的数据写到数据文件中去了。

write-ahead logging(WAL)预写式日志
  预写式日志(WAL) 是一种实现事务日志的标准方法,很多主流的数据库都是用的这种方法。简言之,WAL 就是对硬盘上的数据文件(表和索引)的修改必须只能在这些修改已经记录了日志之后,即在这些新的日志记录到存储器(硬盘)之后。 这样的话我们就不需要在每次事务提交的时候都把数据页记录到磁盘。
这样的方法能使局部的顺序I/O(根据日志顺序地对各个表各个区域进行I/O)取代全局的随机I/O(大量并发的I/O不是针对同一区域同一表的)。因为我们知道在出现崩溃的情况下, 我们可以用日志来恢复数据库:任何尚未附加到数据页的记录都将先从日志记录中重做(这叫向前滚动恢复,也叫做 REDO)。


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