数据库最基础的操作就是以原子的方式修改数据块。前台进程想修改一个或几个数据块时,首先得获取对数据缓冲区中包含该块的缓存的

重做日志描述了对数据块的所有变更。这一节主要描述数据库打开的时候写日志时的一些操作。

系列文章:Oracle恢复内部原理?where=nkey&keyword=19824

3.1 原子修改

数据库最基础的操作就是以原子的方式修改数据块。前台进程想修改一个或几个数据块时,首先得获取对数据缓冲区中包含该块的缓存的一个排它访问权限。然后构建改变向量。重做日志缓冲区中分配空间保存重做记录。重做缓冲区位于SGA中,LGWR进程定时将重做日志缓冲区中的重做记录写入到重做日志文件中以释放空间。当重做日志满了的时候,,LGWR就要做日志切换。注意在重做日志缓冲区中分配空间的同时也会在重做日志文件中分配空间。重做日志缓冲区空间分配后前台进程负责构建重做记录,此后才能修改数据缓冲区中的数据块。然后当重做日志缓冲区中的重做记录写到重做文件中才算数据库变更完成。恢复保证重做日志中记录的变更都会应用到数据文件中(除非是不完全恢复)。

3.2 写日志优先

写日志优先是一个缓冲区执行协议,用来协调写脏数据到数据文件中和写重做日志记录到重做日志文件的顺序。根据写日志优先协议,在DBWR进程将脏数据写入到数据文件中之前,LGWR进程必须先将对应的重做日志记录写入到重做日志文件中。

注意,写日志优先协议跟提交时写日志协议是独立的(见3.3)。

同时注意,写日志优先协议只适用于将那些在数据缓冲区中的脏数据写入到数据文件这种情形,不适用于直接路径写(如由直接路径读导致的)。

写日志优先协议保证了数据文件中没有一种变更在重做日志文件中没有记录,不惜以失败为代价。

写日志优先协议还保证了所有数据块都在先写完重做日志并保证能够回滚的情况下才写到磁盘的,使得如果提交失败的时候可以回滚所有修改。这里的重做信息其实就是回滚段的重做信息。

写优先协议在数据库事务层保证事务的原子性起了很大作用。

3.3 事务提交

事务提交时会分配一个SCN并且建立一个包含那个SCN提交的重做日志记录。当事务所有的重做记录(包括commit对应的重做记录)都写到磁盘上的重做日志文件中时,commit过程才算结束。因此commit会强制日志刷新到磁盘上——至少截止到commit的重做记录,这就是通常说的log- force-at-commit。

恢复就是设计成这样,在事务commit的时候只需刷新重做记录到重做日志,而不用刷新该事务修改的所有脏数据,为的是在即使失败的情况下也能保证事务持久性。这就是通常说的no-datablock-force-at-commit。

3.4 线程检查点事件

线程检查点事件发生时,会将该线程的重做记录中SCN小于指定值的重做记录保护的脏数据都刷新到数据文件中。完成后,该线程在控制文件中的线程检查点结构会被更新。

线程检查点事件开始时,首先是得到一个SCN,初始化一个检查点结构。然后该实例的数据缓冲区中所有脏数据都被打上做检查点的标识。DBWR分阶段将这些标识的脏数据写入到数据文件中。当所有脏数据都写入到数据文件中时,检查点结构中的SCN被更新为前面得到的SCN,然后用该检查点更新该线程在控制文件中的检查点记录。

一个线程检查点事件可能会或者不会推进数据库检查点。当只有一个打开的线程时,新的线程检查点也同时是新的数据库检查点。如果有多个打开的线程,并且当前线程就是数据库检查点所联机程,当前线程的检查点事件会推进数据库检查点。因为新的检查点SCN是最近分配的,很有可能比其他打开状态的线程的检查点SCN要大,数据库检查点SCN将推进到新的最小的线程检查点SCN。不过如果当前线程原有检查点不是数据库检查点,那么该线程的检查点事件不会推进数据库检查点。

数据库检查点推进时,每个数据文件头部的检查点计数也会增长。并且,每个数据文件只要不是在热备份中或者没有更高的检查点SCN(如新增的数据文件或者刚恢复的数据文件),数据文件头部的检查点都会推进到跟新的数据库检查点一致,数据文件头将写入磁盘。同时,数据文件在控制文件中的记录的检查点SCN也会更新为新的数据库检查点SCN。

本文原创发布php中文网,转载请注明出处,感谢您的尊重!

