联动Oracle:设计思想、架构实现与AWR报告_玉素甫·买买提 编著;周亮 审_AZW3_MOBI_EPUB_PDF_电子书(无页码)_玉素甫·买买提 编著;周亮 审

内容节选

第4章重做 数据库如何在高并发环境下保证数据的一致性呢?为此,数据库中引入了事务的概念,把数据库中的相关操作看作一个统一的原子操作,这些相关的操作要么全都成功、要么全都失败。数据库都具有事务日志,用于记录所有事务以及每个事务对数据库所做的修改。如果系统出现故障,则可能需要使用事务日志将数据库恢复到一致状态。 日志一般分成回滚(Undo)和重做(Redo)两种。回滚日志一般用于事务的取消和回滚,记录的是数据被修改之前的值,相关内容将在第5章进行讨论。重做日志则一般用于恢复已确认但未写入数据库的数据,记录的是数据修改前后的值,例如:数据库忽然断电重启,数据库启动时一般要做一致性检查,会把已写到Redo日志但未写入数据库的数据重做一遍。数据库恢复一致状态的细节及原理就是本章的主要讨论内容。 4.1 深入认识重做记录 Redo日志记录着系统数据块和用户数据块的变更。我们把每一条Redo信息叫作重做记录。重做记录里记录着数据的改变向量,改变向量记载了对一个数据块所执行的原子性操作。所以改变向量可用于保证数据块在修改前后的一致性,而其容器的日志记录则可用于保证数据库在修改前后的一致性。一条重做记录的构成具体如下。 ❑重做记录头部信息,记录SCN及其子编号(SUBSCN),以及该记录将会写入日志文件的位置,即RBA(Redo Byte Address,重做字节地址)。 ❑CHANGE#1:UNDO段头的修改日志,即申请事务修改UNDO段头来创建事务相关信息,因此该部分主要记录事务创建对回滚段头的改变日志。 ❑CHANGE#2:UNDO块的修改日志,即在修改某行数据之前,需要把旧值保存到回滚块,这可以理解为数据块的改前镜像。 ❑CHANGE#3:因修改数据块而产生的日志,即旧数据保存到回滚块后,用新值来覆盖旧日志。 ❑CHANGE#4:与COMMIT或审计相关的信息。 在进一步讨论日志记录和改变向量之前,需要了解SCN、数据块版本号(SCN+SEQ)、RBA等概念。 4.1.1 SCN:系统改变号 SGA中有个内存位置用来产生“时钟”信号,实际上它是一个简单的计数器,称作系统改变号(System Change Number,SCN)。每个能够访问SGA的服务器进程都能读取和更新SCN,通过kcmgss函数在每个查询或事务开始的时候读取这个位置的当前值,当进程提交一个事务时,它同时会增加SCN的值。 SCN是Oracle表示时间流逝的一种方式,它是由内核产生的一个数。使用SCN的原因是数据库的正常工作需要一个可靠的时间系统。此系统与现实世界一致,不允许时间倒退(特殊情况下可以人为快速递增SCN)。在发生操作变更时,将当前的时间写入被修改的地方,这样Oracle才能正确判断数据库中发生的操作在时间上的先后次序,而次序对恢复操作非常重要。我们知道操作系统时间和硬件时间可以任意修改,因此使用严格递增的SCN是判断事务先后顺序最好的解决方案。 系统时间标记与SCN之间存在一张表,即SYS下的SMON_SCN_TIME。每隔5min,系统就会产生一次系统时间标记与SCN匹配,并存入SYS.SMON_SCN_TIME表(由SMON进程来执行Update操作)。该表中记录了最近1440个系统时间标记与SCN的匹配记录,即该表维护最近5天内的记录。下面就来介绍常用的SCN查询和转换方法。首先查询目前系统最新的SCN,之后根据SCN查找对应的时间。timestamp与SCN互换的两种方法如下所示。 第一种方法如下。 第二种方法如下。 4.1.2 SEQ与RBA 在数据库中,只要是导致变更的操作,负责执行操作的进程都要申请新的SCN。即便没有发生任何事件,每3s SCN也必须至少增加1。数据库的内部操作可能频繁变更,因此不能排除多条重做记录的SCN一样的情况。所以Oracle又引入了SUBSCN,用以标记同一个SCN下的多次变更,该值的范围为1~254。SUBSCN经常以“SUBSCN:n”的形式出现在转储文件中。 修改操作完成后,SCN和SUBSCN会保存在被修改的数据块头部,占7字节,SCN还是名为SCN,但是SUBSCN会改称为SEQ(序列号)。SCN与SEQ就是数据库块版本号,经常以“SCN:0xffff.ffffffff SEQ:n”的形式出现在转出文件中。如此一来,修改操作的SCN就会出现在以下两种文件中:重做日志和数据文件。 RBA即重做记录的物理地址。有了它,在重做日志中寻址重做记录就有了可能。RBA由4部分构成,分别是日志线程号、日志序列号、日志文件编号和日志文件块字节偏移量,长度为10字节。 修改操作的SCN、SUBSCN和该操作的RBA,都会写入重做记录中,这样重做记录的自描述性就变得相当强了,不仅可以表示操作发生的“时间”,还标记了在哪个重......

  1. 信息
  2. 前言
  3. 第一篇 宏观掌握Oracle基础
  4. 第1章 Oracle概貌及进程
  5. 第2章 Oracle内存与实例
  6. 第3章 Oracle存储结构
  7. 第二篇 微观理解Oracle原理
  8. 第4章 重做
  9. 第5章 回滚
  10. 第6章 排队论和并发控制
  11. 第7章 数据缓冲区
  12. 第8章 共享池
  13. 第三篇 串联Oracle运行流程
  14. 第9章 串联Oracle
  15. 第10章 AWR数据解读
  16. 第11章 集群与多租户
  17. 后记