溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務(wù)條款》

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

發(fā)布時間:2020-08-09 01:30:33 來源:ITPUB博客 閱讀:253 作者:沃趣科技 欄目:關(guān)系型數(shù)據(jù)庫

PCM鎖資源存儲方式有兩種,1.如果PCM鎖屬于本地實例,那么它會被存儲在本地實例的LE結(jié)構(gòu)中。2.如果PCM鎖屬于遠(yuǎn)程實例那么它將會被分配存儲在本地實例的共享池中。

kclle結(jié)構(gòu):

    kcllerls表示release; 

    kcllelnm表示 name(id1,id2);

    kcllemode表示 hold-mode;

    kclleacq表示 acquiring;

    kcllelck表示 DLM鎖。

kjbr結(jié)構(gòu):

    resname_kjbr [2]表示資源名稱; 

    grant_q_kjbr表示grant queue;

    convert_q_kjbr表示轉(zhuǎn)換隊列; 

    mode_role_kjbr,它表示授權(quán)模式和角色: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節(jié)點打開鎖; 

    0x08表示為全局角色;

    0x10表示為存在PI;

    0x20表示為CR請求;

    0x40表示為S模式請求; 

    0x80表示為X模式請求。

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

  示例  

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

    1.鎖定和塊請求,遠(yuǎn)程master

    2.鎖定和塊請求,本地master,共享模式

    3.鎖轉(zhuǎn)換,鎖降級

    4.塊融合,寫/寫

    5.塊融合,寫/讀(CR)

    6.寫入涉及鎖定,丟棄PI

    7.塊融合寫/讀,類似于步驟5

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

Step 1  

最開始表未被緩存在集群中的任何實例中,因此master將SL0模式授予實例3.然后,實例3將塊從磁盤讀取到其緩沖區(qū)高速緩存。查看x$kjbr和x$kjbl已創(chuàng)建的資源以及已獲取的本地鎖定。STATE為2表示,內(nèi)存塊處于共享模式scur。

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

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

Step 2  

master節(jié)點將SL0模式授予實例2,因為:

  • 資源上有一個共享鎖(由實例3擁有)。

  • master節(jié)點上的同一資源沒有共享鎖。

然后,實例2將塊從磁盤讀取到本地緩存中。如果master節(jié)點上存在共享鎖或_cr_grant_local_role為TRUE(11g為AUTO),則行為會存在變化。在這種情況下,master實例將CR請求轉(zhuǎn)發(fā)給共享鎖的實例所有者(實例3),將當(dāng)前緩沖區(qū)發(fā)送到實例2。

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

Step 3  

請求者(實例2)向主(自身)發(fā)送X請求。

Master(實例2)將ping X消息發(fā)送到S鎖持有者(實例3)。

實例3將緩沖區(qū)狀態(tài)從scur轉(zhuǎn)換為CR并關(guān)閉鎖定。 

實例3將緩沖區(qū)發(fā)送給請求者(實例2)。

請求者(實例2)將ASSUME發(fā)送給主(自身)以獲得鎖定模式,并通知master前一個持有者(實例3)已關(guān)閉鎖定。

X$BH.STATE顯示1,即當(dāng)前塊(X CURRENT)。

X$KJBR.KJBRROLE顯示0,表示實例2擁有的鎖是XL0,這意味著實例3擁有的鎖已關(guān)閉。

X$BH.STATE從2變?yōu)?(即S變?yōu)镃R)。 

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

Step 4  

請求者實例1執(zhí)行更新向master實例(實例2)發(fā)送X請求。master實例(實例2)將ping X發(fā)送到X鎖定持有者(自身)。實例2將緩沖區(qū)狀態(tài)從本地X CURRENT轉(zhuǎn)換為PI。實例2將緩沖區(qū)塊發(fā)送給請求者(實例1)。

請求者(實例1)向主(實例2)發(fā)送ASSUME以獲取鎖定模式,并告知主實例實例1具有全局X鎖定,而實例2具有全局NULL鎖定。

X$BH.STATE從X切換到PI模式。

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

X$BH.STATE是1,這是當(dāng)前獨占的。

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

Step 5  

實例3(請求者)將CRREQ(S)發(fā)送到主(實例2)。

master實例(實例2)選擇CR,如下所示:

  • 如果資源角色為G0,則master實例采用存在于它自身buffer cache上的最高版本的PI

  • 否則,如果資源角色為G1,則master實例選擇接近CRREQ中請求的SCN的SCN的PI。

  • 如果資源角色為XL0,則master實例選擇實例當(dāng)前的緩存。

主實例(實例2)將CRREQ轉(zhuǎn)發(fā)到所選實例(自身)。所選實例(實例2)構(gòu)建CR緩沖區(qū)并將其發(fā)送到實例3,實例3不需要DLM鎖。

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

Step 6  

實例1(請求者)向master實例(實例2)發(fā)送W請求(從客戶端到master)。

master(實例2)注冊要寫入的塊的SCN(在DLM資源中)以保存即將要發(fā)生的寫入。master沒有授權(quán)寫入,它向?qū)嵗?發(fā)送W請求,因為實例1具有最高SCN(當(dāng)前塊)。

實例1通過在ping隊列中鏈接緩沖區(qū)來寫入緩沖區(qū)。DBWR執(zhí)行寫入。 

實例1向?qū)嵗?(主)發(fā)送W通知。

實例1(主)將設(shè)置資源為本地角色,并將FLUSH_PI發(fā)送到包含PI的每個實例(在本例中為自身)。接收此實例的實例將PI緩沖區(qū)轉(zhuǎn)換為CR緩沖區(qū)并釋放關(guān)聯(lián)的LE。

X$BH.STATE從8變?yōu)?,即從PI緩沖區(qū)到CR緩沖區(qū)。

X$LE表明沒有LE鎖持有CR緩沖區(qū)。

X$KJBL.KJBLROLE變?yōu)?,表示鎖現(xiàn)在是本地的。

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

向AI問一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進(jìn)行舉報,并提供相關(guān)證據(jù),一經(jīng)查實,將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI