Oracle RAC Cache Fusion 系列一:基础概念

从本章节开始,我将尝试由浅至深的和大家一起探索Oracle RAC的其中一核心技术-Oracle Cache Fusion,看看多个实例场景下,事务是如何并发运行的。在了解多实例场景前,我们还是非常有必要一起了解一些重要的概念及在单实例情况下Oracle是如何控制并发事务运行的。

从本章节开始,我将尝试由浅至深的和大家一起探索Oracle RAC的其中一核心技术-Oracle Cache Fusion,看看多个实例场景下,事务是如何并发运行的。在了解多实例场景前,我们还是非常有必要一起了解一些重要的概念及在单实例情况下Oracle是如何控制并发事务运行的。

为了实现事务并发运行时的数据一致性问题,数据库研究人员定义了一个称为可序列化的事务隔离模型。可序列化事务在一个环境中运行时,做到使其看起来好像没有其他用户在修改数据库中的数据。但这会带来新的问题,以可序列化模式运行许多应用程序时会严重损害应用程序TPS和吞吐。这种并发运行事务的完全隔离可能意味着一个事物无法执行插入另一个事物查询的表。所以这就要求我们在完美的事物隔离和性能之间进行折中取舍,Mysql提供多种事物隔离方式及多种存储引擎,让用户根据自己的业务类型、操作特点去自由选择。而Oracle则通过引入自己的多版本一致性模型和各种类型的锁和事务以实现性能和事物隔离的“最优解”。通过这种方式,数据库可以向多个并发用户展现对应版本的数据,所有版本的数据与时间点保持一致。通过实现不同版本的数据块同时存在,实现事务可以读取在查询所需的时间点提交的数据版本,并返回与单个时间点一致的结果。

数据块的持有模式:

NULL:null CR模式表示资源的持有者没有访问权限。对应的内存空间可以被重用,主要用于数据字典对象。

Exclusive:XCUR独占模式表示块的独占访问。这意味着资源持有者需要对块执行写操作,而其他资源无法对块进行写操作。但是,其他资源可以对块执行读取操作。

Shared:SCUR共享模式表示资源持有者在块上具有共享锁,并且正在执行读取操作。顾名思义,由于锁是共享的,所以任何其他资源也可以读取该块。

数据块的角色:

Local:当块被读取到实例的缓存中,并且群集中没有其他实例读取相同的块或已将其包含在其缓存中时,则该块被赋予的角色就是本地角色。

Global:如果先前具有本地角色的数据块,这时它被请求发送给其他实例或者从其他实例接收,则该块就被赋予了全局角色。

内存数据块的状态:

free:当前未使用

xcur:当前独占

scur:当前共享

cr:一致性读

read:正在从磁盘读

mrec:正在做介质恢复

irec:正在做实例恢复

操作类型:

读CR块

从硬盘读出当前块,然后通过undo段构造出需要的数据块,CR块不需要加锁。

读当前块

直接从硬盘中读取SCN最新的数据块,数据块的持有模式为:SL0(shared,local,non-piblock)

写当前块

直接从硬盘读出SCN最新的数据块,数据块的持有模式为:XL0(exclusive, local,non-pi block)

SCN:

1.是Oracle数据库使用的逻辑内部时间戳

2.Oracle通过为块的每个版本分配数字标识符来记录对数据块所做的每个更改。

3.使Oracle能够有序地生成重做日志,并适应后续的恢复处理

4.SCN排序数据库中发生的事务。

5.每个事务都有一个对应的SCN。

崩溃恢复:

意味着所有实例都已失败,因此它们都需要恢复。

对于单个实例和RAC环境,崩溃恢复基本相同,对于单个实例,以下是恢复过程:

磁盘块是恢复的起点,Oracle只会考虑磁盘上的块,因此恢复很简单。使用当前或活动的redo日志会自动进行崩溃恢复,起点是最后一个完整的检查点。 起始点由控制文件提供,并与数据文件头中的相同信息进行比较,只需要应用更改。如果块具有与重做记录(SCN匹配)相同的时间戳,则重定义中指定的块将被读入高速缓存。对应的RAC实例恢复后续文章会介绍到。

数据的一致性维护:

单个实例数据库,每当用户查询数据时,他都会获得一致的数据“视图”。例如,另一个用户已经读取了一个数据块并更改了缓冲区缓存(buffer cache)中的某些行。如果另一个用户想要读取来自相同数据块的数据,则Oracle将在缓冲区高速缓存中复制该数据块,并应用undo表空间中存在的undo信息以获得一致的数据“视图”。然后将该一致“数据”呈现给想要读取数据的用户。

多版本一致性模型:

多版本一致性模型区分当前版本的数据块和读取一致版本的数据块。当前块一般指的是包含所有更改,已提交以及未提交的更改的块。

示例:

假设现在需要在实例中不存在的数据块上触发DML。那么,此块将从磁盘读取到缓冲区缓存中,并且对应的记录将被更改。接着,用户在同一数据块上提交并触发另一个DML。现在该数据块是脏的,包含已提交和未提交的更改。假设另一个用户请求读取该数据块,那么Oracle将复制并应用undo信息制作该块的一致读“CR”副本并将其发送给请求的用户。因此,我们有相同数据块的多个版本,每个版本都与请求的用户一致。在操作过程中,可以有更多版本的相同数据块,每个版本都与某个时间点一致。

未完待续……

| 作者简介

刘金龙·沃趣科技高级数据库技术专家

多年Oracle海量数据以及高并发数据库管理工作经验,主要负责Oracle数据库产品及售后二线支撑。精通Oracle 11g及12c内部运行机制,有丰富的基于全方位技术栈的数据库及RAC集群层故障诊断、性能调优、OWI、数据库备份恢复及迁移经验。

发表评论

电子邮件地址不会被公开。 必填项已用*标注