重做日志( Redo Log)用于记录数据库变化,当执行DML或DDL操作时,oracle会将数据库变化信息记载到重做日志中.oracle使用重做日志的目的是在出现例程失败或介质失败时实现例程恢复和介质恢复.
重做日志组(Redo Log Group)和重做日志成员(Redo Log Member)
日志组由一组完全相同的重做日志文件组成,每个日志组至少要包含一个重做日志文件.如果一个日志组包含多个重做日志文件,后台进程LGWR会将相同的事务变化写入到同一个日志组的各个重做日志文件中.日志组中的每个重做日志文件都被称为日志成员.同一个日志组的所有日志具有相同的日志序列号和尺寸.
当执行事务操作(DML或DDL)时,服务器进程首先将事务变化写入到重做日志缓冲区,并且后台进程LGWR最终会将重做记录写入到重做日志文件,后台进程LGWR在以下情况下开始工作
提交事务(COMMIT)
每隔三秒钟
当重做信息超过1M时,
重做日志缓冲区已有三分之一填满.
在DBWR进程将脏缓冲区写入到数据文件之前.
SCN(System Change Number)
SCN是标识数据库变化的唯一标识号,其数据顺序递增.执行事务操作(DDL或DML)时,系统会为每个事务变化生成相应的SCN
日志序列号
日志序列号是重做日志的使用标识号,其数值也是顺序递增的.当进行日志切换是,日志序列号会自动增一,并将该信息写入到控制文件中,
重做线程(Redo Thread)
重做线程有一组相关的重做日志组成.对于单例程数据库来说,只有一个重做线程.而对于RAC(Real Application Cluster)来说,多个例程会同时访问数据库,并且每个例程都有独立的重做线程(重做线程与例程一一对应).
日志切换是指后台进程LGWR停止写一个日志组,并开始写另一个日志组的事件,日志切换包括自动日志切换和手工日志切换两种方式.默认情况下,当日志写满后,后台进程LGWR会自动进行日志切换.
进行日志切换时,oracle会完成以下任务.
促使后台进程CKPT发出检查点,从而使后台进程CKPT将检查点时刻SCN信息写入到控制文件和数据文件头部,并促使后台进程DBWR将脏缓冲区写入到数据文件.
当数据库处于ARCHIVELOG模式时,日志切换促使后台进程ARCH将日志组内容保存到归档日志.
检查点(Checkpoint)是一个数据库事件,它用于同步数据库的所有数据文件,控制文件和重做日志.当发出检查点是, 后台进程CKPT将检查点时刻SCN信息写入到控制文件和数据文件头部,并促使后台进程DBWR将脏缓冲区写入到数据文件.当oracle发出检查点时,后台进程CKPT促使后台进程DBWR开始工作,而后台进程DBWR又促使后台进程LGWR开始工作.因为当发出检查点时CKPT,DBWR,LGWR同时工作,所有数据文件,控制文件和重做日志的SCN完全一致,从而使得三种数据库文件保持完全同步.
需要注意,当执行COMMIT操作时,只有后台进程LGWR会将事务变化写入到重做日志,后台进程DBWR只有在检查点时刻才会将脏缓冲区数据写入到数据文件.出现以下情况时后台进程CKPT会发出检查点.
日志切换.
关闭数据库.(SHUTDOWN ABORT不会)
手工检查点.(ALTER SYSTEM CHECKPOINT)
通过设置初始化参数FAST_START_MTTR_TARGET控制检查点,该初始化参数用于指定例程恢复的最大时间(单位:秒).设置了FAST_START_MTTR_TARGET参数后,oracle会根据该参数自动调节检查点.
例程恢复
例程恢复是指当出现例程失败时由后台进程SMON自动同步数据文件,控制文件和重做日志并打开数据库的过程.
例程恢复的具体步骤如下:
1确定不同步的物理文件.通过比较数据文件,控制文件和重做日志的SCN,后台进程SMON可以确定那些文件处于不同步的状态.
2,REDO.确定了不同步的数据文件后,SMON会重新应用那些在数据文件上未执行的事务操作,并且DBWR会将提交和未提交的数据写入到数据文件以及UNDO段上.
3,REDO之后会打开数据库,此时客户应用可以访问数据库.
4,UNDO.在第二步之后,数据文件既包含被提交的数据,也包含未被提交的数据.打开数据库后,SMON会自动使用UNDO段取消未被提交的数据.
如果增加了联机重做日志的大小,就可以为那些执行那个大型的UPDATE和INSERT以及DELTE的操作的批处理提供足够的空间.另外对于联机日志,最好的办法就是增加重做日志的数目.
v$history得到最近的100个日志交换记录,如果日志切换的过于频繁
select b.recid,a.recid,to_char(b.first_time,'yyyymmdd hh:mi:ss') start_time,
to_char(a.first_time,'yyyymmdd hh:mi:ss') end_time,
round((a.first_time - b.first_time)*24*60,2) minutes
from v$log_history a,v$log_history b
where a.recid = b.recid + 1
order by a.first_time asc;
通常半个小时切换一次.
来自 “ ITPUB博客 ” ,链接:http://blog.itpub.net/22861158/viewspace-675232/,如需转载,请注明出处,否则将追究法律责任。
转载于:http://blog.itpub.net/22861158/viewspace-675232/