日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

Oracle buffer状态深入剖析

發布時間:2025/3/20 编程问答 30 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Oracle buffer状态深入剖析 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
這篇文章是參考甲骨論老相老師的教學視頻:
http://v.youku.com/v_show/id_XMzkyMjA4NDM2.html
所做學習筆記

1. 什么是buffer
之前提過很多次啦, 其實在oracle數據文件中最小的單位就是block, 而用戶讀取block數據時,oracle就會將block的數據放入緩存,那么緩存中對應block的單位就叫buffer了, block的大小與buffer大小是一樣的.


2. 關于buffer的動態數據字典x$dh
????????? Oracle有一個動態視圖x$dh, 里面有很多個數據行, 其中每個數據行對應buffer_cache里的每1個buffer..

????????? x$bh里有很多列, 這次我們重點講解幾個重要的字段啦:
SQL> desc x$bh
?Name?? ??? ??? ??? ??? ??? Null???? Type
?----------------------------------------- -------- ----------------------------
?ADDR?? ??? ??? ??? ??? ??? ???? RAW(8)
?INDX?? ??? ??? ??? ??? ??? ???? NUMBER
?INST_ID?? ??? ??? ??? ??? ???? NUMBER
?HLADDR ?? ??? ??? ??? ??? ???? RAW(8)
?BLSIZ?? ??? ??? ??? ??? ??? ???? NUMBER
?NXT_HASH?? ??? ??? ??? ??? ???? RAW(8)
?PRV_HASH?? ??? ??? ??? ??? ???? RAW(8)
?NXT_REPL?? ??? ??? ??? ??? ???? RAW(8)
?PRV_REPL?? ??? ??? ??? ??? ???? RAW(8)
?FLAG?? ??? ??? ??? ??? ??? ???? NUMBER
?FLAG2?? ??? ??? ??? ??? ??? ???? NUMBER
?LOBID?? ??? ??? ??? ??? ??? ???? NUMBER
?RFLAG?? ??? ??? ??? ??? ??? ???? NUMBER
?SFLAG?? ??? ??? ??? ??? ??? ???? NUMBER
?LRU_FLAG?? ??? ??? ??? ??? ???? NUMBER
?TS#?? ??? ??? ??? ??? ??? ???? NUMBER
?FILE#?? ??? ??? ??? ??? ??? ???? NUMBER
?DBARFIL?? ??? ??? ??? ??? ???? NUMBER
?DBABLK ?? ??? ??? ??? ??? ???? NUMBER
?CLASS?? ??? ??? ??? ??? ??? ???? NUMBER
?STATE?? ??? ??? ??? ??? ??? ???? NUMBER
?MODE_HELD?? ??? ??? ??? ??? ???? NUMBER
?CHANGES?? ??? ??? ??? ??? ???? NUMBER
?CSTATE ?? ??? ??? ??? ??? ???? NUMBER
?LE_ADDR?? ??? ??? ??? ??? ???? RAW(8)
?DIRTY_QUEUE?? ??? ??? ??? ??? ???? NUMBER
?SET_DS ?? ??? ??? ??? ??? ???? RAW(8)
?OBJ?? ??? ??? ??? ??? ??? ???? NUMBER
?BA?? ??? ??? ??? ??? ??? ???? RAW(8)
?CR_SCN_BAS?? ??? ??? ??? ??? ???? NUMBER
?CR_SCN_WRP?? ??? ??? ??? ??? ???? NUMBER
?CR_XID_USN?? ??? ??? ??? ??? ???? NUMBER
?CR_XID_SLT?? ??? ??? ??? ??? ???? NUMBER
?CR_XID_SQN?? ??? ??? ??? ??? ???? NUMBER
?CR_UBA_FIL?? ??? ??? ??? ??? ???? NUMBER
?CR_UBA_BLK?? ??? ??? ??? ??? ???? NUMBER
?CR_UBA_SEQ?? ??? ??? ??? ??? ???? NUMBER
?CR_UBA_REC?? ??? ??? ??? ??? ???? NUMBER
?CR_SFL ?? ??? ??? ??? ??? ???? NUMBER
?CR_CLS_BAS?? ??? ??? ??? ??? ???? NUMBER
?CR_CLS_WRP?? ??? ??? ??? ??? ???? NUMBER
?LRBA_SEQ?? ??? ??? ??? ??? ???? NUMBER
?LRBA_BNO?? ??? ??? ??? ??? ???? NUMBER
?HSCN_BAS?? ??? ??? ??? ??? ???? NUMBER
?HSCN_WRP?? ??? ??? ??? ??? ???? NUMBER
?HSUB_SCN?? ??? ??? ??? ??? ???? NUMBER
?US_NXT ?? ??? ??? ??? ??? ???? RAW(8)
?US_PRV ?? ??? ??? ??? ??? ???? RAW(8)
?WA_NXT ?? ??? ??? ??? ??? ???? RAW(8)
?WA_PRV ?? ??? ??? ??? ??? ???? RAW(8)
?OQ_NXT ?? ??? ??? ??? ??? ???? RAW(8)
?OQ_PRV ?? ??? ??? ??? ??? ???? RAW(8)
?AQ_NXT ?? ??? ??? ??? ??? ???? RAW(8)
?AQ_PRV ?? ??? ??? ??? ??? ???? RAW(8)
?OBJ_FLAG?? ??? ??? ??? ??? ???? NUMBER
?TCH?? ??? ??? ??? ??? ??? ???? NUMBER
?TIM?? ??? ??? ??? ??? ??? ???? NUMBER
?CR_RFCNT?? ??? ??? ??? ??? ???? NUMBER
?SHR_RFCNT?? ??? ??? ??? ??? ???? NUMBER


