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操作。

oracle重做日志文件详细相关推荐

  1. 向oracle增加两个重做日志组文件,Oracle重做日志文件

    Oracle重做日志文件 原理:重做日志记录将以循环的方式在sga区的重做日志高速缓冲区中进行缓存,并由后台进程LGWR写入到重做日志文件中. 重做日志文件记录了对数据文件的修改操作,还记录了对回滚段 ...

  2. oracle重做日志论文,Oracle重做日志文件相关概念

    重做日志文件(redo log file)对于Oracle数据库至关重要.它们是数据库的事务日志.通常只用于恢复,不过也可以用于以下工作: q 系统崩溃后的实例恢复 q 通过备份恢复数据文件之后恢复介 ...

  3. oracle 重做日志内容,oracle重做日志文件

    以下易容翻译自oracle dba官方文档,不足之处还望指出. 管理重做日志文件 学习目标: 1.解释重做日志文件的目的 2.描述重做日志文件的结构 3.学会控制日志切换与检查点 4.多元化管理重做日 ...

  4. oracle重做日志文件重命名,初识Oracle重做日志文件

    重做日志文件通过记录数据的所有改变情况对系统或介质故障提供恢复机制.1)重做日志文件以组的形式存在2)一个oracle数据库至少 以下易容翻译自Oracle dba官方文档,不足之处还望指出. 管理重 ...

  5. oracle 重做日志内容,Oracle重做日志文件基础

    本文以下所述内容是根据对"Oracle Database Administrator's Guide 11g Release 2 (11.2)" -- " 管理redo ...

  6. oracle重做日志文件归档是什么意思?

    oracle每有一个事务,首先会产生一条日志,这个日志里面包含了能够还原这个事务的最少信息,这些日志会暂存在内存中,再由一个叫LGWR的进程将日志缓冲区的日志写到硬盘上的日志文件上,这些日志文件一般在 ...

  7. oracle重做日志文件

    概述 重做日志文件记录数据所有的修改信息并提供一种数据库失败时的恢复机制. 重做日志文件分组管理 一个oracle数据库要求至少有两组重做日志文件 组中每个日志文件被称作一个组成员 重做日志文件工作模 ...

  8. oracle日志版本不同,Oracle重做日志文件版本不一致问题处理

    早上在启动测试数据库时,发现如下问题:数据库版本是11.2.0.3SQLgt; startupOracle instance started. Total System Global Ar 早上在启动 ...

  9. oracle重做日志文件版本不一致问题处理

    早上在启动测试数据库时,发现如下问题: 数据库版本是11.2.0.3 SQL> startup ORACLE instance started. Total System Global Area ...

最新文章

  1. threadlocal内存泄露_ThreadLocal原理解析
  2. Hadoop MapReduce手机上网流量统计代码示例及运行结果演示
  3. 如何提升业务稳定性?
  4. Linux---cacti安装后不出图
  5. java system.in 输入不回显_Java安全之URLDNS链
  6. java怎么设置背景_如何在Java中设置背景图片?
  7. 创建链表和遍历链表算法演示
  8. pom.xml文件第一行报错_Python文件读写指南
  9. (办公)eclipse连接github cannot open git-upload-pack(git-receive-pack)
  10. java读取clob字段的几种方法(转)
  11. 哪些SQL语句会引起全表扫描
  12. Internet流量监管机制之漏桶算法和令牌桶算法
  13. 详解卷积神经网络(CNN)在语音识别中的应用
  14. MNI模板和Talairach模板的区别
  15. bp神经网络和cnn神经网络,bp神经网络和神经网络
  16. 建模助手 | 关于REVIT的小技巧,你知道多少?
  17. 助力丽水市周安村“数字乡村”建设 ,复杂美区块链赋能农产品溯源营销
  18. 字段是否包含中文、英文、数字
  19. Camera和Image sensor技术基础笔记(4) -- 白平衡White Balance
  20. 教你如何升级app适配iOS 7

热门文章

  1. CODE[VS] 2291 糖果堆
  2. 文件上传、分片上传(react)
  3. 基于QtAV的简易播放器(开源)
  4. 车厢调度(判断是否为合法的出栈序列)
  5. 访问服务器sqlserver数据库文件夹,服务器的sql数据库在哪个文件夹
  6. Win10安装nginx笔记
  7. 手机屏幕 高宽有哪些_手机新屏幕比18:9高宽到底好在哪里
  8. 关于es6新特性的总结
  9. mastercam9.1标注尺寸点不到屏幕上 跟着鼠标动 确定不了
  10. position: absolute 与 transform 来居中块级元素的问题