oracle重做日志文件详细 redo log file
1 redo log file的作用
?redo log file记录了对数据库的所有修改信息。有了这些修改信息,我们就可以用于恢复数据。如果数据库所在主机突然断电,导致实例失败,通电启动后oracle会使用在线重做日志将系统恢复到断电前的那个时刻。如果包含数据文件的磁盘驱动器出现了永久性故障,oracle会使用归档重做日志以及在线重做日志,将磁盘驱动器的备份恢复到适当的时间点。另外,如果你“无意地”删除了一个表,或者删掉了一些重要的信息,而且提交了操作,则可以恢复一个备份,并让oracle使用这些在线和归档重做日志文件将其恢复到意外发生前的那个时刻。
?前面提到了两种类型的重做日志文件:在线(online)和归档(archived)。下面进行介绍。
2 在线重做日志
?每个oracle数据库都至少有两个在线重做日志文件组。每个重做日志组都包含一个或多个重做日志成员,组里的重做文件成员之间是镜像关系,也就是内容是一样的,不过所在磁盘位置不一样。oracle循环使用在线重做日志文件组,假设有3个重做日志文件组,oracle会先往重做日志文件组1写,写满后会切换至重做日志文件组2。同样,重做日志文件组2写满后切换至组3。组3也写满后会切换回组1。
?从重做日志文件组1切换至组2时,oracle会启动一个检查点。此时,dbwr开始将重做日志组1所保护的所有脏块写至磁盘。在dbwr完成此操作之前,oracle不能重用组1。若在dbwr完成此操作之前企图使用组1,会在alert日志中得到以下消息:
?当这个消息出现时,数据库中的处理会挂起,因为oracle会尽可能地把所有处理能力交给dbwr,希望它能更快完成。出现这个消息说明在线重做日志文件组不够多,我们就需要分配足够多的在线重做日志组。
?在线重做日志文件组的大小和数量多少才合适,可以从以下几个方面考虑
- 重做日志文件大小会影响恢复所需的时间,大致是正比关系。
- 高峰负载:确定高峰时段一小时能产生的在线重做日志大小。
- 大量用户修改相同的块:你可能希望重做日志文件很大,因为大量用户在修改相同的块,最好尽可能多地更新之后才将其写入到磁盘。每个日志切换都会导致一个检查点,所以你可能不希望频繁地切换日志。不过,这样一来会影响恢复时间。
- 所能允许的恢复时间是多少。
3 归档重做日志
?oracle数据库可以采用两种模式运行:ARCHIVELOG 模式和 NOARCHIVELOG 模式。在ARCHIVELOG模式下,当某一重做日志文件组被填满时,ARCH进程会另一个位置保存这个重做日志文件的一个副本,也可以在本地或远程位置上建立多个另外的副本。如果磁盘驱动器损坏,就可以用这些归档重做日志文件来执行介质恢复。
?让我们来品味一个问题:假设你每周的星期六做一次备份。现在是星期五下午,已经生成了这一周的数百个重做日志,突然你的磁盘出问题了。在ARCHIVELOG模式,你会如何行动?NOARCHIVELOG模式呢?ARCHIVELOG模式下,我们有上个星期六备份和保存在另外一个磁盘上的归档重做日志文件,在上个星期六备份的基础上,通过快进重放归档重做日志和在线重做日志文件使系统恢复。NOARCHIVELOG模式下,存放在损坏的磁盘上的重做日志文件丢失了,这些数据没办法恢复,只能删除相关的表空间或者恢复到上个星期六,但是两种都意味着数据丢失。
4 断电的情况
update语句的执行过程:
1)读取相关数据到数据库缓冲区缓存(database buffer cache)
2)记录修改信息到redo log buffer
3)修改database buffer cache中的数据
执行commit时,将redo log buffer的内容写入到redo log file。当日志切换时,将database buffer cache的数据写入到磁盘。
让我们来分析以下情况
4.1 在commit之后,断电
这种情况,database buffer cache的数据没有写入磁盘,但redo log buffer的数据写入了磁盘。我们可以从过重做日志文件恢复到断电的那个时间点。
4.2 在commit之前,断电
这种情况,database buffer cache的数据没有写入磁盘,redo log buffer的数据也没写入了磁盘。因为没有commit,所以这些数据是可以丢失的,不用管。
5 记redo日志的执行过程
1)数据被读入到db buffer后,请求redo log buffer的锁存器,加锁成功后,服务器进程将sql语句锁影响的那些db buffer中的行数据的rowid、要更新的原值、新值及scn等信息逐条写入redo log buffer中;
2)当写入redo log buffer时出现以下任一情况,都会触发lgwr进程把redo log buffer的数据写入磁盘中的redo file文件中(这个时候会产生log file sync等待事件);
- redo log buffer大小的三分之一
- 写入量达到1M
- 超过三秒
- 发生检查点
- dbwr之前发生
3)redo log buffer的数据都被写入到redo file后,redo log buffer持有的锁存器会被释放。释放锁存器后redo log buffer被逻辑清空。逻辑清空状态下,原本的数据依然存在,当后面有新的数据要写入时会覆盖这些原有数据,我们就可以在逻辑上认为原本的数据不存在了,redo log buffer被清空了。
6 使用重做日志文件恢复
检查点之前的数据已被写入磁盘
1)找到最后一个检查点记录在重做日志文件中的地址,由该地址在日志文件中找到最后一个检查点记录。
2)由该检查点记录得到检查点建立时刻所有正在执行的事务清单ACTIVE-LIST,把ACTIVE-LIST暂时放入UNDO-LIST,REDO-LIST暂为空
3)从检查点开始正向扫描重做日志文件。如有新开始的事务Ti,把Ti暂时放入UNDO-LIST;如有提交的事务Tj,把Tj从UNDO-LIST移到REDO-LIST,直到日志文件结束。
4)对UNDO-LIST中的每个事务执行UNDO操作,对REDO-LIST中的每个事务执行REDO操作。
|