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,磁盘上的数据就是不完整的

你可能感兴趣的:(oracle的redo和undo日志)