ITPub博客

首页 > 数据库 > Oracle > Oracle RAC CacheFusion 系列十六:Oracle RAC CurrentBlock Server

Oracle RAC CacheFusion 系列十六:Oracle RAC CurrentBlock Server

原创 Oracle 作者:沃趣科技 时间:2019-10-23 15:47:28 0 删除 编辑

PCM锁资源存储方式有两种,1.如果PCM锁属于本地实例,那么它会被存储在本地实例的LE结构中。2.如果PCM锁属于远程实例那么它将会被分配存储在本地实例的共享池中。

kclle结构:

    kcllerls表示release; 

    kcllelnm表示 name(id1,id2);

    kcllemode表示 hold-mode;

    kclleacq表示 acquiring;

    kcllelck表示 DLM锁。

kjbr结构:

    resname_kjbr [2]表示资源名称; 

    grant_q_kjbr表示grant queue;

    convert_q_kjbr表示转换队列; 

    mode_role_kjbr,它表示授权模式和角色:NULL(0x00),S(0x01),X(0x02),L0本地(0x00),G0全局没有PI(0x08),G1全局有PI(0x018)。

kjbl中的字段mode_role_kjbl是表示锁定模式:

    0x00表示为NULL模式 

    0x01表示为S模式

    0x02表示为X; 

    0x04表示为master节点打开锁; 

    0x08表示为全局角色;

    0x10表示为存在PI;

    0x20表示为CR请求;

    0x40表示为S模式请求; 

    0x80表示为X模式请求。

  示例  

SELECT * FROM emp WHERE empno = ...;
UPDATE emp SET sal = sal + 10 WHERE empno = ...; COMMIT; ALTER SYSTEM CHECKPOINT LOCAL;1

    1.锁定和块请求,远程master

    2.锁定和块请求,本地master,共享模式

    3.锁转换,锁降级

    4.块融合,写/写

    5.块融合,写/读(CR)

    6.写入涉及锁定,丢弃PI

    7.块融合写/读,类似于步骤5


Step 1  

最开始表未被缓存在集群中的任何实例中,因此master将SL0模式授予实例3.然后,实例3将块从磁盘读取到其缓冲区高速缓存。查看x$kjbr和x$kjbl已创建的资源以及已获取的本地锁定。STATE为2表示,内存块处于共享模式scur。


Step 2  

master节点将SL0模式授予实例2,因为:

  • 资源上有一个共享锁(由实例3拥有)。

  • master节点上的同一资源没有共享锁。

然后,实例2将块从磁盘读取到本地缓存中。如果master节点上存在共享锁或_cr_grant_local_role为TRUE(11g为AUTO),则行为会存在变化。在这种情况下,master实例将CR请求转发给共享锁的实例所有者(实例3),将当前缓冲区发送到实例2。


Step 3  

请求者(实例2)向主(自身)发送X请求。

Master(实例2)将ping X消息发送到S锁持有者(实例3)。

实例3将缓冲区状态从scur转换为CR并关闭锁定。 

实例3将缓冲区发送给请求者(实例2)。

请求者(实例2)将ASSUME发送给主(自身)以获得锁定模式,并通知master前一个持有者(实例3)已关闭锁定。

X$BH.STATE显示1,即当前块(X CURRENT)。

X$KJBR.KJBRROLE显示0,表示实例2拥有的锁是XL0,这意味着实例3拥有的锁已关闭。

X$BH.STATE从2变为3(即S变为CR)。 


Step 4  

请求者实例1执行更新向master实例(实例2)发送X请求。master实例(实例2)将ping X发送到X锁定持有者(自身)。实例2将缓冲区状态从本地X CURRENT转换为PI。实例2将缓冲区块发送给请求者(实例1)。

请求者(实例1)向主(实例2)发送ASSUME以获取锁定模式,并告知主实例实例1具有全局X锁定,而实例2具有全局NULL锁定。

X$BH.STATE从X切换到PI模式。

KJBL.KJBLROLE值24为8 + 16,分别表示PI和GLOBAL(即G1模式)。

X$BH.STATE是1,这是当前独占的。


Step 5  

实例3(请求者)将CRREQ(S)发送到主(实例2)。

master实例(实例2)选择CR,如下所示:

  • 如果资源角色为G0,则master实例采用存在于它自身buffer cache上的最高版本的PI

  • 否则,如果资源角色为G1,则master实例选择接近CRREQ中请求的SCN的SCN的PI。

  • 如果资源角色为XL0,则master实例选择实例当前的缓存。

主实例(实例2)将CRREQ转发到所选实例(自身)。所选实例(实例2)构建CR缓冲区并将其发送到实例3,实例3不需要DLM锁。


Step 6  

实例1(请求者)向master实例(实例2)发送W请求(从客户端到master)。

master(实例2)注册要写入的块的SCN(在DLM资源中)以保存即将要发生的写入。master没有授权写入,它向实例1发送W请求,因为实例1具有最高SCN(当前块)。

实例1通过在ping队列中链接缓冲区来写入缓冲区。DBWR执行写入。 

实例1向实例2(主)发送W通知。

实例1(主)将设置资源为本地角色,并将FLUSH_PI发送到包含PI的每个实例(在本例中为自身)。接收此实例的实例将PI缓冲区转换为CR缓冲区并释放关联的LE。

X$BH.STATE从8变为3,即从PI缓冲区到CR缓冲区。

X$LE表明没有LE锁持有CR缓冲区。

X$KJBL.KJBLROLE变为0,表示锁现在是本地的。


来自 “ ITPUB博客 ” ,链接:https://blog.itpub.net/28218939/viewspace-2661135/ ,如需转载,请注明出处,否则将追究法律责任。

请登录后发表评论 登录
全部评论
杭州沃趣科技股份有限公司创建于2012年(股票代码:839849),是一家专注为企业用户提供基于高性能、高可用、可扩展的开放数据库云平台解决方案的国产厂商。公司创始团队为原阿里巴巴数据库技术团队核心骨干,凭借丰富的研发及运维经验,为行业客户提供数据库云产品及软硬件一体化解决方案。

注册时间:2016-07-18

  • 博文量
    290
  • 访问量
    994483