redo log的文件有redo records组成,一个redo record由一组change vectors组成。改变向量描述了单个块的改变。redo record记录的数据可以用来重建所有数据库的改变。包含undo段。因此redo log也包含回滚段。当你recover数据库的时候,数据库读取redo信息并应用到相应的数据块上。每次事务提交的时候,lgwr把log buffer中的red records写到log file中,并分配一个scn来标识redo records。只有所有的redo records写到磁盘中用户才会被告知事务已经提交了。
改变向量中包含的信息:
1块修改前的版本号
2操作编码
3改变的值
redo records:描述了一个物理一致性的改变,按scn排序,rba标识
active(current)and inactive redo log file
oracle在写入redo buffer的时候只会使用一个log file,lgwr正在写入的redo log就是current logfile;需要被实例用来recovery的redo log就叫active redo log。redolog不在被实例恢复需要的就叫inactive redo log.
如果启用了归档,数据库直到归档了active的内容后,才可以重用这个redo log,如果没有启用归档,那么最后一个redo log写满后,lgwr会覆盖第一个active文件。
每次发生switch的时候,oracle给redo log file分配一个新的log sequence number。每个在线或活动的redo log 通过log sequence number来标识。在实例恢复期间,数据库按sequence number来降序的应用redo log。
清空redo log file
一个redo log file在数据库打开的时候可能损坏了,因为归档不能继续,可能要停止数据库。在这种情况下,使用alter database clear logfile来重新初始化文件,不用关闭数据库。
alter database clear logfile group 3;
这个语句清空了日志组3中的log file。但是在下面的情况下,会遇到问题:
1如果仅有2个日志组
2损坏的日志是当前日志组。
如果损坏的日志还没有被归档,使用带有unarchived关键字
alter database clear unarchived logfile group 3;这个语句清空了损坏的日志文件,避免归档他们。被清理的redo文件即使他们没有归档也是可用的。如果你清理了一个恢复时候需要的log file,那么你就无法恢复了。数据库会写个alert信息。
*****************************
块版本
当块改变的时候,基本的思路是在改变时候的scn记录到块头,但因为在同一个scn可能会有很多的改变在同一个块上,所以在块头也要存储一个序列号,来标识同一scn时候的不同改变。当scn改变的时候,序列号也被重置为1.