3. Buffer 的 state (就是上面的state 字段啦)
查看當前的狀態, 如下圖 只有3個值..


每種值的意思如下面表

?? ? ? 0, FREE, no valid block image??
? ????? 1, XCUR, a current mode block, exclusive to this instance
? ?? ???2, SCUR, a current mode block, shared with other instances
? ?? ???3, CR,? ?a consistent read (stale) block image--表明此塊存在于回滾段中
????????4, READ, buffer is reserved for a block being read from disk
? ?? ???5, MREC, a block in media recovery mode
? ?? ???6, IREC, a block in instance (crash) recovery mode


下面解釋這幾種狀態意思

3.1?? Free
????????? 就是未被使用過的buffer啦, 好容易理解~

3.2?? XCUR
????????
字面意思就是當前實例獨享的當前模式塊, 其中重點要留意current的意思.


?????? 如上圖 當1個server process要讀取dbf文件中的1個block時,必然會將這個block數據放入buffer cache中, 那么buffer cache里那個對應buffer就被占用了, 狀態的就成了為current.

?????? CUR狀態的buffer肯定有1個dbf文件文中的中的block與其對應的.
??????
?????? 在單實例里, CUR狀態的buffer肯定就是XCUR,因為不可能被其他實例共享啦.

3.3 ? SCUR
????? 字面意思就是與其他實例共享的CUR狀態的buffer, 在RAC集群數據庫會出現這種block, 老相老師視頻里沒有深講,以后再補充了.
????? 個人猜測因為RAC是有個多個實例的, 也就代表有多個SGA, 也就是多個Buffer cache,? 既然其中1個buffer cache有了這個CUR的buffer,? 其他實例的Buffer cache就沒必要重復了, 可以共享給其他實例的server process訪問?


3.4 ? CR
?????? 當1個CUR buffer被其中1個server process修改, 但是并沒有提交. 如果下一個server process訪問這個buffer時,就會形成臟讀了.
?????? 為了避免這種情況, 下1個server process發現要訪問的CUR buffer已被其他server process修改后而未提交時,就會在buffer cache里申請多1個空間, 復制1個修改前的buffer 鏡像, 這個buffer 就叫做CR塊.

如下圖, 當buffer cache里的1個buffer被修改且未提交時, 下個buffer是不能訪問的.