mysql 重做日志原理_Oracle恢复内部原理(重做日志)相关推荐

  1. oracle内部原理结构图,Oracle恢复内部原理(基础数据结构)

    Oracle基础数据结构 系列文章:Oracle恢复内部原理 http://www.linuxidc.com/search.aspx?where=nkeykeyword=19824 2.1 控制文 O ...

  2. 12c集群日志位置_Oracle 19C RAC 集群日志位置变化

    作者 | JiekeXu 来源 | JiekeXu之路(ID: JiekeXu_IT) 转载请联系授权 | (微信ID:xxq1426321293) 大家好,我是 JiekeXu,很高兴又和大家见面了 ...

  3. oracle 删除补全日志组_Oracle 10g 添加、删除日志组

    做日常巡检的时候发现alert日志中有这个错误 Thread 1 cannot allocate new log, sequence 319708 Checkpoint not complete 这个 ...

  4. 【转】【MySQL】运行原理(四):重做日志(redo log),回滚日志(undo log),二进制日志(binlog)

    MySQL中有六种日志文件,分别是:重做日志(redo log).回滚日志(undo log).二进制日志(binlog).错误日志(errorlog).慢查询日志(slow query log).一 ...

  5. mysql事物及事物等级_MySQL事物原理及事务隔离级别

    mysql事物 事务是访问数据库的一个操作序列,数据库应用系统通过事务集来完成对数据库的存取.事务的正确执行使得数据库从一种状态转换为另一种状态. 事务必须服从ISO/IEC所制定的ACID原则.AC ...

  6. 详述MySQL事务及ACID特性的实现原理

    " 事务是 MySQL 等关系型数据库区别于 NoSQL 的重要方面,是保证数据一致性的重要手段. 本文将首先介绍 MySQL 事务相关的基础概念,然后介绍事务的 ACID 特性,并分析其实 ...

  7. 深入学习MySQL事务:ACID特性的实现原理

    事务是MySQL等关系型数据库区别于NoSQL的重要方面,是保证数据一致性的重要手段.本文将首先介绍MySQL事务相关的基础概念,然后介绍事务的ACID特性,并分析其实现原理. MySQL博大精深,文 ...

  8. Git详解之九 Git内部原理

    以下内容转载自:http://www.open-open.com/lib/view/open1328070620202.html Git 内部原理 不管你是从前面的章节直接跳到了本章,还是读完了其余各 ...

  9. 升级mysql服务器二进制备份_MySQL二进制日志备份和恢复详解

    基本概念 定义: 二进制日志包含了所有更新了数据或者已经潜在更新了数据(例如,没有匹配任何行的一个DELETE)的所有语句. 作用: 1.二进制日志的主要目的是在恢复使能够最大可能地更新数据库,因为二 ...

最新文章

  1. Java面试中最高频的那20%知识点是什么?
  2. 压力测试对于BCH真的有意义吗?
  3. DAS、NAS和SAN概念与应用的简单比较
  4. TC工具后台模式_如何用WRF模式模拟台风个例
  5. Tarjan算法学习1-双连通
  6. 2021“MINIEYE杯”中国大学生算法设计超级联赛(7)部分题解
  7. TypeScript类型推论(Type Inference)
  8. 探索MicroPython(二)--搭建开发环境
  9. iOS MJRefresh下拉刷新(上拉加载)使用详解
  10. 【BCS2021】软件供应链完整演讲回看
  11. 数字电平(一):TTL和CMOS
  12. VC++编程之字符串解惑--Unicode MBCS
  13. Ajax的工具类AjaxUtils,使用struts返回Json类型
  14. Uniswap进化之路
  15. oracle cude报错,转载oracle rollup和cube函数使用心得
  16. iexplore应用程序错误
  17. sql server 使用 top WITH TIES
  18. JavaScript数组对象深拷贝
  19. C语言在一个数组中查找一个数字
  20. 2021旗舰机选购指南

热门文章

  1. 派克宇航获得AVIC涡轮螺旋桨支线飞机MA700的飞控作动系统合同
  2. HoloLens忘记开机密码,并重新安装HoloLens系统
  3. UVa 815 Flooded
  4. ABAP 通过LDB_PROCESS函数使用逻辑数据库
  5. L-ink复刻笔记(记录)
  6. 给IDEA换个酷炫的主题,真的太好看了!
  7. 学编程难吗?多久能入门?
  8. 天猫精灵打开电脑(网络唤醒)
  9. 四川c语言二级成绩查询,求历年四川省计算机二级考试c语言真题.
  10. dell服务器面板不显示,戴尔服务器控制提示面板没有安装怎么处理