在oracle当中,事务对数据库所做的修改以重做记录的形式保存在重做日志缓存中。
在事务提交时,由LGWR进程将缓存中该事物相关的重做记录全部写入重做日志文件。
这时,事务认为已经成功提交,这种机制称为‘快速提交’
重做日志具有以下特征
a.记录对数据所做的更改
b.提供恢复机制
c.可以划分成组
d.至少需要两个组
日志组(redo log group)是一组相同的重做日志文件副本。组内的不同日志成员互为镜像,即每个成员都有相同的日志序列号和同样的大小。
当前日志序列号存储在控制文件和所有数据文件的头部。
查询当前数据库重做日志文件的位置和名称
select * from v$logfile;
LGWR在以下情况写入
a.当食物提交时
b.当重做日志缓冲区被写满三分之一时
c.当重做日志缓冲区内的已更改记录超过1m时
d.每隔3秒
e.在dbwn将数据库缓冲区将data buffer cache中的块写入数据文件之前
redo log file是以循环方式使用的。每个日志组用一个递增日志序列号来标识,每次重新使用日志时就会覆盖原来的序列号。
LGWR按顺序向联机重做日志组写入重做信息。一旦当前日志组被写满,LGWR就开始写入下一个组。
这成为日志切换(log swtch).日志切换的过程,oracle完成以下任务
a.日志序列号自动加1,并且将日志序列号联通scn信息写入到控制文件的日志历史记录中。
b.促使ckpt进程发生检查点,从而使得后台进程ckpt将检查点时刻的scn信息写入到控制文件
和数据文件头部,并促使dbwn将data buffer cache中的脏缓冲区写入到数据文件。
c.当数据库处于archivelog模式时,日志切换回促使arcn进程开始归档
除了日志自动切换外,在一些特定情况下,dba还可以强制系统进行日志切换,需要具有alter system权限
alter system awtch logfile
一般用于当日志组很大,需要很长时间才能写满的情况
查看日志状态
select group#,sequence#,members,status from v$log;
简要描述一下实例恢复。假定当前日志序列号为56,先前检查点时的scn号为3456231,并且
该scn好记录到了控制文件和数据文件头部,这时执行事务变化,并提交了事务,scn值变为了
3456239,如果此时系统断电,因为并未发生检查点操作,控制文件和数据文件头部的scn仍未3456231,而
重做日志文件为3456239,因为数据文件控制文件和日志文件的scn号不一致,在实例重启时会进行实例恢复
此时smon会将自动执行从3456321至3456239之间所有的事务变化。
1.3.1 生成检查点
checkpoint是一个数据库事件,他会同步所有数据文件,控制文件和重做日志文件。当ckpt发出检查点时
会执行以下两个任务
a.ckpt修改控制文件和数据文件头部,将当前最新的scn信息写入到这两种文件,从而使数据文件,控制文件和日志文件处于
一致状态,对于三者的状态有以下三种情况
*三种文件当前scn完全一致,无需恢复
*数据文件和控制文件一致但小于日志文件,需要实例恢复
*数据文件和控制文件scn不一致,则表示数据文件或控制文件存在损坏,需要介质恢复
b.促使dbwn开始工作,并将数据库dirty buffer写入到数据文件
检查点发生在一下情况
*每次日志切换
*使用normal,transational,immeidate选项关闭实例
*通过设置初始化参数fast_start_mttr_target强制执行
*dba通过手工请求
*alter tablespace [offline normal|read only|begin backup 对特定数据文件执行检查点操作
1.3.2 强制检查点
为了降低实例恢复时间,必须要增加检查点次数
a.设置 fast_start_mttr_target,比如设置为300,则代表数据库需要实例恢复的时候,恢复的时间不能超过300秒
系统会根据300秒时间自动计算可以保留的脏块数目,如果超过则自动发出检查点操作
b.alter system checkpoint
手工执行
关于日志组过大或者切换时间过长的时候,如果当前日志组记录了90m的事务更改,此时突然断电,实例恢复时就需要
使用这90m文件进行恢复,需要较长的时间,所以应合理的设置日志组的大小和日志切换的时间周期