?



?????? 這時Server process B會申請1個新的buffer空間, 復制要訪問的buffe到1個新的空間,? 但是還要把這個buffer修改后的數據還原回去.? 這時,重做日志就發揮作用了, 因為server process A修改數據后即使沒有提交, 但是一樣會產生重做日志的, server process B就會利用這些重做日志, 改動回滾, 就形成1個新的CR塊了. 如下圖:
??????


要注意如下幾點:
?????? 1. 上面提到1個CUR塊是與1個數據文件中的block一一對應的,? 而CR塊作為鏡像,是沒有dbf中的block與其對應..
?????? 2. 也就是說對與dbf文件中1個block來講,只會存在1個CUR塊.
?????? 3. Server process只能對CUR buffer作修改, 而不能修改CR塊.

????? 也就是說對于1個同1行數據不能有兩個session同時修改,?? 假如1行數據的值是x ,其中1個會話執行x+y,? 另1個同時執行x+z,這時會話1先提交, 那么值就變成x+y了.? 但是會話2再提交時, 值變成x+z了,? 所以最后丟失了y的數據.
?

3.5 ? READ
????? 這個也很容易理解,? 就是正在讀取當中的狀態啦, 因為從dbf文件中1個block讀取數據到buffer cache里的1個buffer時, 會發生物理IO, 假如這個過程需要10毫秒, 那么在這10毫米中這個buffer狀態就是READ.

3.6 ? XREC
????
這個buffer 處于介質恢復狀態中.

3.7 ? IREC
????
這個buffer 處于實例恢復狀態中.
????? 關于XREC和IREC狀態以后再詳細討論,? 在Oracle正常使用中是不會出現這兩種狀態的buffer的.


4. 做個例子啦
???
步驟1:首先查看一下HR.CL_DEPT這張表, 有6行數據啦~
????



???? 步驟2:? 跟住清空buffer_cache里的數據, 注意在生產中執行這個動作很危險, 因為跟住就會有大量的物理IO了.
?
?????? 步驟3:? 執行下面sql語句, 能查詢某個數據庫 對象的buffer占用狀態:
select o.object_name,
?????? decode(state, 0, 'free', 1, 'xcur' , 2, 'scur', 3, 'cr',
???????????????????? 4, 'read', 5, 'mrec' , 6, 'irec', 7, 'write',
???????????????????? 8, 'pi') as state,
?????? count(1) blocks
from x$bh b, dba_objects o
where b.obj = o.data_object_id
? and o.object_name = 'CL_DEPT'
? and o.owner = 'HR'
group by o.object_name, state
order by blocks desc;

?執行一下:
?

可以見到這個表還占用5個buffer ,但是狀態是free的, 所以這個5個buffer是沒有數據的.
那為什么會占住5個free呢, 是因為我們剛才select過一次, 即使執行清空buffer cache,但是在CRC鏈區可能還存在buffer的頭部信息指向, 但是buffer數據就的確被清空了.

隔2分鐘再看一次:


發現只占用4個free了, 所以CRC鏈里的信息也會慢慢清除的.

?
步驟4: 進行select 操作, 然后再查看buffer狀態
首先select一下這個張表, 因為buffer里并沒有這張表的緩存,所以會發生物理IO啦:


這時查看buffer狀態:


見到6個 xcur buffer了, 也說明有6個block的被寫入到buffer cache里面

步驟5: 用當前session (SYS 帳號)修改一條數據, 但并不提交



步驟6: 用另1個session (scott 帳號)查看這張表, 看到的是修改前的數據


步驟7: 只所以會見到修改前的數據, 是因為構造了CR塊啦!
?
?
?步驟8: SYS這個session提交修改, 然后scott 在查看1次表, 見到修改后的數據.



?
?

?步驟9: 再查看buffer 狀態
發現CR 塊并不會馬上消失哦

? ? ?
?

總結

以上是生活随笔為你收集整理的Oracle buffer状态深入剖析的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。