Redo
Redo:redo log file,即重做日志文件,用于恢复数据,是恢复实例失败后的数据。redo是指在失败时重放事务。oracle数据库维护着两类重做日志文件,在线(online)重做日志文件和归档(archive)重做日志文件,这两类重做日志文件都用于恢复,其主要目的就是万一示例失败或介质失败,它们能够恢复数据。
undo
Undo: 用于回滚事务,即将数据回滚到对该数据进行操作之前的样子,其实际作用就是取消一条语句或一组语句。在对数据库数据进行修改时,数据库会生成undo信息,以防事务或语句执行失败时,数据还能恢复到修改之前的样子,或者在执行rollback语句时可以回滚数据。但是要注意的是undo只是让数据库逻辑地恢复到原来的样子,其数据结构以及数据库块本身在回滚后可能大不相同。
示例:
当update一条数据,未提交时就断电了,等数据库重新启动时,数据库会利用undo信息回滚数据,将数据回滚到未修改时的状态,然后就不会再执行update了。
而当uodate一条数据,commit了后,但是数据还在内存中没有写入到文件中,此时断电,当数据库重启时数据库会先回滚数据到原来的样子,然后再执行update,将数据写入到文件中。
注意:oracle中redo信息包含undo。
oracle数据库事务中的数据变化写入数据文件步骤:
- 事务开始;
- 在buffer cache 中找到需要的数据块,如果没有找到,则从数据文件中载入到buffer cache中;
- 事务修改buffer cache中的数据块,该数据被标识为脏数据,并被写入log buffer中;
- 事务提交,LGWR进程将log buffer中的脏数据写入到redo log file中;
- 当发生checkpoint,checkpoint进程更新所有数据文件中的文件头信息,DBWR进程则负责将buffer cache中的脏数据写入到数据文件中。