redo log & archive

在oracle当中,事务对数据库所做的修改以重做记录的形式保存在重做日志缓存中。

在事务提交时,由LGWR进程将缓存中该事物相关的重做记录全部写入重做日志文件。

这时,事务认为已经成功提交,这种机制称为‘快速提交


1.1.redo log结构

重做日志具有以下特征

a.记录对数据所做的更改

b.提供恢复机制

c.可以划分成组

d.至少需要两个组

日志组(redo log group)是一组相同的重做日志文件副本。组内的不同日志成员互为镜像,即每个成员都有相同的日志序列号和同样的大小。

当前日志序列号存储在控制文件和所有数据文件的头部

查询当前数据库重做日志文件的位置和名称

select * from v$logfile;

1.2.日志序列号

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;

1.3.检查点

简要描述一下实例恢复。假定当前日志序列号为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文件进行恢复,需要较长的时间,所以应合理的设置日志组的大小和日志切换的时间周期

你可能感兴趣的:(redo log & archive)