oracle的redo和undo日志

在oracle数据库中,执行数据修改时都会产生相应的日志信息,

undo日志:

undo日志用于存放数据被修改前的值,如果一个事务做回滚或某种原因执行失败了,需要根据undo日志中记录的原数据做数据恢复;

redo日志:

undo日志是保存数据修改前的值,redo日志可以理解为保存数据修改后的值,数据需要做修改时,需要将数据读到buffer pool中,然后在buffer pool中做修改。写到redo日志中去,此时数据时没有持久化到数据库文件中去的,如果此时发生异常中断,或数据丢失,可以根据redo中记录的修改后的数据做数据恢复,持久化到数据库文件中去。


undo日志在保存原数据时会被分配数据块,在修改做回滚操作之后,undo被分配的数据块还是存在的,所以会有可能存在一些经常做新增删除的表数据量不多的情况下查询异常的慢,这是由于每次全表查询会去扫描之前undo保存原数据的数据块;


undo和redo日志不一定同时存在,和数据库的策略有关,steal、no steal、force、no force策略分别和这两个日志有关;

steal:允许在事务commit之前把内存中的数据写入磁盘。此时需要undo ,undo日志可以保证做数据回滚能恢复原数据;

no steal:不允许在事务commit之前把内存中的数据写入磁盘,在commit之前数据并未写入到磁盘,此时数据文件中的数据还是原数据,数据回滚不需要undo日志来恢复原数据;

force:内存中的数据最晚在commit的时候写入磁盘。不需要redo ,

no force:内存中的数据可以一直保留,在commit之后过一段时间再写入磁盘。此时需要redo,因为数据在系统崩溃的时候可能还没写入到磁盘,如果不redo,磁盘上的数据就是不完整的

©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • --- layout: post title: "如果有人问你关系型数据库的原理,叫他看这篇文章(转)" date...
    蓝坠星阅读 826评论 0 3
  • 我们都知道事务有4种特性:原子性、一致性、隔离性和持久性,在事务中的操作,要么全部执行,要么全部不做,这就是事务的...
    pjmike阅读 31,968评论 5 36
  • 本文是介绍MySQL数据库InnoDB存储引擎重做日志漫游 00 – Undo Log Undo Log 是为了实...
    胖虎大哥阅读 2,307评论 1 3
  • 事务隔离 ITL ITL: Interested Transaction List,也叫事务槽,它位于BLOCK ...
    eric_gao阅读 994评论 0 0
  • 7.1 认识事务7.1.1 概述事务可由一条非常简单的SQL语句组成,也可以由一组复杂的SQL语句组成。事务是访问...
    正在加载更多阅读 516评论 0 0