Oracle RAC Cache Fusion 系列十三:PCM資源訪問

沃趣科技發表於2019-08-21
前面的章節我們介紹了Oracle為實現Cache Fusion引入的各種改變和新的概念。本節我們從RAC環境中可能發生的場景對Oracle Cache Fusion的實現進行更近一步的探討。


| 從磁碟中讀一個塊
例項C希望讀取塊,這時需要通過主例項D(塊的master)獲得共享模式鎖。
1.例項C的FG(Foreground Process)程式通過向例項D的LMS程式傳送資料塊(需要共享鎖)請求來獲得塊的訪問許可權。
2.例項D發現塊從未被讀取到叢集中的任何例項的緩衝區快取中,並且也未被鎖定。例項D的LMS程式將PR(x$kjbl的kjblgrant列顯示KJUSERPR。)鎖授予例項C,授予的鎖為sl0(Shared-Local-noPI)。
3.例項C將塊從共享磁碟讀取到它的緩衝區快取中(buffer cache),假設這個時候塊的SCN為1000。
4.例項C在共享模式下有塊,最後鎖管理器更新資源目錄(GRD)。
注:這時如果用10046跟蹤會話那麼你會發現等待事件如下:
WAIT #19446741324875049632: nam='gc cr grant 2-way' ela= 49 p1=7 p2=6867 p3=1 obj#=3214
   tim=4597940025
WAIT #19446741324875049632: nam='db file sequential read' ela= 56 file#=7 block#=6867 blocks=1 obj#=3214 tim=4597941129

Oracle RAC Cache Fusion 系列十三:PCM資源訪問

| 從記憶體中讀一個塊
繼續第一個場景,例項B希望讀取快取在例項C緩衝區中的資料塊塊。
1.例項B的FG程式向主例項D的LMS程式傳送資料塊請求
2.例項D的LMS程式知道該塊在例項C上以共享模式持有,例項D的LMS程式緊接著向例項C的LMS程式轉發這個請求。( gc cr grant 3-way
3. 例項C的LMS程式通過私網將塊傳送到例項B的FG,同時例項C通知例項B採用與例項C一樣的鎖定模式和角色,而例項C保留塊的副本(CR Block)。
4.例項B向例項D傳送一條訊息,表明它現在持有了該塊的SL鎖。因為這條訊息對於鎖管理器來說不是必要資訊,所以這條訊息可以非同步傳送。

Oracle RAC Cache Fusion 系列十三:PCM資源訪問

| 獲取快取塊進行更新
繼續上面的場景,例項A想要修改已經快取在例項B和C中的同一塊。
1.例項A向塊的master例項D傳送獨佔鎖請求。
2.例項D知道塊在例項B記憶體中以scur模式持有和在例項C中以cr模式持有。這時lock master例項D向共享鎖持有者實力B傳送ping訊息。
3.例項B通過私網將塊傳送給例項A,並且釋放它持有的共享鎖。塊仍在例項B的緩衝區中以CR形式存在,只是所持有的鎖都被釋放了。
4.例項A現在在該塊上持有獨佔鎖,並向例項D傳送一條訊息,表明它現在持有了該塊的XL0(exclusive-LOCAL-noPI)鎖。
5.例項A修改緩衝區快取中的塊,但是未提交更改,因此塊未寫入磁碟,因此SCN保持在1000。

Oracle RAC Cache Fusion 系列十三:PCM資源訪問

| 獲取快取中已經被修改的塊以進行更新和提交
繼續上面的場景,例項C現在想要修改相同塊的不同行。
1.例項C向lock master例項D傳送獨佔鎖請求。
2. 例項D知道例項A持有請求塊的獨佔鎖,因此向例項D向例項A傳送ping訊息。
3.例項A通過私網將髒塊傳送到例項C,並且例項A將鎖從xcr降級為空。但是它會保留塊的PI版本。在傳送塊之前,例項A必須建立一個PI映象並刷入塊更改的任何操作條目到redo日誌中,例項A上的塊模式現在是NG1(null-GLobal-1PI)
4.例項C向例項D傳送一條訊息,表明它持有的塊處於獨佔模式。如果需要將塊寫入磁碟,它必須與具有該塊的過去映象(PI)的其他例項進行協調。例項C修改塊併發出提交,SCN現在是1001。

Oracle RAC Cache Fusion 系列十三:PCM資源訪問

| 提交修改塊的操作
繼續上面的場景操作,例項A現在發出commit,以釋放它持有的行級鎖,並將重做日誌資訊刷入到redo log。
1.例項A想要提交更改,這時提交操作不需要對塊進行任何同步的操作(只需日誌持久化即可)。
2.塊的鎖定狀態與以前的狀態沒有變化,提交的更改向量將寫入redo log。

| 由於增量檢查點的發生,需將髒緩衝區寫入磁碟
繼續上面的場景,例項B由於增量檢查點的更新需要從緩衝區快取中將髒塊寫入。
1.例項B向塊的master例項D傳送寫塊請求。
2.例項D知道例項C上有塊的最新副本,因此例項D會向例項C傳送一條訊息,請求刷髒塊。
3.例項C啟動磁碟寫入並將對應的BWR寫入redolog檔案中。
4.LGWR通知例項C日誌寫入操作完成。
5.例項C通知master例項D,髒塊的寫入操作已完成。
6.在收到通知後,例項D通知所有PI持有者它們所持有的PI塊。
7.以前修改過此塊的所有例項同樣也需寫BWR。例項C的寫請求已經全部完成,例項B最後向磁碟中寫入其增量檢查點。

Oracle RAC Cache Fusion 系列十三:PCM資源訪問

| 主例項崩潰
繼續上面的場景
1.主例項D崩潰
2.全域性資源目錄GRD凍結,主例項D所持有的資源將平均分佈在倖存的節點中,也稱為remaster。

| 從例項A中查詢一行資料
從上面的示例繼續,現在例項A查詢該表中的行以獲取最新的資料。
1.例項A向新的主例項C傳送請求共享鎖操作。
2.根據GRD資訊例項C知道塊的最新副本在例項C中,並要求持有例項C將CR塊傳送給例項A。
3.例項C通過私網將CR塊傳送給例項A。
可能上面的例項讀起來有點繞,我們通過下面的表格可以更加容易的閱讀每個場景。

Oracle RAC Cache Fusion 系列十三:PCM資源訪問



來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/28218939/viewspace-2654391/,如需轉載,請註明出處,否則將追究法律責任。

相關文章