联动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,都会写入重做记录中,这样重做记录的自描述性就变得相当强了,不仅可以表示操作发生的“时间”,还标记了在哪个重......
- 信息
- 前言
- 第一篇 宏观掌握Oracle基础
- 第1章 Oracle概貌及进程
- 第2章 Oracle内存与实例
- 第3章 Oracle存储结构
- 第二篇 微观理解Oracle原理
- 第4章 重做
- 第5章 回滚
- 第6章 排队论和并发控制
- 第7章 数据缓冲区
- 第8章 共享池
- 第三篇 串联Oracle运行流程
- 第9章 串联Oracle
- 第10章 AWR数据解读
- 第11章 集群与多租户
- 后记