重做redo 撤销undo是ORACLE的重要特性,用认保证事务的可恢复性和可回退性。

REDO用来保证数据库的事务可以被重演,使得故障后,数据可以被恢复

1.REDO功能通过三个组件实现:

redolog buffer ,位于SGA中,是一块循环使用的内存区域,保存数据库变更的相关信息并以重做条目redoentries形式存储,包括INSERT,UPDATA,DELETE,CREATE,ALTER,DROP等。

LGWR后台进程,通过此进程把redo logbuffer的内容不断写出到redo log file中。

redolog file(在归档模式下被ARC n最终写入归档日志)。最少两组重做日志,每组最少一个成员默认三组

REDO机制通过将连续的顺序的日志条目的写出将随机的分散的数据块写出推迟,使得数据的写出可以获得批量写出的性能提升。

REOD涉及视图有:v$database  v$datafile   v$logfile   v$log  v$thread  v$log_history  v$archived_log   v$backup        x$kglob 检查点

2.redo log file

最少两组重做日志,每组最少一个成员,默认三组。

当一组日志写满,会切换到另一组日志文件,称为log switch。此时会触发一个检查点,称为checkpoint scn,会促使DBWR将写满日志文件所保护的变更数据(即此checkpoint scn之前的脏数据dirty buffer)从buffer cache写回到数据库。检查点完成后,CKPT进程 会相应更新控制文件和数据文件头,记录检查点信息,标识变更。检查点完成前,日志文件不能被重用。

从上述可以得出:检查点完成后,检查点前修改过的数据已经写回磁盘,重做日志文件中相应重做记录对于实例恢复不再有用。如此后数据库崩溃,那么恢复只需要从最后一次完成的检查点开始恢复即可。

重做日志文件在重用前必须写出到归档日志文件,归档日志在介质恢复时可以用来恢复数据库故障。


 3.Redo的内容

ORACLE通过REDO实现提交,一方面是因为redo log file可以连续、顺序快速写出,另一方面也和REDO记录的简单内容有关。

改变向量change vector ,改变向量表示对数据库内某一个数据库所做一次变更,包含变更数据库版本号,事务操作代码,变更从属数据块地址以及更新后的数据。

重做记录 redo record  重做记录通常由一组改变向量组成,是一个改变向量的集合,代表一个数据库变更(insert update delete等)构成数据库变更的最小恢复单位,

Setautotrace trace stat 使用此跟踪语句后,在执行特定DML语句时,ORACLE会显示该语句产生REDO数量的统计信息,单位bytes

查询全局REDO的生成量-自实例启动以来累计生成量 select name,value from v$sysstat where ename=’redo size’;


4.REDO写的触发条件-即LGWR触发条件

3秒超时,LGWR处于空闲状态时,依赖于rdbms ipc message等待,处于休眠状态,直到3秒超时时间到,如果LGWR发现有REDO需要写出,那么LGWR将执行写出操作,log file parallel write等待事件将会出现。

REDO log buffer  三分之一满,或者redolog buffer具有1MB的脏数据。

缺省值log_io_size等于1/3log buffer 大小,即达到1/3时也刚好1M,会触发LGWR。LOG BUFFER设置为3M

用户提交:当一个事务提交时,在redo stream中将记录一个提交标志。在redo被写到磁盘之前,这个事务是不可恢复,所以事务返回成功标志给用户前,需要等待LGWR写完成,进程通知LGWR写,并以log file sync事件开始休眠,超时时间1秒。

5.Commit

提交完成,意味着ORACLE已经将此时间点之前的RREDO写入了重做日志文件,这个日志写完成后,ORACLE可以释放用户去执行其它任务。此后数据库崩溃,那么 ORACLE可以从重做日志文件中恢复迷些提交过的数据,保证提交成功的数据不会丢失。


6.日志的状态  v$log视图

共有三个日志组,组号1.2.3 序列号 8.9.10,序列号是惟一的且连续的。每个组中一个成员,大小是50M。当前正在使用第一组,数据库运行在非归档模式。

STATUS有四个状态 ,CURRENT正在使用。UNUSED从来未被写过,重做日志刚被添加到数据库中的状态 。

INACTIVE,实例恢复已经不需要这组联机重做日志组。ACTIVE,活动组但不是当前组,实例恢复时需要这组,比如这组日志正在归档。

REDO LOG的状态--“Active”,“Inactive”引自VAGE:

归档和“Active”,“Inactive”状态没有关系。
这两个状态,代表日志中的Redo Recorder对应的脏块是否写到磁盘数据文件中,和Redo文件本身的完整性没有关系。
无论“Active”,还是“Inactive”,都可以归档。
一发生日志切换,马上就开始归档。

见帖子:http://www.itpub.net/thread-1756681-1-1.html


通过V$LOG ,V$LOGFILE 数据字典 获取重做日志信息

查看日志文件组、成员数,大小,是否归档。

SQL>select group#,sequence#,members,bytes/1024/1024 M,status,archived from v$log;

    GROUP# SEQUENCE#    MEMBERS          M STATUS           ARC

-------------------- ---------- ---------- ---------------- ---

         1         10          1         50 CURRENT          NO

         2          8          1         50 INACTIVE         NO

         3          9          1         50 INACTIVE         NO

查看重做日志位置。STATUS列空白是文件正在使用。STALE文件内容是不完全。INVALID,文件不可以被访问。DELETED文件无用了。

查看操作系统BLOCK大小select max(lebsz) from x$kccle;


7.热备份期间产生的REDO比正常的多?

是因为SPLIT BLOCK问题,需要在日志文件中记录修改的行所在的数据块前镜像image。

如果使用RMAN备份,因RMAN可以通过反复读取获得一致的BLOCK,从而避免SPLIT BLOCK生成,不会产生额外的REDO。

8.能否不生成redo?

正常数据库必须生成REDO,这是数据库的机制。否则数据库遇到故障或CRASH时无法恢复。

不过允许使用NOLOGGING子句,可以使得日志生成大幅降低,必要日志还会被记录。如数据字典的修改。

创建或重建索引时会使用到NOLOGGING