Oracle经过Redo来保证数据库的事务能够被重演,从而使得在故障以后,数据能够被恢复。Redo对于Oracle数据库来讲相当重要。java
在数据库中,Redo的功能主要经过3个组件来实现:Redo Log Buffer、LGWR后台进程和Redo Log File(在归档模式下,Redo Log File最终会写出为归档日志文件)。数据库
在Oracle的SGA中,存在一块共享内存,称为Redo Log Buffer,如图6-1所示。
性能
图6-1 Oracle Instance.net
Redo Log Buffer位于SGA之中,是一块循环使用的内存区域,其中保存数据库变动的相关信息。这些信息以重作条目(Redo Entries)形式存储(Redo Entries也常常被称为Redo Records)。Redo Entries包含重构、重作数据库变动的重要信息,这些变动包括INSERT、UPDATE、DELETE、CREATE、ALTER或者DROP等。在必要的时候Redo Entries被用于数据库恢复。日志
Redo Entries的内容被Oracle数据库进程从用户的内存空间复制到SGA中的Redo Log Buffer之中。Redo Entries在内存中占用连续的顺序空间,因为Redo Log Buffer是循环使用的,Oracle经过一个后台进程LGWR不断地把Redo Log Buffer的内容写出到Redo Log File中。 htm
当用户在Buffer Cache中修改数据时,Oracle并不会当即将修改数据写出到数据文件上,由于那样作效率会很低,到目前为止,计算机系统中最繁忙的部分是磁盘的I/O操做,Oracle这样作的目的是为了减小IO的次数,当修改过的数据达到必定数量以后,能够进行高效地批量写出。blog
大部分传统数据库(固然包括Oracle)在处理数据修改时都遵循no-force-at-commit策略。也就是说,在提交时并不强制写。那么为了保证数据在数据库发生故障时(例如断电)能够恢复,Oracle引入了Redo机制,经过连续的、顺序的日志条目的写出将随机的、分散的数据块的写出推延。这个推延使得数据的写出能够得到批量效应的性能提高。进程
同Redo Log Buffer相似,Redo Log File也是循环使用的,Oracle容许使用最少两个日志组。缺省状况下,数据库建立时会创建3个日志组。事件
SQL> select group#,members,status from v$log;
GROUP# MEMBERS STATUS
---------- ---------- ----------------
1 1 INACTIVE
2 1 CURRENT
3 1 INACTIVE
当一个日志文件写满以后,会切换到另一个日志文件,这个切换过程称为Log Switch。Log Switch会触发一个检查点,促使DBWR进程将写满的日志文件保护的变动数据写回到数据库。在检查点完成以前,日志文件是不可以被重用的。
因为Redo机制对于数据的保护,当数据库发生故障时,Oracle就能够经过Redo重演进行数据恢复。那么一个很是重要的问题是,恢复应该从何处开始呢?
若是读取的Redo过多,那么必然致使恢复的时间过长,在生产环境中,咱们必需保证恢复时间要尽可能得短。Oracle经过检查点(Checkpoint)来缩减恢复时间。回顾一下第1章中所提到的内容:检查点只是一个数据库事件,它存在的根本意义在于减小恢复时间。
当检查点发生时(此时的SCN被称为Checkpoint SCN)Oracle会通知DBWR进程,把修改过的数据,也就是此Checkpoint SCN以前的脏数据(Dirty Buffer)从Buffer Cache写入磁盘,在检查点完成后CKPT进程会相应地更新控制文件和数据文件头,记录检查点信息,标识变动。
在检查点完成以后,此检查点以前修改过的数据都已经写回磁盘,重作日志文件中的相应重作记录对于崩溃/实例恢复再也不有用。若是此后数据库崩溃,那么恢复只须要从最后一次完成的检查点开始恢复便可。若是数据库运行在归档模式(全部生产数据库,都建议运行在归档模式),日志文件在重用以前必须写出到归档日志文件,归档日志在介质恢复时能够用来恢复数据库故障。