美文网首页
Oracle内存融合

Oracle内存融合

作者: 个人精进成长营 | 来源:发表于2021-06-27 22:06 被阅读0次

    内存融合概念

    内存融合技术比较复杂,需要先了解基本的相关概念,再来理解内存融合。

    1:全局资源目录

    GRD(global resource directory): 保存和组织内存融合相关资源的一种方式,是内存融合的基础。每个实例都包含GRD信息

    2:PCM 锁

       模式(mode): N ,S X 

     nsx

    nyyy

    syyn

    xynn

    3:角色(role ) PCM锁的角色表示对应的数据库被修改的范围,它可以是本地(L)或者全局(G),本地表示对应的块只在本地被修改过,全局表示块在另外一个或者多个远程实例被修改。

    4:旧镜像(pass image ,Pi)这部分值为1或者0.如果为1表示存在对应的PI块,如果表示0不存在PI块。角色为L的PCM锁不会存在PI,PI只会对角色G的PCM锁才会存在。

    当PI产生时,对应的改变的信息一定要被写入redo log,PI 的存在主要是为了避免RAC过多的访问回滚段避免物理读。

    5:节点

    资源申请节点、资源持有节点、资源主节点

    资源申请过程:

    1:资源申请节点发送申请到主节点

    2:主节点将请求发给对应的资源持有节点

    3:资源持有节点将本地的资源锁信息(PCM)进行改变,之后将资源发送给资源申请  

       节点

    4:资源申请节点获取资源,并通知主节点更新资源的相关锁信息。

    6:消息机制

    步骤1:资源节点向主节点发送消息,要求持有一个资源,这个消息需要被立刻处理,而且主节点会立刻响应这个消息,之后资源申请节点进入等待状态

    步骤2:资源主节点发送消息给资源持有节点。这个消息需要被乐可处理,而且资源持有节会马上回复资源主节点。

    步骤3:资源持有节点发送消息给申请节点,并同时将资源也发送给申请节点。

    步骤4:申请节点通知资源主节点申请已经结束。

    7:内存融合举列说明

       以一个4节点的RAC数据库为例,说明各种场景内存融合的原理

       7.1节点C要求读取一个数据块(SCN 1000),第一次读取

           步骤1:SCN 1000的数据块的主节点被HASH 到 D节点,之后节点C向主节点发送请求,要求以S模式持有改块。这是PCM资源锁的属性是SL0(S 表share ,L表示local ,0表示没有PI )

           步骤2:主节点发现这个是第一个请求,没有不兼容的锁存在,把对应的锁赋予C。

           步骤3:节点C从数据文件读取对应的数据库块

           步骤4:读取完成,节点C获得对应的锁,属性为SL0。

           步骤5:节点C获取对应的锁之后,通知主节点。

        7.2节点B要求读取改数据块

            步骤1:节点B向主几点D申请获取这个数据块的最新版本。

            步骤2:主节点发现最新的块保存在C节点,要求C节点发送给B节点

            步骤3:节点C将数据块发送给B节点,这时候节点B的锁属性为SL0

            步骤4:节点B收到数据库块后,通知主节点更新资源锁信息

        7.3实例B要求修改数据块,把SCN改成1009

            步骤1:节点B向主节点D申请获取这个数据块更高级别的锁(X)

            步骤2:主节点发现数据块在C节点存在S模式的锁,要求C节点释放该锁

            步骤3:节点C将数据块上的锁释放,同时将对应的数据库变成一个CR快,因为这个时候数据块的最新版本在节点B上,而且节点C也没有修改过这个快,之后通知节点B锁已经释放

             步骤4:节点B收到消息后,修改数据块,并通知主节点更新资源锁信息,这时候数据块最新版本存在B节点上,对应的锁信息为XL0

        7.4节点A要求修改数据块把SCN 改成1013

            步骤1:节点A向主节点D要求获取这个数据块X模式的锁

            步骤2:主节点发现数据块在B节点存在X模式的锁,要求B节点释放锁

            步骤3:B节点将数据块上的锁释放,并将修改数据块的操作写入重做日志

    同时将对应的数据块变成一个PI块,之后通知节点A该锁已经释放,并将数据块发给节点A,这时候节点B对应的锁信息为NG1

             步骤4:节点A收到消息之后,修改数据块并通知主几点更新锁信息。这时候数据库的最新版本在节点A(XGO)

       7.5节点C要求读取数据块

            步骤1:节点C向主节点要求获取这个数据块的S 锁

            步骤2:主节点D发现这个数据块在节点A存在X模式锁,要求A释放X锁

            步骤3:节点将数据块上的X锁释放(降级S),并将修改的操作写入重做日志文件中,同时将数据块变成PI块,之后通知C节点锁已经释放,将数据块发送给C节点,这是A节点的锁为SG1

             步骤4:节点C收到消息之后,更新本地节点锁信息(SG0),并通知主节点更新锁信息。

            7.6节点B要求读取数据块

             步骤1:节点B向主节点D要求或者这个块的S锁

             步骤2:主节点D发现数据块在C和A节点存在S模式锁,选择C节点发送数据块

             步骤3:节点C收到请求后,将最新的数据库发送给B

             步骤4:节点C收到消息之后,更新本地节点的锁信息,并通知主节点更新锁信息。这是数据块SG1

              7.7节点A要求执行检查点

              步骤1:节点A向主节点要求写入数据库块

              步骤2:主节点发现数据块在节点A存在最新的版本,通知A节点将数据写入磁盘。

              步骤3:节点 A 将数据的最新版本写入数据文件发送I/O请求

              步骤4:数据文件被写入,I/O请求完成

              步骤5:节点A通知主节点块已经被写入,这是节点A锁为(XL0)

              步骤6:主节点通知所有包含数据块PI的节点消除PI,锁属性为(NL0)

    相关文章

      网友评论

          本文标题:Oracle内存融合

          本文链接:https://www.haomeiwen.com/subject/sxhfultx.html